divs31, Ну по OFCP (ту где по одной карте сдавали) у меня тоже был калькулятор.
И может быть тоже один из первых в СНГ.
Мне повезло, что я случайно узнал об этой игре, как только она появилась. И к тому моменту у меня уже были библиотеки для максимально быстрого определения силы покерной комбинации. И калькулятор получилось сделать довольно быстро. Игра тогда была только на GamblerGames.
Я обратился в личку к Gipsy и Кравченко с предложением программы. Но они не захотели даже слушать меня. В то время бытовало мнение, что такую программу невозможно сделать. А если кому-то удастся, то она будет стоить сотни тысяч долларов. А тут какой-то ноунейм из провинции предлагает взглянуть на калькулятор...
Я и мои друзья играли на GamblerGames пару месяцев, может полгода. А затем появился ананас и вся игра перешла на него.
Вот для ананаса не удалось сделать быстро калькулятор. Я пытался где-то полгода, но что-то не сросталось. Затем я забыл про это на пару лет.
Спустя пару лет, тут на форуме ребята начали обсуждать, как сделать калькулятор для ананаса. Я участвовал в дискуссии и вспомнил, что у меня есть кое-какие разработки. И затем в какой-то момент, меня осенило и я смог доделать прогу. То что раньше не получалось за полгода, теперь вдруг получилось.
Но время уже было не то. Популярность игры была уже не та. Игры было не много и в основном в приложениях типа PPP. Игра с джокерами набирала популярность. Сам я играть ленился, а продать кому-то прогу так и не удалось. Так что не удалось монетизировать этот труд.
Я правильно понимаю, что у тебя есть калькулятор для ананаса?
Вот его я бы хотел сравнить со своим.
Типа берем какую-то сложную ситуацию и считаем оптимальный ход.
Мне просто любопытно, нормально ли считала моя прога или нет.
Сам я уже не буду заниматься этим в любом случае.
divs31 @ 19.04.26У меня это реализовано как 5 карт переводятся в 30-битовое число 5карт по 6 бит. И это есть адрес в массиве где лежит полная нужная инфа
А у меня как обращение в пяти-мерный массив.
Не нужно делать никаких преобразований - просто по пяти числам 1-52 обращаюсь в массив и получаю число (чем больше число, тем выше ранг карты). Дальше просто сравниваешь у кого ранг больше, тот набор карт и победил.
P.S.
Вот такая одна строчка кода дает ранг покерной комбирации при вводе пяти карт с1..с5:
int a=HR5[ HR5[ HR5[ HR5[ HR5[53+c1]+c2]+c3]+c4]+c5];
Помоему быстрее ничего не придумать.
Давай сравним пару расскладов.
Я одно время плотно общался с одним регуляром, который катал дорогую игру и говорил, что имеет посчитанные рассклады.
Такие рассклады:
1. AT6s, 9, 6
2. AT7s, 9, 7
Внешне они похожи, но раскладываются по разному.
1.
Sim 2 : 3.80
Row 1: Ac
Row 2: 9s 6h 6c
Row 3: 10c
Sim 1 : 4.22
Row 1: 9s
Row 2: 10c Ac
Row 3: 6h 6c
Sim 0 : 4.75
Row 1: Ac
Row 2: 6h 6c
Row 3: 9s 10c
Это мои рассчеты и он подтвердил, что это правильные варианты.
2.
Sim 2 : 4.00
Row 1: Ac
Row 2: 9s
Row 3: 7h 10c 7c
Sim 1 : 4.20
Row 1:
Row 2: 9s Ac
Row 3: 7h 10c 7c
Sim 0 : 4.31
Row 1:
Row 2: 10c Ac
Row 3: 7h 9s 7c
Тут он говорит, что правильнее тот вариант, что у меня идет под Sim 2. Хотя все варианты очень близкие, разница 0.3 куша между первым и третьим.
P.S.
Это обычный ананас и цена за фантазию 9.78.
divs31, У меня тоже есть массив для 7 карт холдема.
И весит он около 130Мб.
Обращение к нему такое же - 7 индексов в массиве.
На выходе получаем 32 битное число. Наверное в эти 4 байта можно сохранить всю нужную инфу. Я использую только ранг карты (стрит, флеш, фуллхаус и т.д.) и кикер внутри ранга.
Для 5 карт китайского массив занимает всего 20-30Мб (не помню точное число).
Эти файлы спокойно можно загрузить в оперативку.
А вот 20 Гб как ты загрузишь в оперативку? Значит ты погружаешь их с диска, а это медленее, чем читать с оперативки.
В этом файле HR5 (или HR7) очень интересный метод хранения инфы. Это позволяет сильно экономить место и вместо массива 52^7 получить массив в 130 Мб. Я несколько раз на форуме писал об этом массиве, как он устроен и как его получить.
Galax @ 20.04.26У меня тоже есть массив для 7 карт холдема.
И весит он около 130Мб.
Обращение к нему такое же - 7 индексов в массиве.
Galax @ 20.04.26Для 5 карт китайского массив занимает всего 20-30Мб (не помню точное число).
Эти файлы спокойно можно загрузить в оперативку.
Я их вообще формирую во время загрузки программы в память. Весь массив делается за микросекунды.
divs31, это ты по 10000, 20000 вариантов посчитал? И все? Сделал вывод о раскладе?
Хотя бы 100кк посчитал бы.
Galax, 20 ГБ не такая уж и большая память. Все грузится в оперативку. Но это для холдема. Для китайского значительно меньше, но тоже не пытался сильно сжать. Скорость важнее.
А как ты умудрился впихнуть 7 карт в 130 Мб. просто 7 мерный массив это 52 в 7 степени это 4 Тб по 4 ьайта. Но даже если сжать то там 10**9 вариантов и на 4 байта уже 4 Гб.
Jak @ 20.04.26Хотя бы 100кк посчитал бы.
У меня дома комп слабенький, неохота подолгу считать.
Я там указал точность расчета, поэтому, да, некоторые варианты из топ-3 могут в результате поменяться местами, но они очень близки к друг другу.
Для двух или трех человек могут поменяться расклады, но на практике редко. Потому что больше известных карт и играть можно агрессивнее с той же вероятностью скупа
чтобы иметь +4 перед оппами со стартера, это должен быть просто лом какой-то. Видимо у тебя не учтены роялти соперников, чтобы уменьшить диспу. я тоже так делал в начале, потом стал считать честно, мощность компов позволяла
divs31, Да, я не учитываю роялити оппов, когда у них нет карт еще.
Мне кажется абсолютное значение результата не имеет большого значения. Важно относительное значение вариантов друг от друга. Т.е. точка отсчета от которой считаем не так важна.
Важно какой-вариант лучший и на сколько (чтобы прикинуть погрешность ответа).
Кстати у меня оценивает в кушах, а у тебя как?
На глазок у тебя разница между вариантами слишком маленькая, может ты в чем-то другом оцениваешь ЕВ?
divs31 @ 20.04.26У меня дома комп слабенький, неохота подолгу считать.
Выходит, что если у тебя, например, случайно 1-2 раза из 10к, выпадет каре вниз, в мид ААА, а вверх ККК вот тут
АсТс9s
6h6c
ev = -1.119
то этот расклад наверно опередит этот, в котором он не выпадает
АсТс
6h6c9s
ev = -0.41+-0.13??
Или такой вариант невозможен?
Сравнения нужно проводить в одинаковых условиях.
Поэтому пересчитал все для фантазии в 9.5:
Результаты вышли как у тебя:
1.
Sim 2 : 4.49
Row 1: Ac
Row 2: 6h 6c
Row 3: 9s 10c
Sim 1 : 4.53
Row 1:
Row 2: 9s Ac
Row 3: 6h 10c 6c
Sim 0 : 6.04
Row 1:
Row 2: 10c Ac
Row 3: 6h 9s 6c
2.
Sim 3 : 4.35
Row 1: Ac
Row 2: 7h 7c
Row 3: 9s 10c
Sim 2 : 4.37
Row 1: Ac
Row 2: 9s
Row 3: 7h 10c 7c
Sim 1 : 4.67
Row 1:
Row 2: 9s Ac
Row 3: 7h 10c 7c
Sim 0 : 4.68
Row 1:
Row 2: 10c Ac
Row 3: 7h 9s 7c
Для второго рассклада первые 4 варианта очень близкие (в пределах погрешности).
Удивляет, что для первого рассклада лидер поменялся, когда мы поменяли фантазию с 9.78 на 9.5 (вроде незначительное изменение). Но это уже не проблема программиста, а проблема игрока - как он оценивает фантазию.
У меня были данные 6-ти летней давности - для 2-макс 9,78, для 3-макс 9,27.
Возможно сейчас уже другие актуальные данные.
Пока я вижу, что у нас одинаковые расчеты.
Может ты подкинешь какие-то спорные ситуации?
divs31 @ 20.04.26А как ты умудрился впихнуть 7 карт в 130 Мб. просто 7 мерный массив это 52 в 7 степени это 4 Тб по 4 ьайта. Но даже если сжать то там 10**9 вариантов и на 4 байта уже 4 Гб.
Я пытался объяснить одному незадачливому программисту в другой теме.
Вот несколько цитат оттуда:
Ты все таки хочешь понять, как получился этот массив? Но это не имеет практического значения, так как программа которая создает этот массив запускается только один раз и после всех расчетов (относительно длительных) сохраняет его на диске. В дальнейшем вы просто загружаете этот массив из диска в оперативку и извлекаете готовый ранг 5-ти карт из оперативки. Это самый быстрый способ узнать силу 5-ти карточной руки. Ни каких сортировок при этом не делается, никаких промежуточных проверок на флеш или стрит - ничего ресурсно-затратного. Просто пять обращений к массиву и на выходе ранг пяти карт. Причем в старших байтах этого ранга хранится информация о комбинации (фулл-хаус, флеш, стрит и т.д.), в младших - порядковый номер этой руки внутри комбинации.
Если же все-таки хочешь сам разобраться, то рекомендую скачать исходник ( я давал ссылку выше). Я в свое время распечатал его и штудировал строчка за строчкой. Там много интересных программистских трюков, оптимальные методы сортировки, использование внешних библиотек для расчета ранга готовой руки... Но ты вряд ли сможешь это сам повторить, да и за чем изобретать велосипед.
Но попробуй в двух словах - как это работает.
Перебираете в цикле все возможные комбинации из 52-х карт - сначала однокарточные, потом двух-карточные и т.д. до 5-ти карточных. каждый раз сортируете полученные карты и проверяете встречалась ли вам ранее такая комбинация карт. Если не встречалась такая комбинация то присваиваете ей первый свободный адрес в массиве и сразу резервируете за этим адресом еще 52 ячейки для хранения следующих ссылок. Если же такая комбинация уже была, то мы ищем ее адрес и ссылаемся уже на него. Таким образом мы резервируем в массиве место только для новых комбинаций и не повторяем уже существующие. Благодаря сортировке, все перестановки одних и тех же карт будут иметь одну и ту же комбинацию и будут ссылаться на один адрес. Параллельно мы проверяем комбинацию карт на возможность флеша. Если флеш не возможен, то все варианты карт (например АК) идентичны и ссылаются на один адрес соответствующий АхКх. Если флеш возможен то есть четыре варианта , , , и мы будем ссылаться на эти варианты по-отдельности на четыре разных адреса.
Итак какая экономия места? Возьмем к примеру те же АК. их можно получить 16 способами (4 туза и 4 короля) учитывая порядок карт (КА) еще в два раза больше. Итого 32 способа - чтобы хранить все ссылки без оптимизации, нужно 32 ячейки в массиве. После оптимизации - только 5 ячеек (четыре одномастных АК и один разномастный).
Для трех карт еще круче. АКQ - всего вариантов 4*4*4= 64, перестановок 6, итого 64*6=384. После оптимизации все те же 5 ячеек массива ( , , , , ).
БиллиУбили, Блин, невозможно уже читать твои посты о том как определить комбинацию из 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] до вполне разумного по размерам одномерного массива.
Странно, что ты не слышал про этот метод определения ранга 5-7 карт.
Когда его придумали (довольно давно), то после этого уже никто ничего нового не изобретал, так как очевидно, что это самый быстрый метод.
Jak, Все расклады считаются одними и теми же затусованными колодами. Т.е. скорее всего если и в первом выпадет 2 раза из 10000, то и во втором тоже 2 раза скорее всего. Там могут разойтись пути из-за 10-к и 9-к, но это маленькая вероятность. Ну и Монтекарло на то и МонтеКарло, что не дает абсолютного результата
Galax, с альткоинами, где 1000% летают туда-сюда, обрати внимание на показатель long/short ratio. По нему можно следить за кукловодом.