Покер на С

  • Автор темы BadMinus
  • Дата начала
Статус
Закрыто для дальнейших ответов.
B

BadMinus

Гость
#1
Я только начинаю программить и вот у мен задача.
1. Я написал код чтобы тасовало колоду и раздавало первые 5 карт. После этого пишется какая комбинация. Хотел спросить как можно лучше и грамотней это написать?
Вот мой пример.
Код:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void shuffle(int [][13]);
void deal(const int [][13], const char *[],
const char *[]);
void results(const int [][13], const char *[],
const char *[], int [13]);

int main () 
{
char *suit [4] = {"Hearts", "Diamonds",
"Clubs","Spades"};
char *face [13] = {"Ace","Deuce","Three","Four","Five",
"Six","Seven","Eight",
"Nine","Ten","Jack",
"Queen","King"};
int deck[4][13] = {0};
int res[18] = {0};



srand(time(NULL));

shuffle(deck);
deal(deck,face,suit);
results(deck,face,suit,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 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\n",
wFace[column],wSuit[row],
card % 2 == 0 ? '\n' : '\t');



}
void results(const int wDeck[][13], const char *wFace[],
const char *wSuit[],int wRes[13])
{
int card, row, column,count;
count = 0;

for (card = 1; card <= 5; card++)

for (row = 0;row <= 3; row++)

for (column = 0; column <=12;column++)
if (wDeck[row][column] == card){
if (wFace[column] == "Ace")
wRes[1] += 1; 
if (wFace[column] == "Deuce")
wRes[2] += 1; 
if (wFace[column] == "Three")
wRes[3] += 1;
if (wFace[column] == "Four")
wRes[4] += 1; 
if (wFace[column] == "Five")
wRes[5] += 1; 
if (wFace[column] == "Six")
wRes[6] += 1; 
if (wFace[column] == "Seven")
wRes[7] += 1; 
if (wFace[column] == "Eight")
wRes[8] += 1; 
if (wFace[column] == "Nine")
wRes[9] += 1; 
if (wFace[column] == "Ten")
wRes[10] += 1; 
if (wFace[column] == "Jack")
wRes[11] += 1; 
if (wFace[column] == "Queen")
wRes[12] += 1; 
if (wFace[column] == "King")
wRes[13] += 1; 
if (wSuit[row] == "Hearts")
wRes[14] += 1; 
if (wSuit[row] == "Diamonds")
wRes[15] += 1; 
if (wSuit[row] == "Clubs")
wRes[16] += 1; 
if (wSuit[row] == "Spades")
wRes[17] += 1; 
}

for (column = 14; column <=17;column++)
if (wRes[column] == 5)	
printf("\nYou have a flash!");
for (column = 1; column <=13;column++){
if (wRes[column] == 1)
if (wRes[column + 1] == 1)
if (wRes[column + 2] == 1)
if (wRes[column + 3] == 1)
if (wRes[column + 4] == 1)
printf("\nYou have a street!");	}
printf("%d", wRes[1]);
printf("%d", wRes[2]);
printf("%d", wRes[3]);
printf("%d", wRes[4]);
printf("%d", wRes[5]);
printf("%d", wRes[6]);
printf("%d", wRes[7]);
printf("%d", wRes[8]);
printf("%d", wRes[9]);
printf("%d", wRes[10]);
printf("%d", wRes[11]);
printf("%d", wRes[12]);
printf("%d", wRes[13]);
for (column = 1; column <=13;column++)
if (wRes[column] == 5)
printf("\nYou have a care!");
for (column = 1; column <=13;column++)
if (wRes[column] == 3)
printf("\nYou have a three cards!");
for (column = 1; column <=13;column++)
if (wRes[column] == 2)
++count;
for (column = 1; column <=13;column++)
if (wRes[column] == 2){
printf("\nYou have a %d pair!", count);
break;
}


}
2. Следующая задача у меня состоит в том чтобы написать: Программа сдает компу и человеку по 5 карт и комп проверят какие у него карты и исходя из этого берет 1,2,3 карты вместо плохих.
Как это лучше написать каков алгоритм? Я не смог ничего не придумать лучше чем каждой комбинации давать кол-во очков. И если есть возможность более лучшей комбинации идет замена карт. Но всё равно для меня что то сложно.

Большое спасибо за ответы. Буду рад любой помощи.

ЗЫ И привет :ph34r:
 
M

mms

Гость
#2
1. Deal должен на входе иметь параметр сколько карт сдавать, на выходе должен иметь массив струкур описывающих сданные карты, т.е. с номером строки и столбца.
2. Должен быть счетчик оставшихся карт в колоде, т.е. если мы первый раз сдали 1-5 карт, то второй раз это уже должно быть 6-10 карт.
3. Сдаём 5 карт человеку.
4. Сдаём 5 карт компьютеру.ъ
5. Надо написать алгоритм оценки руки, тут уже в помощь должна идти соответсвующая литература по игре в покер, думаю можно найти несколько статей в интернете. Алгоритм должен сказать, какие карты надо заменить. Т.е. на входе алгоритм имеет набор карт, на выходе индексы карт который надо заменть в этом наборе. Сначала через него пропускаем карты игрока, потом компьютера.
6. Выбрасываем карты которые надо заменить и делаем дил на новые карты. У одного и другого.
7. Ищем победителя :ph34r: По комбинации это уже сделать не сложно.

Самое сложное тут, это написать хороший алгоритм оценки руки, и что нужно заменить :huh: Удачи :huh:
 
B

BadMinus

Гость
#3
"алгоритм оценки руки"

никак не могу найти алгоритм оценки. :)
 
M

mms

Гость
#4
"алгоритм оценки руки"

никак не могу найти алгоритм оценки. :)
Это не так просто как кажется. По игре в покер написаны сотни книг, и есть сотни стратегий, тут уж надо обращаться к профессионалу этого дела. Хотя для простейшего АИ можно и что-нить примитивное сделать.

К примеру.

Шаг 1. Определить силу руки (какая комбинация есть)
Шаг 2. Определить следущую по силе комбинацию.
Шаг 3. Поменять все карты которые не входят в часть следущей комбинации и в уже соществующую комбинацию
 
P

pashqa

Гость
#5
mms :)
Я тоже пишу покер(техасский холдем) на Visual C++ 6
и у меня та же проблема!!! Первой идеей было также
задать константы комбинациям и потом сравнивать их суммы...,
но код будет просто огроммным по моим меркам(начинающего),
повторю вопрос: КАК лучше организовать определение комбинации
у игрока\компютера и определение победителя?? ;)
BadMinus
Кода невидно!!!Повтори плз, очень интересно :) !!
 
Статус
Закрыто для дальнейших ответов.