Доброго всем времени суток.
Предлагаю Вашему вниманию покерную программу, которая сдает карты одному игроку и оценивает ценность комбинации карт в бальной системе. Моей целью не было в точности воспроизвести покерную игру и, возможно, я не правильно ввел оценку покерных комбинаций. Моей целью было понять сам принцип работы. Далее я планирую подключить еще одного игрока и сравнивать у кого карта лучше. Так же хочу подключить возможность сброса карт и замену их на другие из колоды.
#include <stdio.h> #include <stdlib.h> #include <time.h> void shuffle (int [][13]); void deal(const int [][13], const char *[], const char *[], int wMass1 [][6]); void printingCards(int [][6], const char *[], const char *[]);//функция печати карт на руках void value (int [][6], int []);//функции определения состава сданных карт int valuation(int [][6], int [], const char * wFace [13]);//функции определения ценности сданных карт char flesh (int wMass1[][6], int wPair1[], const char * wSuit [4]);//функции определения наличия\отсутствия флеш int result(int , char); // результат обсчета покерной комбинации void sorting (int [][6]);//функция сортировки карт int main () { const char * suit [4] = {"Hearts", "Diamonds", "Clubs", "Spades"};//Масти const char * face [13] = {"Ace", "Deuce", "Three", "Four",//Номинал "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Jack", "Queen", "King"}; int deck [4] [13] = {0}; int Mass1 [2][6] = {0};//, 2, 2, 2, 0, 2, //0, 0, 1, 2, 9, 9};// сданные карты int pair1[14] = {0};// массив для определения ценности розданных карт srand (time(NULL)); shuffle(deck); deal(deck, face, suit, Mass1); printf("\n\n"); sorting(Mass1); printingCards(Mass1, face, suit); value (Mass1, pair1); int res = result(valuation(Mass1, pair1, face), flesh(Mass1, pair1, suit)); printf("\nres\t=\t%d\n", res); return 0; } void shuffle (int wDeck [][13]) { int card, row, column; for (card = 1; card <= 52; card++) { row = rand () % 4; column = rand () % 13; while (wDeck [row][column] != 0) { row = rand () % 4; column = rand () % 13; } wDeck [row][column] = card; } } void deal (const int wDeck [][13], const char *wFace [ ], const char *wSuit [ ], int wMass1 [][6]) { int card, row, column; for (card = 1; card <= 5; card++) { for (row = 0; row <= 3; row++) { for(column = 0; column <= 12; column++) if (wDeck [row][column] == card) { //printf("%5s of %-8s%c", wFace [column], wSuit [row], // '\n'); wMass1 [0][card] = row;//Масти wMass1 [1][card] = column; //Номинал } } } } void sorting(int wMass1[][6])//ФУНКЦИОНИРУЕТ //сортировка элементов { void swap (int *element1Ptr, int *element2Ptr);//Замена элементов for (int i = 1; i < 6; i++) { for (int j = 5; j > i; j--) { if (wMass1[1][j] < wMass1[1][j - 1]) { swap (&wMass1[1][j], &wMass1[1][j - 1]); swap (&wMass1[0][j], &wMass1[0][j - 1]); } } } } void swap (int *element1Ptr, int *element2Ptr) //ФУНКЦИОНИРУЕТ { int temp; temp = *element1Ptr; *element1Ptr = *element2Ptr; *element2Ptr = temp; } void printingCards(int wMass1[][6], const char *wFace[], const char *wSuit[])//ФУНКЦИОНИРУЕТ { int face = 0, suit = 0; for (int i = 1; i < 6; i++) { face = wMass1 [1][i]; suit = wMass1 [0][i]; printf("%5s of %-8s%c", wFace [face], wSuit [suit], '\n'); } } /*В этой функции осуществляется поиск совпвдений карт 1. в переменную tmp вношу 1-е значение массива wMass1 (номинал карты), он же будет индексом для массива wPair1 - wPair1[tmp] = 1, т. к. есть такая карта. 2. при выполнении условия wMass1 [1][k + 1] == wMass1 [1][k] (совпадение номиналов карт) wPair1[tmp]++ , т. к. есть еще одна такая карта*/ void value(int wMass1[][6], int wPair1[14])//функция где происходит всякая херня // пары отрабатываются нормально!!!!! //на тузах хреновая сработка(решено!!!!!!!!) //тройки не определяются (решено!!!!!!!!) //четверки сбрасываются на пары (решено!!!!!!!!) { int tmp; for (int k = 1; k <= 5; k++) { //vvvvvvvvvvvvkk tmp = wMass1 [1][k]; wPair1[tmp] = 1; for (int i = k; i <= 5; i++) { if ((i <= 4) && (wMass1 [1][i + 1] == wMass1 [1][i]))// wMass1 [1][i] - НОМИНАЛЫ { wPair1[tmp]++; } else { k = i; break; } } } printf("\n\n"); } int valuation(int wMass1[][6], int wPair1[], const char * wFace [13])//функции определения ценности сданных карт { // Бальная система оценки карт: пара - 1; две пары - 2; тройка - 3; стрит - 4; // флеш - 5; фулл хаус - 6; каре - 7; флеш + стрит - 8; флеш - роял - 9. int points = 0, counter = 0; for (int j = 0; j <= 12; j++) { if (wPair1[j] != 0) { //printf("%s\t=\t%d\n",wFace[j], wPair1[j]); } } for (int i = 0; i <= 12; i++) { //vvvvvvvvvvvvvvv //////////////////////////////////////////////////// if (wPair1[i] == 2) { points = points + 1; //обработчик пары (двух пар) for (int k = i + 1; k < 13; k++) //обработчик фулл хауса { if (wPair1[k] == 3) { points = 6; break; } if (wPair1[k] == 2)//обработчик двух пар { points = 2; break; } } break; } /////////////////////////////////////////// if (wPair1[i] == 3) //обработчик тройки { points = points + wPair1[i]; for (int l = i + 1; l < 13; l++) //обработчик фулл хауса { if (wPair1[l] == 2) { points = 6; break; } } break; } ////////////////////////////////////////////////// if (wPair1[i] == 4) //обработчик каре () { points = 7; //printf("points!!! = %d", points); break; } if ((wPair1[i] == 1 && wPair1[i + 1] == 1 && wPair1[i + 2] == 1 && wPair1[i + 3] == 1 && wPair1[i + 4] == 1) || (wPair1[0] == 1 && wPair1[12] == 1 && wPair1[11] == 1 && wPair1[10] == 1 && wPair1[9] == 1))//обработчик street { points = 4; break; } } //printf("\npoints\t=\t%d\n", points); return points; } //vvvvvvvvvvvvvvv ///////////////////РЕШЕНО!!!!! char flesh (int wMass1[][6], int wPair1[], const char * wSuit [4])//функции определения наличия\отсутствия флеш { char flag = 1; int i = 1, tmp = wMass1 [0][i]; for (i; i < 6; i++) { if (wMass1[0][i] == tmp) { continue; } else { flag = 0; break; } } //printf("\nflag\t=\t%d", flag); return flag; } int result(int wValuation, char wFlesh) // результат обсчета покерной комбинации { int points = 0; if (wValuation == 4 && wFlesh == 1) { points = 8; } else if (wFlesh == 1) { //printf("\npoints\t=\t%d\n",valuation(Mass1, pair1, face)); //printf ("\nflesh\t=\t%d\n", flesh(Mass1, pair1, suit)); points = 5; } else { points = wValuation; } return points; }
