Пилю программку по обсчёту китайского покера

Последний пост:26.11.2023
22
1 2 3 4 22 42 114
  • Всем привет!
    Поигрываю в китайский, но всегда интересовало точное решение. В связи с этим запустил C++ Builder и решил немного поиграться.
    Так как не запускал его достаточно давно, пропустил переход С++ на С++ 11 (и тем более 14). Но, делать нечего, пока поработаем на старом.
    Конкретно эту тему решил завести для того, чтобы отслеживать, что получилось, а что нет. Так как выбранную логику по мере обкатки приходится переписывать чуть ли не заново, здесь я буду вести учёт своим успехам\неудачам(под новую логику приходится переписывать весь код и один раз я уже забыл, как работает предыдущий )
    Итак, версия 1.0
    - Колода и рука представляют собой символьные строки. (Мастей нет)
    - любая линия(5ти или 3ех карточный набор) представляет из себя какую-либо комбинацию(2 пары, старшая карта и т.д.)
    - Ход осуществляется как выборка 3ёх произвольных карт из колоды и нахождения совокупности всех возможных раскладов по линиям.
    Ну, тут какие достижения. 2 подьёма прожка считает за секунды, 3 подьёма уже за около 4 минут.
    Ясно, что посчитать на ней стартовый расклад не удастся(да там и памяти не хватит)
    Версия 2.0 (в работе)
    - для комбинаций введён ранг(старшинство при сравнении одинаковых по значению). Мастей по-прежнему нет
    - для стартового набора введено понятие потенциала(для 2ух линий это все возможные руки, где комбинация внизу существует и старше комбинации выше).
    - также на каждом подьёме считается вероятность собрать фантазию.
    - на каком-либо подьёме придётся сделать выбор: сделать упор на сбор фантазии ИЛИ сосредоточиться на "сборе" очков. В конечном итоге это будет тоже самое ЕВ, но можно будет сделать отсечку вручную
    Планируется
    - для класса "рука" ввести функцию (метод) проверки "жива ли рука"
    - Жёстко связать колоду и руку игрока(руки игроков). Сейчас они связаны вручную.

    Ну, и наконец пример. Как логика на стадии проектирования даёт сбой. Я уже писал, что мастей пока нет. Но нет также и истории развития партии. Как планировалось определить лучшее разложение, ну скажем, 3его подьёма? Планировалось найти все варианты завершения руки, вернуться обратно и в отсортированном массиве найти 2 карты и 2 места, куда их следует положить. Однако, так как истории нету, то возможность отличить, на 2ом подьёме положена 7ка или на 5ом нет(ведь это могла быть 7ка, которую мы положили, а может быть вновь пришедшая, если мы в рассматриваемом подьёме её сбросили). Соответственно, и возвращаться некуда.
    Буду благодарен за вашу подсказку, как решить эту проблему.
    Пока на ум приходит только каждую руку рассматривать как {разложение стартового набора} +..+{разложение i-ого набора}
    Вот только не придётся ли в итоге всё равно перейти к просто руке, неважно каким именно путём она была собрана.
    Да, и пример.
    Для данной руки я считал расклад с наибольшим ЕВ



    пришли сброшены
    ясно, что можно положить либо туз вниз для стрита, либо надеяться собрать 2пары+ на
    ЕВ туз вниз получилось 1.57 очка
    ЕВ тув в топ - 0.64
    Если кто подтвердит цифры, буду премного благодарен.
    1/741
    Ответить Цитировать
    3
  • Продолжаем поиск оптимального разложения старта...пока, правда, на бесконечной колоде, но этот расчёт понадобится, чтобы было с чем сравнивать.
    И сразу возникла забавная ситуация, пришлось даже искать "ошибку"...
    Казалось бы, расклады
    и
    _______ равноценны по ЕВ(точнее по шансам собрать фантазию QQ+ в топ)
    Но нет, выяснилось, что собрав или в мидл, в первом варианте нас устроят или пара старше вниз, а во втором - только (ну, и опять же пара старше)
    По-прежнему стоит задача сохранить историю "ходов", то есть, грубо говоря, хранить информацию, какая карта на каком подъёме была положена на ту или иную линию. Может кто подсказать? Пока какие-то громоздкие варианты в голову лезут
    2/741
    Ответить Цитировать
    1
  • Так, промежуточные итоги по обсчёту стартера.
    Для выходит

    ,
    а для уже


    Может кто-нибудь привести правильный расклад?
    3/741
    Ответить Цитировать
    0
  • Второй расклад - это бред сумасшедшего.
    1/18
    Ответить Цитировать
    11
  • St_CasTieL, благодарю

    Удалось найти ошибку(опечатку)
    Теперь оба расклада прога кладёт "одинаково":


    и




    Считает около 6 минут(что достаточно затрудняет отладку, ну да ладно).
    Прошу кого-нибудь подкинуть расклад с точным решением.
    4/741
    Ответить Цитировать
    0
  • 5 вопрос отсюда https://forum.gipsyteam.ru/index.php?viewtopic=124886&view=findpost&p=5843438

    уверенно, всего за 3 минуты, положила



    видимо, не боится стрита старше.
    5/741
    Ответить Цитировать
    0
  • Цитата (БиллиУбили @ 15.1.2019)
    Теперь оба расклада прога кладёт "одинаково":


    есть подозрение, что она кладет их одинаково неправильно
    плюс, я так понимаю, привязки к картам оппонентов нет? а в этом случае прога бесполезна
    1/9
    Ответить Цитировать
    0
  • fergus_crowley,
    Цитата (fergus_crowley @ 15.1.2019)
    есть подозрение, что она кладет их одинаково неправильно

    Прошу тебя, дай стартер и 100% правильный расклад
    Цитата (fergus_crowley @ 15.1.2019)
    плюс, я так понимаю, привязки к картам оппонентов нет?

    почему нет? конечно же есть. Просто пока не включается, так как оппонентов нет
    6/741
    Ответить Цитировать
    2
  • Цитата (БиллиУбили @ 15.1.2019)
    Прошу тебя, дай стартер и 100% правильный расклад


    возможно, конечно, меня поправят старшие товарищи, но двойка в обоих случаях должна лежать внизу

    Цитата (БиллиУбили @ 15.1.2019)
    почему нет? конечно же есть.


    каким образом учитывается? допустим, в обоих случаях оппами заиграны две двойки, каким образом программа это учтет?
    2/9
    Ответить Цитировать
    1
  • fergus_crowley,
    Цитата (fergus_crowley @ 15.1.2019)
    каким образом учитывается? допустим, в обоих случаях оппами заиграны две двойки, каким образом программа это учтет?

    конкретно для стартера: 22 будут убраны из колоды, из которой проводится набор. Другое дело, что в программе используется упрощение: низ и середина заполняются независимо(подьём за подьёмом) друг от друга. ТО есть, о заигрывании 9 внизу мидл об этом "знать" не будет - он будет считать, что ему по-прежнему доступна колода с 9ой(но без двоек). Но это вызвано лишь невозможность точного расчёта: такое огромное кол-во комбинаций не обработать.
    Цитата (fergus_crowley @ 15.1.2019)
    возможно, конечно, меня поправят старшие товарищи, но двойка в обоих случаях должна лежать внизу

    Хороший вопрос. Но на текущий момент я исхожу из следующей гипотезы: на каком-то подьёме есть ЕВ очков, набранных на 2ух нижних линиях и есть ЕВфантазии. При каком-то ЕВ(своего для каждого подьёма?)очков становится малым по сравнению с ЕВфантазии и упор нужно сделать на неё(возможно, в ущерб очкам на 2ух нижних линиях). Конечно, иногда они пересекаются, например даму можно заиграть в стрит или флеш. Тут из двух зол надо выбирать меньшее - на то она и гипотеза, чтобы её проверить.
    7/741
    Ответить Цитировать
    1
  • Удивительным образом решилась проблема с подсчётом вероятности фантазии.
    Сначала я предполагал использовать ручные формулы с числом перестановок... но библиотечная функции для этих
    самых перестановок нет, а рекурсивная функция для факториала...ну, такая себе...спотыкается уже на 15
    почему-то заработал вот такой вариант
    //придёт N карт из колоды с М карт
    double abs_fantasy(int kings_top, int kings_left, int N, int M)
    {
    if(kings_top >= 2)
    return 1.0;
    if(N <= 0)
    return 0.0;
    //пришёл король
    return kings_left/(double)M*abs_fantasy(kings_top+1,kings_left-1,N-1,M-1)+
    //не пришёл король
    (M-kings_left)/(double)M*abs_fantasy(kings_top,kings_left,N-1,M-1);

    };

    то есть abs_fantasy(0, 3, 6, 44) = вероятность собрать не менее пары королей за 2 подьёма из 44 карт с 3 королями =
    = 0,0445
    Проверять не надо, я уже проверил по аналитической формуле
    8/741
    Ответить Цитировать
    0
  • Цитата (БиллиУбили @ 16.1.2019)
    рекурсивная функция для факториала...ну, такая себе...спотыкается уже на 15

    ну да...
    1/3
    Ответить Цитировать
    0
  • БиллиУбили, хорош хернёй заниматься, иди на завод.
    1/6
    Ответить Цитировать
    1
  • БиллиУбили, готов с тобой побороться. Ты пользуешься своей супер прогой, я бесконечной чуйко-прухой.

    В этой ветке должен быть только один талантливый математик, и ты явно не он
    1/10
    Ответить Цитировать
    3
  • Wall-e0605,
    Цитата (Wall-e0605 @ 16.1.2019)
    Ты пользуешься своей супер прогой, я бесконечной чуйко-прухой.

    Обязательно бахнем. И не раз. Но потомчуть попозже
    9/741
    Ответить Цитировать
    2
  • БиллиУбили, искренне желаю найти огромное количество адептов. Считай всем хорошо, ты прогу в массы, массы побеждать в румы, а я как обычно нажимать кнопку "сделать депозит"
    2/10
    Ответить Цитировать
    0
  • Дык у нас чааво , теперь два кулона чтоль?)
    2/18
    Ответить Цитировать
    1
  • Цитата (St_CasTieL @ 16.1.2019)
    Дык у нас чааво , теперь два кулона чтоль?)


    нужна очная ставка, какой кулон настоящий
    3/9
    Ответить Цитировать
    0
  • касательно c00l0ne...я так понял, программки у него нет(поправьте, если ошибаюсь). Посмотрел его стрим, буквально каждая раздача - гадание на кофейной гуще.

    пока что удалось посчитать вероятность собрать фантазию на QQ или КК. Но, увы, пока только при 3ёх свободных местах в топе. Продолжаю отладку...
    double abs_fantasy( int queens_top, int queens_left, int kings_top, int kings_left, int N, int M)
    {
    if(queens_top == 2 || kings_top == 2)
    return 1.0;
    if(N <= 0)
    return 0.0;
    if(queens_left == 0 && kings_left == 0)
    return 0.0;

    //bool v;


    //ничего не пришло
    return (1.0 - (queens_left+kings_left)/(double)M)*abs_fantasy(queens_top,queens_left,kings_top,kings_left,N-1,M-1)
    //пришёл король
    +kings_left /(double)M *abs_fantasy(queens_top,queens_left,kings_top+1,kings_left-1,N-1,M-1)
    //пришла дама
    +queens_left /(double)M *abs_fantasy(queens_top+1,queens_left-1,kings_top,kings_left,N-1,M-1);
    }

    При двух подьёмах из 15 карт с 3мя дамами и 3мя королями вероятность = 0,6056, что близко к Х2 от фантазии только на 3ёх королях.
    10/741
    Ответить Цитировать
    1
  • БиллиУбили, он сам программа.
    Зря ты так про гущу, он не простит. Это будет кровавая война, формулой по @балу на
    3/10
    Ответить Цитировать
    1
1 2 3 4 22 42 114
3 человека читают эту тему (3 гостя):
Зачем регистрироваться на GipsyTeam?
  • Вы сможете оставлять комментарии, оценивать посты, участвовать в дискуссиях и повышать свой уровень игры.
  • Если вы предпочитаете четырехцветную колоду и хотите отключить анимацию аватаров, эти возможности будут в настройках профиля.
  • Вам станут доступны закладки, бекинг и другие удобные инструменты сайта.
  • На каждой странице будет видно, где появились новые посты и комментарии.
  • Если вы зарегистрированы в покер-румах через GipsyTeam, вы получите статистику рейка, бонусные очки для покупок в магазине, эксклюзивные акции и расширенную поддержку.s