Покер на С

Тема в разделе "Общие вопросы по С и С++", создана пользователем BadMinus, 3 сен 2007.

Статус темы:
Закрыта.
  1. BadMinus

    BadMinus Гость

    Я только начинаю программить и вот у мен задача.
    1. Я написал код чтобы тасовало колоду и раздавало первые 5 карт. После этого пишется какая комбинация. Хотел спросить как можно лучше и грамотней это написать?
    Вот мой пример.
    Код (Text):
    #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:
     
  2. mms

    mms Гость

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

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

    BadMinus Гость

    "алгоритм оценки руки"

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

    mms Гость

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

    К примеру.

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

    pashqa Гость

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

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    pashqa, теме полтора года
     
Загрузка...
Статус темы:
Закрыта.

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