
Доброго всем времени суток.
Предлагаю Вашему вниманию покерную программу, которая сдает карты одному игроку и оценивает ценность комбинации карт в бальной системе. Моей целью не было в точности воспроизвести покерную игру и, возможно, я не правильно ввел оценку покерных комбинаций. Моей целью было понять сам принцип работы. Далее я планирую подключить еще одного игрока и сравнивать у кого карта лучше. Так же хочу подключить возможность сброса карт и замену их на другие из колоды.
#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;
}