Покер (Техасский Холдем)

  • Автор темы Kvant
  • Дата начала
K

Kvant

Гость
#1
Пишу движок для игры в покер (разновидность - Техасский Холдем)

Возникла проблема:
Дано:
Перед каждой раздачей карт колода перебирается рандомом (тасуется) //проверено-работает
Почле сдачи 2 карт игрокам и сдачи всех 5 общих карт стола просчитывается наличие комбинаций у игроков, например стрит:
Код:
int isStraight(int allForUse[players][7],int k){


int count=0;
int flag=-1;
int i;

for(i=0;i<3;i++)
if(cut(allForUse[k][i])-cut(allForUse[k][i+1])==1)
if(cut(allForUse[k][i+1])-cut(allForUse[k][i+2])==1)
if(cut(allForUse[k][i+2])-cut(allForUse[k][i+3])==1)
if(cut(allForUse[k][i+3])-cut(allForUse[k][i+4])==1){
flag=allForUse[k][i];
/*cout << "straight find on player # " << k<<endl;
cout <<"His Hand: ";
for(int v=0;v<7;v++)
cout << allForUse[k][v] << " ";
cout<<endl;*/
break;

}
return flag;

}
Вызов и обработка:

Код:
int str8=-1;
int	flush=-1;

for(int h=0;h<players;h++){
str8=isStraight(allForUse,h);
flush=isFlush(allForUse,h);

if (str8!=-1){

cout << "straight find on player # " << h <<endl;
cout <<"His Hand: ";
for(int v=0;v<7;v++)
cout << allForUse[h][v] << " ";
cout<<endl;
cout <<"High card is: " << str8 << endl;
}

if (flush!=-1){

cout << "Flush find on player # " << h <<endl;
cout <<"His Hand: ";
for(int v=0;v<7;v++)
cout << allForUse[h][v] << " ";
cout<<endl;
cout <<"Sum Flush = " << flush << endl;
}	
}
Стриты обсчитываются чётко, ф-ия возвращает старшую карту стрита.

Возникла проблема с флашами. Ф-ия по структуре аналогичная:

(Карты в колоде закодированы интами по принципу XYY, где Х- номер масти от 0 до 3, YY - достоинсто карты от 0 до 12 (от двойки до туза)

Ф-ия int cut(int card) возвращает достоинство карты без масти.

Код:
int isFlush(int allForUse[players][7],int k){


int count[4]={0,0,0,0};
int flag=-1;
int i;

for(i=0;i<7;i++){
if(allForUse[k][i]<100)
count[0]++;

if((allForUse[k][i]<200)&&(allForUse[k][i]>=100))
count[1]++;

if((allForUse[k][i]<300)&&(allForUse[k][i]>=200))
count[2]++;

if(allForUse[k][i]>=300)
count[3]++;

}
for(int j=0;j<4;j++)
if(count[j]>=5){

flag=0;
for(int l=0;l<7;l++)
if((allForUse[k][l]>=j*100)&&(allForUse[k][l]<(j+1)*100))
flag=flag+cut(allForUse[k][l]);

cout <<endl;

cout << "Flush find on player # " << k <<endl;
cout <<"His Hand: ";
for(int v=0;v<7;v++)
cout << allForUse[k][v] << " ";
cout<<endl;
}


return flag;

}
ПРОБЛЕМА:
Ф-ия определения Флаша верно определяет Флаш и возвращает сумму карт флаша (для определения старшего флаша если у нескольких игроков есть флеши по одной масти), НО ОНА НЕ ПОРЕДЕЛЯЕТ ФЛЕШ У ОДНОГО ИЗ ИГРОКОВ (например, если задать кол-во игроков (players) =2 то флеши определяются только у второго игрока. Если 3, то у третьего и иногда первого, но никогда у второго итд. Проверялось на нескольких сотнях флешей.

Помогите пожалуйста разобраться в чем дело? Что не так?
 
K

kr0k

Гость
#2
А вы уверены что cpp это оптимальный выбор языка?
Это я так к слову, просто мне немножко лень было читать доскональна код, уж очень он плохо читается.
Если ответ утвердительный, то завтра гляну...просто по этому отрывку сложновато понять логику.