Программирование на C и C++

Онлайн справочник программиста на C и C++

poker

Аватар пользователя merkul40
пт, 02/09/2018 - 22:26 -- merkul40

Доброго всем времени суток.
Предлагаю Вашему вниманию покерную программу, которая сдает карты одному игроку и оценивает ценность комбинации карт в бальной системе. Моей целью не было в точности воспроизвести покерную игру и, возможно, я не правильно ввел оценку покерных комбинаций. Моей целью было понять сам принцип работы. Далее я планирую подключить еще одного игрока и сравнивать у кого карта лучше. Так же хочу подключить возможность сброса карт и замену их на другие из колоды.

#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;
        }