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

Последний пост:26.11.2023
22
1 2 3 4 22 42 114
  • Второй расклад - это бред сумасшедшего.
    Ответить Цитировать
    11
  • Цитата (c00l0ne @ 7.2.2020)
    Я вообще считаю что такие темы надо прикрывать... Очевидно чел пытается создать бота или подсказчик... Чтобы мошенническим путем бабки отбирать у народа...


    Цитата (c00l0ne @ 4.2.2020)
    епа ты ведешь себя как в дет саду , тебе слив века в руки попадает , а ты девочку моралистку включаешь


    Лол, бля!
    Ответить Цитировать
    6
  • БиллиУбили, да не, 2ке в топе самое место. трипс собрать можем - считай тоже фантазия
    Ответить Цитировать
    5
  • отберите у него грибы
    Ответить Цитировать
    4
  • БиллиУбили, готов с тобой побороться. Ты пользуешься своей супер прогой, я бесконечной чуйко-прухой.

    В этой ветке должен быть только один талантливый математик, и ты явно не он
    Ответить Цитировать
    3
  • Всем привет!
    Поигрываю в китайский, но всегда интересовало точное решение. В связи с этим запустил 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
    Если кто подтвердит цифры, буду премного благодарен.
    Ответить Цитировать
    3
  • Цитата (c00l0ne @ 2.1.2020)
    13 пар , 13 трипсов , 10 стритов , 154440 флешей(но нам не нужны все на самом деле ) , 10 стритфлешей, 13 карэ и рояль ...

    Близко, очень близко. Прям нос к носу идём ))

    Ладно, буду делать...всех с Наступившим!

    музыкальная пауза
    Ответить Цитировать
    3
  • Господи, как хорошо, что я гуманитарий.
    Ответить Цитировать
    3
  • Цитата (gurgen064 @ 6.3.2019)
    я не читал все, фактически листнул мельком, но у меня возник вопрос
    правильно ли я понимаю,что тс создает программу которая фактически будет работать как бот или подсказчик в китае? При этом это обсуждается на форуме где в принципе много раз поднимался вопрос о таких подсказчиках(ботах) их запрете и вреде для других игроков ?
    при этом 1)тс не боится быть забаненым на джипси, 2) тс не боится быть забаненым в руме
    Может я чет не вдупляю объясните мне


    А в чем конкретно претензия? ТС создает программу, которая будет (ну или он в это верит) делать расклады близкие к идеальным. Никто ей пользоваться во время игры его не заставляет, может он просто планирует использовать ее для тренировки. Как и ту, о которой рассказывал Джипси в своих стримах. Или вы предлагаете казнить ТС просто потому, что он занимается программированием в этой области?) Написание подобной программы очень нетривиальная задача, так что ТСу респект за усидчивость).
    Будет использовать ее во время игры - будет нарушать правила рума, тогда репортите его в СБ, пусть банят. А пока он занимается увлекательной зарядкой для мозгов с туманным выхлопом.
    Ответить Цитировать
    3
  • DmNass, хм.. а мне кажется, он наоборот продлевает жизнь ананасу своими расчетами)
    Ответить Цитировать
    3
  • Итак, господа, надо признать, что я ошибся. То, что я предполагал будет сложно посчитать(конкретно "путь" от незавершённой руки до завершённой) - считается легко. А вот сами успешные "завершения" - мало того, что их катастрофически много, так ещё и процесс их нахождения никак не оптимизировать: никуда от нахождения комбинаций в линиях и попарного их сравнения не деться. Об этом я в начале задачи и не помышлял. А, повторюсь, решал задачу заполнения руки за N подьёмов. Оказалось, что всё-таки не важно за сколько подьёмов и какими именно рука завершена - важно лишь её конечное состояние.
    Поэтому в споре с кулон я прав(или НЕ прав) наполовину: посчитать разложение 3-4подьёма с абсолютной точностью на домашнем компе невозможно.
    Но, что можно сделать, так это считать только нижнию линию(максимизировать набранные ею очки, либо минимизировать скуп). Но тогда фантазия будет так сказать "побочным продуктом": она либо уже будет лежать, либо наберётся сама по себе с неизвестными нами шансами.
    Сейчас я возьму маленький перерыв, чуток покатаю.
    А вы ставьте плюс, если такой инструмент вам нужен(я там добавлю флаш, если что)
    Ну, или ставьте минус, если у меня всё-равно ничего не получится ))
    В любом случае, спасибо за внимание!
    Ответить Цитировать
    3
  • чет вспомнилось))))

    Ответить Цитировать
    3
  • Цитата (БиллиУбили @ 13.4.2019)
    Тогда для данной колоды мы можем посчитать комбинации из 2 карт, приводящих к флашу, комбинации из 2 карт, приводящих к паре(АА, 1010 и т.д.), и комбинации из одной карты, тоже приводящие к паре(,, и т.д.)

    я не стал разделять комбинации из 2 карт и комбинации из одной карты. То есть, и сделал равноценными. Тогда для любого подьёма, вероятность закончить нижнюю линию() будет равна вероятности набрать хотя бы одну комбинацию из 2 карт А вот если мы на каком-то подьёме добавили карту вниз, то данный набор "теряет в размерности" и превращается в комбинации из строго одной карты. Так, комбинаций, приводящих к флашу для произвольной колоды(ну, завалялась какая-то) у меня получилось 21, к паре - 131. Однако, если мы кладём, например, , то 2ух карточные комбинации "вырождаются" в 1нокарточные и их число получается 6 для флаша и всего 5(!) для пары.
    Думаю, всё-таки получится посчитать вероятности собрать флаш или пару для произвольного подьёма без полного-полного перебора(при условии каждый подьём класть так, чтобы максимизировать ЕВ)
    ЗЫ так как мало кто пишет, прошу поставить плюс тех, кто следит за темой
    Ответить Цитировать
    2
  • Ты все таки хочешь понять, как получился этот массив? Но это не имеет практического значения, так как программа которая создает этот массив запускается только один раз и после всех расчетов (относительно длительных) сохраняет его на диске. В дальнейшем вы просто загружаете этот массив из диска в оперативку и извлекаете готовый ранг 5-ти карт из оперативки. Это самый быстрый способ узнать силу 5-ти карточной руки. Ни каких сортировок при этом не делается, никаких промежуточных проверок на флеш или стрит - ничего ресурсно-затратного. Просто пять обращений к массиву и на выходе ранг пяти карт. Причем в старших байтах этого ранга хранится информация о комбинации (фулл-хаус, флеш, стрит и т.д.), в младших - порядковый номер этой руки внутри комбинации.
    Если же все-таки хочешь сам разобраться, то рекомендую скачать исходник ( я давал ссылку выше). Я в свое время распечатал его и штудировал строчка за строчкой. Там много интересных программистских трюков, оптимальные методы сортировки, использование внешних библиотек для расчета ранга готовой руки... Но ты вряд ли сможешь это сам повторить, да и за чем изобретать велосипед.

    Но попробуй в двух словах - как это работает.
    Перебираете в цикле все возможные комбинации из 52-х карт - сначала однокарточные, потом двух-карточные и т.д. до 5-ти карточных. каждый раз сортируете полученные карты и проверяете встречалась ли вам ранее такая комбинация карт. Если не встречалась такая комбинация то присваиваете ей первый свободный адрес в массиве и сразу резервируете за этим адресом еще 52 ячейки для хранения следующих ссылок. Если же такая комбинация уже была, то мы ищем ее адрес и ссылаемся уже на него. Таким образом мы резервируем в массиве место только для новых комбинаций и не повторяем уже существующие. Благодаря сортировке, все перестановки одних и тех же карт будут иметь одну и ту же комбинацию и будут ссылаться на один адрес. Параллельно мы проверяем комбинацию карт на возможность флеша. Если флеш не возможен, то все варианты карт (например АК) идентичны и ссылаются на один адрес соответствующий АхКх. Если флеш возможен то есть четыре варианта , ,, и мы будем ссылаться на эти варианты по-отдельности на четыре разных адреса.

    Итак какая экономия места? Возьмем к примеру те же АК. их можно получить 16 способами (4 туза и 4 короля) учитывая порядок карт (КА) еще в два раза больше. Итого 32 способа - чтобы хранить все ссылки без оптимизации, нужно 32 ячейки в массиве. После оптимизации - только 5 ячеек (четыре одномастных АК и один разномастный).
    Для трех карт еще круче. АКQ - всего вариантов 4*4*4= 64, перестановок 6, итого 64*6=384. После оптимизации все те же 5 ячеек массива ( , , , , ).
    Ответить Цитировать
    2
  • БиллиУбили, Блин, невозможно уже читать твои посты о том как определить комбинацию из 5-ти карт.
    Сначала я дал тебе наводку, на самый быстрый алгоритм, потом пришел Jak и дал готовый файл и подробную инструкцию, как им пользоваться. Надо дать должное его терпению, он пытался тебе тщательно все объяснить. Вот ссылка на начало объяснения. Прочитай внимательно несколько раз, там важно каждое слово. Если все равно не поймешь, как устроен этот массив, не беда, тебе это не обязательно - прими это как должное, как "черный ящик". Все что тебе нужно - это преобразовать код с Делфи на свой язык программирования. Всего одна строчка кода:

    int a=HR5[ HR5[ HR5[ HR5[ HR5[53+c1]+c2]+c3]+c4]+c5];

    Да, она кажется ужасной и непонятной, но поверь, это намного проще, чем написать весь код с нуля (то что ты пол-года пытаешься сделать и не сдвинулся ни на шаг). Ладно, попробую тебе еще один раз объяснить, как устроен этот массив. Представь детскую настольную игру, где ты кидаешь кубик и ходишь по кружочкам и если на финальном кружочке есть стрелка, то переходишь по ней на другой кружочек. Так вот у тебя есть такая длинная цепочка кружочков и вместо кубика ты вытягиваешь карту и ходишь от 1 до 52. На том месте куда ты пришел есть стрелка куда тебе нужно переместиться (вместо стрелки номер кружочка на какой нужно перейти). Перемещаешься на этот кружочек и снова тянешь карту и ходишь от 1 до 52, а там снова стрелка. И так, после 5-ти карт и 5-ти перемещений ты попадаешь наконец на кружочек на котором написано Приз в виде абстрактного числа, которое однозначно определяет силу комбинации 5-ти карт (заранее рассчитанное число с помощью хитроумного алгоритма, который знать не обязательно). Этот массив (эта игра) так хитроумно устроен, что одинаковые комбинации карт ссылаются на одну и ту же ячейку (одинаковыми считаются набор карт, где поменян порядок следования и карты одного ранга, когда флеш невозможен). Поэтому на одну финальную ячейку с Призом ведут сотни стрелочек из различных мест. Благодаря этому удается сжать пятимерный массив невероятных размеров [52, 52, 52, 52, 52] до вполне разумного по размерам одномерного массива.

    Если тебе не удастся перевести эту одну строчку кода, то лучше завязывай с программированием - это не твое.
    Похоже ты не представляешь на какого уровня задачу ты позарился. Эта проблема лишь одна из многих, впереди еще с десяток намного более сложных проблем.
    Сообщение отредактировал Galax - 11.12.2019, 16:20
    Ответить Цитировать
    2
  • Цитата (c00l0ne @ 24.12.2019)
    А нету штрафа для скупа) считаем все для опа, и как часто он доедет и какие лайны нам побьет когда мы доедем или не доедем... Это и будет штраф )
    И тут твой мозг бдыщщщщ

    А какой в этом смысл? Независимо от того, скупанется опп или нет, если придет вниз карта на фулл, я положу фулл, если не придет, значит не будет фулла. Как может на это повлиять скупанется опп или нет? Тут же от нас не зависит его скуп.
    Или если он скупанется, фулл не будем ложить?

    И еще момент. А зачем считать 300к, если всего вариантов троек 2к? Т.е. ты одни и те же карты 150 раз кладешь и считаешь? Думаешь больше бонусов наберется или точней будет ответ?

    И вообще, если расклад последних двух карт у тебя создает вопросы, как ты будешь раскладывать предыдущий подъем, а второй подъем, когда карт всего 7 у тебя и 6 свободных мест на линиях? Когда действительно много вариантов.

    Цитата (БиллиУбили @ 24.12.2019)
    Чтобы разложить текущий подьём, придётся перебрать млн-ы вариантов следующего.

    Еще один... Тут уже это последние две карты. Какие млн-ы? Написал же 276 пар рук проверить. ВСЕ!!! Вся колода, все варианты!

    Ну а если это не последний подъем, тогда да, конечно придется посчитать все следующие варианты. А вы-то предлагаете еще не зная карт заранее считать. Какой смысл?

    Про задачки Jak уже писал. Что еще надо?
    Ответить Цитировать
    2
  • Цитата (c00l0ne @ 26.12.2019)
    brdss, на сериях если увидемся можно поиграть, а у вас дилера сколько Рейк берут? Где играешь и почём?


    я с тобой играть не буду. Ты карты сноса соперника знаешь (во всяком случае говоришь что учитываешь их при расчете). Нах мне надо минусовую катать
    Ответить Цитировать
    2
  • Цитата
    Выложи ТВОЁ разложение АК777, а вечером кулон выложит "правильный".
    Вот тогда можно будет что-то толковое обсуждать


    Ты уже столько раз упомянул этот злополучный расклад, на сам его не пытался посчитать. Скорее всего и программу ты не скачивал - не смотрел, но осуждаю...
    Ладно сделаю это за тебя.

    63a3fdb8aae4d7fd65db867b9c67c8c9.png


    Кто не согласен с таким раскладом?

    Далее
    Цитата
    Цитата (БиллиУбили @ 26.12.2019) *
    для
    а) скуп = 0 и
    б) скуп = -6, но поменяйте 2 и 8 местами. То есть, внизу 882, а приходит 2ка.


    а) при скуп = 0, разница между топ-вариантом и твоим кандидатом уменьшиться с 3 до 2,2 кушей, но все равно абсолютно выигрывает топ вариант.
    б) в чем смысл вопроса? все останется абсолютно одинаково.

    Итак программа считает полным перебором все варианты. То что наши с Jak результаты полностью совпали, подтверждает нам обоим, что с кодом мы не накосячили (всегда есть такая вероятность). Так что полный перебор считается абсолютно точно. Другой вопрос как интерпретировать этот результат. Ведь делается очень весомое упрощение - мы не учитываем расклад оппонента. Да мы учитываем какие карты вышли у оппа, но игнорируем какую руку он собирает. Делается гипотеза, что мы будем собирать свою руку одинаково в зависимости от своих карт и не зависимо от того, что собирает опп. Это упрощение делается не потому, что мы считаем, что так правильно, а потому что мы вынуждены чем-то жертвовать, чтобы получить результат в разумное время. Теперь нужно провести анализ опытным путем - насколько могут искажаться результаты от этого упрощения (я этим и займусь в ближайшее время).
    Нужно бы каким-то образом узнать точные данные и сравнить с нашими результатами. Но где взять эти точные данные? Вот Кулон просто говорит - вы считаете неправильно. А можешь ты сказать - как правильно? Посчитай или на бумаге, или на супер-компьютере и скажи аргументировано - вот правильный результат, а у вас вышло наоборот (первый и второй результат поменялся местами). Этот нюанс про первое и второе место объясню подробнее.
    Вот в раздаче, что мы разбираем, рука оппа намного сильнее нашей и на дистанции мы будем проигрывать. Но наша программа при полном переборе дает нам +7,5 кушей, хотя в действительности мы будем иметь скорее - 7 кушей. Так вот не важно абсолютное значение этих цифр, а важно относительное значение вариантов друг к другу. Первый вариант будет опережать второй вариант приблизительно на одно и тоже значение. И даже если после абсолютно-точных подсчетов разница уменьшится на пол-куша, но изначально разница была три куша, то первое и второе место не поменяется местами - значит наша программа даст все равно верный результат. Смена лидера может произойти только когда первые два места были достаточно близки по значению - но тогда ошибка в наших расчетах будет незначительна - не более пол-куша (если мы оценили погрешность нашего метода в пол-куша). Итак осталось оценить погрешность этого упрощения...
    Ответить Цитировать
    2
  • Wall-e0605,
    Цитата (Wall-e0605 @ 16.1.2019)
    Ты пользуешься своей супер прогой, я бесконечной чуйко-прухой.

    Обязательно бахнем. И не раз. Но потомчуть попозже
    Ответить Цитировать
    2
  • fergus_crowley,
    Цитата (fergus_crowley @ 15.1.2019)
    есть подозрение, что она кладет их одинаково неправильно

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

    почему нет? конечно же есть. Просто пока не включается, так как оппонентов нет
    Ответить Цитировать
    2
1 2 3 4 22 42 114
1 человек читает эту тему (1 гость):
Зачем регистрироваться на GipsyTeam?
  • Вы сможете оставлять комментарии, оценивать посты, участвовать в дискуссиях и повышать свой уровень игры.
  • Если вы предпочитаете четырехцветную колоду и хотите отключить анимацию аватаров, эти возможности будут в настройках профиля.
  • Вам станут доступны закладки, бекинг и другие удобные инструменты сайта.
  • На каждой странице будет видно, где появились новые посты и комментарии.
  • Если вы зарегистрированы в покер-румах через GipsyTeam, вы получите статистику рейка, бонусные очки для покупок в магазине, эксклюзивные акции и расширенную поддержку.