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