Покер

Discussion in 'Машинное отделение' started by WildCat, 4 Dec 2006.

  1. TopicStarter Overlay

    WildCat Коршунов Игорь

    • Команда форума
    Member Since:
    04.05.2006
    Message Count:
    3.599
    Likes Received:
    4
    Репутация:
    0
    Location:
    Гомель
    Оффлайн
    Меня в последнее время заинтересовал покер (в основном техасский холдем).
    Может быть здесь найдутся те, кому будет интересно программирование покера? Оно в корне отличается от шахматного, т.к. позиция соперника (его карты) неизвестна.

    Пока у меня первый технический вопрос: как сравнить две руки (нашу и соперника)?
    Попутно нужно определится с представлением карт. Т.к. в колоде 52 карты, то напрашивается использовать битборды.

    Чтобы сравнить две руки можно каждой поставить в соответствие целое цисло (силу руки). Дальше просто сравниваем целые числа.

    Итак, задача: по заданным картам найти силу руки.

    Первое, что приходит в голову - искать комбинации по старшинству:
    - стрейтфлеш
    - каре
    - фуллхауз
    - флеш
    - стрейт
    - тройка
    - две пары
    - пара
    - нет комбинации

    Внутри комбинаций сила определяется по старшинству карт.

    Нужно придумать как это реализовать технически.

    Например, можно так определить есть ли у нас флеш:
    Code:
        BitCount(cards & ALL_SPADES)   >= 5 ||
        BitCount(cards & ALL_DIAMONDS) >= 5 ||
        BitCount(cards & ALL_HEARTS)   >= 5 ||
        BitCount(cards & ALL_CLUBS)    >= 5
    Есть слухи, что все комбинации (кроме флеша) можно посчитать заранее (т.е. скорость не критична) в таблицу 13^7 = 62748517 (около 120 мБ). Эту таблицу можно расчитывать при запуске программы.
  2. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Member Since:
    02.05.2006
    Message Count:
    6.811
    Likes Received:
    96
    Репутация:
    3
    Location:
    Санкт-Петербург
    Оффлайн
    Элементарно -
    В качестве параметров две руки.
    Для каждой руки определяется ранг комбинации (от 1 до 9) вызовом последовательно проверок на комбинации.
    Далее сверяется ранг рук. Если у одной выше, значит у неё лучше комбинация.
    Если ранг одинаков - то смотрятся доп. условия.

    Стоит наверно задача определить комбинацию как можно быстрее? Если просто определение - то никаких проблем быть не должно.
  3. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Member Since:
    02.05.2006
    Message Count:
    6.811
    Likes Received:
    96
    Репутация:
    3
    Location:
    Санкт-Петербург
    Оффлайн
    Отдельно храним для руки масти и номиналы (то есть отдельно нужно определять только Фреш-Стрит)
    На семи картах сочетаний мастей 4^7 (берем с запасом, если масти отсортировать, то число сочетаний 10!/7!/3!=120), Для определения факта флеша (все карты одной масти) нужен битовый массив на 2^14 бит
    - 2 Килобайта. (либо на 120 бит - 15 байт :) )

    Для определения ранговых комбинаций - число сочетаний номиналов по семи картам (k+n-1!)/n!/(k-1)! (13+7-1)!/7!/12!=19!/7!/12!=50388 Комбинаций, откуда взяты цифры в сотни мегабайт - абсолютно непонятно :)
  4. TopicStarter Overlay

    WildCat Коршунов Игорь

    • Команда форума
    Member Since:
    04.05.2006
    Message Count:
    3.599
    Likes Received:
    4
    Репутация:
    0
    Location:
    Гомель
    Оффлайн
    ессно

    Из твоего объяснения я так и не понял как вычислять индекс в таблице.
  5. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Member Since:
    02.05.2006
    Message Count:
    6.811
    Likes Received:
    96
    Репутация:
    3
    Location:
    Санкт-Петербург
    Оффлайн
    Так-же как и в шашках, идет сортировка от большего к меньшего, отличие только в том, что каждое следующее значение не больше предыдущего (в отличие от ЭБ, где каждое следующее значение меньше предыдущего) от этого немного меняется формула, и количество возможных значений. Расчет индекса в этой ветке напишу.
  6. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Member Since:
    02.05.2006
    Message Count:
    6.811
    Likes Received:
    96
    Репутация:
    3
    Location:
    Санкт-Петербург
    Оффлайн
    По порядку -
    for i1:= 1 to 13 do
    for i2:=i1 to 13 do
    for i3:=i2 to 13 do
    for i4:=i3 to 13 do
    for i5:=i4 to 13 do
    for i6:=i5 to 13 do
    for i7:=i6 to 13 do
    sch:=sch+1;
    50388 - то есть с количеством комбинаций не ошибся. :) (в подсчете не учитывается тот факт что не может быть больше четырех карт одного номинала - но это и не нужно)
  7. TopicStarter Overlay

    WildCat Коршунов Игорь

    • Команда форума
    Member Since:
    04.05.2006
    Message Count:
    3.599
    Likes Received:
    4
    Репутация:
    0
    Location:
    Гомель
    Оффлайн
    Вряд ли меня это обрадует. Хочется побыстрее, а память экономить в последнюю очередь.
  8. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Member Since:
    02.05.2006
    Message Count:
    6.811
    Likes Received:
    96
    Репутация:
    3
    Location:
    Санкт-Петербург
    Оффлайн
    Сортировка семи элементов - это "в среднем" пара десятков операций.
    Так-же можно использовать тот Факт что всего возможных значений 13 (сортировка по значению с вспомогательным массивом на 13 элементов) - так-же для сортировки необходимо всего пара десятков операций.
  9. Mustitz Заслуженный

    • Заслуженный
    • Участник
    • Старожил
    Member Since:
    30.09.2006
    Message Count:
    3.546
    Likes Received:
    1.265
    Репутация:
    36
    Location:
    Киев
    Оффлайн
    При оценки руки один из наиболее быстрых это Cactus Kev's Poker Hand Evaluator (правда только на пяти картах, эту идею надо распространить на семь карт).

    Описание достаточно сильного движка есть здесь.
  10. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Member Since:
    02.05.2006
    Message Count:
    6.811
    Likes Received:
    96
    Репутация:
    3
    Location:
    Санкт-Петербург
    Оффлайн
    Насчет оценки рук - Предварительное вычисление - минутное дело (всего возможных комбинаций около 50 тысяч), сама оценка - миллионы в секунду...
    Насчет силы движков - все авторы называют свои движки сильными, но часто оказывается что это просто грубый Пиар, не имеющий ничего общего с действительностью.
  11. TopicStarter Overlay

    WildCat Коршунов Игорь

    • Команда форума
    Member Since:
    04.05.2006
    Message Count:
    3.599
    Likes Received:
    4
    Репутация:
    0
    Location:
    Гомель
    Оффлайн
    Думаю что для начала можно реализовать что-то не особенно эффективное. А уж извращаться над оптимизацией (если она вообще понадобится) можно будет потом.

    Кстати, NS, как там у тебя с покером?
  12. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Member Since:
    02.05.2006
    Message Count:
    6.811
    Likes Received:
    96
    Репутация:
    3
    Location:
    Санкт-Петербург
    Оффлайн
    У меня хорошо. Я сейчас его пишу. (и паралельно срочно добиваю шашки)
    Сейчас как раз переписываю под массив определение силы рук по семи картам. :)

    У меня еще неделя вылетела - совсем слег, только вчера к вечеру начал понемногу ходить.
    Но уже половина пути пройдена - мучаться осталось недолго :)
  13. TopicStarter Overlay

    WildCat Коршунов Игорь

    • Команда форума
    Member Since:
    04.05.2006
    Message Count:
    3.599
    Likes Received:
    4
    Репутация:
    0
    Location:
    Гомель
    Оффлайн
    Значит оно уже как-то написано? Стоит ли переписывать? Может и так пока сгодится?
  14. Chemer Максим

    • Участник
    Member Since:
    14.09.2006
    Message Count:
    1.674
    Likes Received:
    13
    Репутация:
    0
    Location:
    Запорожье
    Оффлайн
    Сдался вам этот покер, преф на порядок лучше и интелектуальнее. Хотя я может быть фанат преферанса.
  15. TopicStarter Overlay

    WildCat Коршунов Игорь

    • Команда форума
    Member Since:
    04.05.2006
    Message Count:
    3.599
    Likes Received:
    4
    Репутация:
    0
    Location:
    Гомель
    Оффлайн
    Еще за бридж, чисто из любопытства, можно было бы взяться, но никак не преф.
    А покер намного лучше потому, что там бабок немеряно.
    К тому же покер считается психологической игрой. А это считается очень трудным для компьютера. Инересно так ли это ;)
  16. Chemer Максим

    • Участник
    Member Since:
    14.09.2006
    Message Count:
    1.674
    Likes Received:
    13
    Репутация:
    0
    Location:
    Запорожье
    Оффлайн
    В преф только на бабки и играют. И как правило немалые!
  17. WinPooh В.М.

    • Команда форума
    Member Since:
    13.02.2006
    Message Count:
    9.492
    Likes Received:
    3.122
    Репутация:
    95
    Location:
    Москва
    Оффлайн
    Кто знает, в какую силу играют нынешние покерные программы? На мой дилетантский взгляд, они должны показывать зверскую силу - игра-то за вычетом психологии (не действующей на компьютер) полностью сводится к теории вероятностей...
  18. TopicStarter Overlay

    WildCat Коршунов Игорь

    • Команда форума
    Member Since:
    04.05.2006
    Message Count:
    3.599
    Likes Received:
    4
    Репутация:
    0
    Location:
    Гомель
    Оффлайн
    Преф и покер - это совсем разные бабки :)
  19. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Member Since:
    02.05.2006
    Message Count:
    6.811
    Likes Received:
    96
    Репутация:
    3
    Location:
    Санкт-Петербург
    Оффлайн
    Вообще да, для менеджера быстро не надо - но уже поздняк дергаться :)
    Мне интересно стало :)
    В преф только на бабки и играют. И как правило немалые!

    Хочешь сравнить сколько денег в Покере, и сколько в Префе? :)
    Хочешь сравнить Количество скачиваний Покерных программ, и программ в Преф?
    Их стоимость?
    И я вот смотрю он-лайн Казино - вроде всё-таки в Техас Холдем играют, но никак не в преф.
    И Преф как минимум неинтересен. Он достаточно прост.
  20. TopicStarter Overlay

    WildCat Коршунов Игорь

    • Команда форума
    Member Since:
    04.05.2006
    Message Count:
    3.599
    Likes Received:
    4
    Репутация:
    0
    Location:
    Гомель
    Оффлайн
    Вроде есть одна, которая 1х1 умеет наравне с лучшими людьми играть. Но за обычным столом из 10 человек - таких похоже нет.
    Покер сводится к задаче из теории игр, причем размерность просто неподъемная для современных компьютеров.
    Теорией вероятности тут много не добьешься. Хотя попробовать можно.
  21. TopicStarter Overlay

    WildCat Коршунов Игорь

    • Команда форума
    Member Since:
    04.05.2006
    Message Count:
    3.599
    Likes Received:
    4
    Репутация:
    0
    Location:
    Гомель
    Оффлайн
    Вот здесь в посте от M_White Thu Nov 09, 2006 2:56 am:
    http://www.poker-academy.com/forums/viewtopic.php?t=4787
    описывается оценка силы руки на ассемблере. Выглядит интересно, правда я пока не особо вникал.
  22. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Member Since:
    02.05.2006
    Message Count:
    6.811
    Likes Received:
    96
    Репутация:
    3
    Location:
    Санкт-Петербург
    Оффлайн
    Достаточно того что приведены цифры - около 7 000 000 оценок в секунду.
    Нужно попытаться выйти на тот-же результат.
  23. TopicStarter Overlay

    WildCat Коршунов Игорь

    • Команда форума
    Member Since:
    04.05.2006
    Message Count:
    3.599
    Likes Received:
    4
    Репутация:
    0
    Location:
    Гомель
    Оффлайн
    Я все еще никак не решусь начать :)
    Хочется все продумать сперва. А у тебя уже есть на чем мерять скорость? И каковы результаты? Думаю надо выходить на скорость порядка нескольких десятков миллионов позиций в секунду. Ну это если, конечно, озаботится на скорости ;)
  24. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Member Since:
    02.05.2006
    Message Count:
    6.811
    Likes Received:
    96
    Репутация:
    3
    Location:
    Санкт-Петербург
    Оффлайн
    Надо озаботиться. Пока ничего не готово, только Форма с Картинками, и половина процедуры оценки рук.
    Хочу сделать самую быструю оценку рук :) , но сам алгоритм выбора лучшего действия еще до конца не продуман.
    приступать без готовых алгоритмов не хочется, я обычно сначала всё продумываю, а потом в последний момент срочно пишу :)
    И опять начал разбрасываться -
    Вчера написал программку
    http://kasparovchess.crestbook.com/viewtopic.php?pid=42385#p42385
    Срочно, к первому января нужно добивать шашки (а у меня еще не готова ОФ)
    Но сейчас пишу именно Покер.
  25. TopicStarter Overlay

    WildCat Коршунов Игорь

    • Команда форума
    Member Since:
    04.05.2006
    Message Count:
    3.599
    Likes Received:
    4
    Репутация:
    0
    Location:
    Гомель
    Оффлайн
    Вот что у меня получилось:
    Code:
    #define HIGH_CARD      0x100000
    #define PAIR           0x200000
    #define TWO_PAIRS      0x300000
    #define TRIPS          0x400000
    #define STRAIGHT       0x500000
    #define FLUSH          0x600000
    #define FULL_HOUSE     0x700000
    #define QUADS          0x800000
    #define STRAIGHT_FLUSH 0x900000
    
    typedef unsigned int uint;
    typedef unsigned __int16 uint16;
    typedef unsigned __int64 uint64;
    
    uint High5Bits[0x2000]; // ноль, если в индексе нет пяти бит
    uint High3Bits[0x2000];
    uint HighBit[0x2000];
    
    union Cards
    {
        uint64 all;
        struct
        {
            uint16 spades;
            uint16 hearts;
            uint16 diamonds;
            uint16 clubs;
        } suits;
    };
    
    int EvalHand(Cards *h)
    {
        uint code = High5Bits[h->suits.spades] | High5Bits[h->suits.hearts] | High5Bits[h->suits.diamonds] | High5Bits[h->suits.clubs];
    
        // стрейт-флаш
        if (code >= STRAIGHT) return code + (STRAIGHT_FLUSH - STRAIGHT);
    
        // считаем singles, pairs, trips, quads
        
        uint16 singles = h->suits.spades | h->suits.hearts;
    
        uint16 pairs = h->suits.spades & h->suits.hearts;
    
        uint16 trips = pairs & h->suits.diamonds;
        pairs   |= singles & h->suits.diamonds;
        singles |= h->suits.diamonds;
    
        uint16 quads = trips & h->suits.clubs;
        trips   |= pairs & h->suits.clubs;
        pairs   |= singles & h->suits.clubs;
        singles |= h->suits.clubs;
    
        // каре
        if (quads) return QUADS + HighBit[quads];
    
        // фулл-хауз
        if (trips)
        {
            int htrip = HighBit[trips];
            if (pairs & ~(1 << htrip)) return FULL_HOUSE + htrip;
        }
    
        // флаш
        if (code) return code + (FLUSH - HIGH_CARD);
    
        // стрейт
        code = High5Bits[singles];
        if (code >= STRAIGHT) return code;
    
        // сет (тройка)
        if (trips) return TRIPS + HighBit[trips];
    
        // пары
        if (pairs)
        {
            int hpair = HighBit[pairs];
            uint16 other_pairs = pairs & ~(1 << hpair);
    
            // две пары
            if (other_pairs) return TWO_PAIRS + 13 * 13 * hpair + 13 * HighBit[other_pairs] + HighBit[singles & ~((1 << hpair) | (1 << HighBit[other_pairs]))];
    
            // одна пара
            return PAIR + 13 * 13 * 13 * hpair + High3Bits[singles & ~pairs];
        }
    
        // нет комбинации
        return code;
    }
    Может и не самый быстрый, но для первого раза покатит.
    Осталось только сделать инициализацию массивов.

    NS! Делай оболочку (лишь бы правила знала) поскорее. Уже хочется отладить всю эту хрень.
  26. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Member Since:
    02.05.2006
    Message Count:
    6.811
    Likes Received:
    96
    Репутация:
    3
    Location:
    Санкт-Петербург
    Оффлайн
    Делаю - за выходные, если опять что-нибудь не случиться - должен отладить.
  27. TopicStarter Overlay

    WildCat Коршунов Игорь

    • Команда форума
    Member Since:
    04.05.2006
    Message Count:
    3.599
    Likes Received:
    4
    Репутация:
    0
    Location:
    Гомель
    Оффлайн
    Судя по всему здесь эта тема никому не интересна.
    Я сделал симуляцию раздач на 10 игроков. Результаты на геймдеве.
  28. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Member Since:
    02.05.2006
    Message Count:
    6.811
    Likes Received:
    96
    Репутация:
    3
    Location:
    Санкт-Петербург
    Оффлайн
    Я не смог прислать книгу - у тебя ящик переполнился.
  29. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Member Since:
    02.05.2006
    Message Count:
    6.811
    Likes Received:
    96
    Репутация:
    3
    Location:
    Санкт-Петербург
    Оффлайн
    Оба-на, вот это да.
    Это в каком-же состоянии я был, ежели не помню что такая ветка была на гостевой...
  30. Guest

    Member Since:
    Message Count:
    0
    Likes Received:
    0
    Репутация:
    0
    Оффлайн
    NS, если я читаю между строк правильно, Вы себя чуствуете лучше. Поздравляю! (ну и плюю через плечо и стучу по дереву).
  31. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Member Since:
    02.05.2006
    Message Count:
    6.811
    Likes Received:
    96
    Репутация:
    3
    Location:
    Санкт-Петербург
    Оффлайн
    Намного лучше. Только я практически ничего не помню из того что происходило эти пол-года.
  32. Guest

    Member Since:
    Message Count:
    0
    Likes Received:
    0
    Репутация:
    0
    Оффлайн
    Это ничего, у нас не все, но многое записано :)
  33. TopicStarter Overlay

    WildCat Коршунов Игорь

    • Команда форума
    Member Since:
    04.05.2006
    Message Count:
    3.599
    Likes Received:
    4
    Репутация:
    0
    Location:
    Гомель
    Оффлайн
    Я не перестаю поражаться насколько у NS веселая жизнь :)
  34. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Member Since:
    02.05.2006
    Message Count:
    6.811
    Likes Received:
    96
    Репутация:
    3
    Location:
    Санкт-Петербург
    Оффлайн
    Блин, вот в этом уже ничего веселого нет.
    Мало того что год жизни пропал, куча денег выкинута, да еще и не факт что вылечился...
    Хотя есть и плюсы :) Шашки умудрился в безсознательном состоянии написать, шахматы - правда их писал пока еще вменяемый был, но это с препугу что умру, а шахматной программы для потомков не оставлю :)
  35. TopicStarter Overlay

    WildCat Коршунов Игорь

    • Команда форума
    Member Since:
    04.05.2006
    Message Count:
    3.599
    Likes Received:
    4
    Репутация:
    0
    Location:
    Гомель
    Оффлайн
    Ну, у каждого свои понятия веселья. Для меня это измененные состояния сознания. Все остальное очень грустно.

Share This Page