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

Тема в разделе "Разработка игр и приложений к ним", создана пользователем Kvant, 21 май 2010.

  1. Kvant

    Kvant Гость

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

    Возникла проблема:
    Дано:
    Перед каждой раздачей карт колода перебирается рандомом (тасуется) //проверено-работает
    Почле сдачи 2 карт игрокам и сдачи всех 5 общих карт стола просчитывается наличие комбинаций у игроков, например стрит:
    Код (Text):
    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;

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

    Код (Text):
    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) возвращает достоинство карты без масти.

    Код (Text):
    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, то у третьего и иногда первого, но никогда у второго итд. Проверялось на нескольких сотнях флешей.

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

    kr0k Гость

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

Поделиться этой страницей