7-карточный покер - PullRequest
34 голосов
/ 13 мая 2010

Кто-нибудь знает быстрый алгоритм оценки 7-карточных покерных рук? Что-то более эффективное, чем простая проверка грубой силы каждой 21 комбинации из пяти карт из набора из 7.

Приветствия

Пит

Ответы [ 9 ]

31 голосов
/ 10 ноября 2012

Я написал один в JavaScript . Основной метод оценки использует только битовые манипуляции, поэтому он чрезвычайно быстр. Имея это в виду, смотреть на 21 комбинацию все еще очень быстро. Единственный раз, когда нам нужно идти глубже, это когда происходит галстук. Когда это происходит, нам нужно изучить больше деталей, чтобы увидеть, какая 5-карточная комбинация на самом деле лучшая. Вот решение, которое я придумал:

hands=["4 of a Kind", "Straight Flush", "Straight", "Flush", "High Card",
       "1 Pair", "2 Pair", "Royal Flush", "3 of a Kind", "Full House" ];
var A=14, K=13, Q=12, J=11, _ = { "♠":1, "♣":2, "♥":4, "♦":8 };

//Calculates the Rank of a 5 card Poker hand using bit manipulations.
function rankPokerHand(cs,ss) {
  var v, i, o, s = 1<<cs[0]|1<<cs[1]|1<<cs[2]|1<<cs[3]|1<<cs[4];
  for (i=-1, v=o=0; i<5; i++, o=Math.pow(2,cs[i]*4)) {v += o*((v/o&15)+1);}
  v = v % 15 - ((s/(s&-s) == 31) || (s == 0x403c) ? 3 : 1);
  v -= (ss[0] == (ss[1]|ss[2]|ss[3]|ss[4])) * ((s == 0x7c00) ? -5 : 1);

  document.write("Hand: "+hands[v]+((s == 0x403c)?" (Ace low)":"")+"<br/>");
}

//Royal Flush   
rankPokerHand( [ 10, J, Q, K, A],  [ _["♠"], _["♠"], _["♠"], _["♠"], _["♠"] ] ); 

Объяснение здесь
Демо Здесь

12 голосов
/ 14 мая 2010

На этом сайте перечислены библиотек покерной руки Poker и даны некоторые подробности о каждой из них. Большинство из них предназначены для 5-карточных комбинаций, но есть как минимум одна для 7-карточной комбинации, которая называется The Snezee7 Evaluator . Кроме того, на сайте представлен отличный обзор различных методов и алгоритмов, используемых для быстрого анализа покерных комбинаций.

Я использовал порт Keith Rule C # в Pokersource Evaluator в нескольких различных покерных проектах и считаю, что это отличная библиотека. Есть много хитрых трюков, которые вы можете использовать для создания действительно быстрых ручных оценщиков, но написание кода - большая работа, и я настоятельно рекомендую использовать существующую библиотеку.

7 голосов
/ 19 мая 2010

Рад, что вы спросили :) Да, вот новое решение, которое может быть просто билет:

Код: http://code.google.com/p/specialkpokereval/
Блог: http://specialk -coding.blogspot.com / 2010/04 / texas-holdem-7-card -valuator_23.html

Коммерческая версия этого оценщика доступна для iPhone / iPod Touch через iTunes Store. Он называется " Покерный туз ".

Превосходное описание различных решений со ссылками можно найти в блоге Джеймса Девлина " Coding The Wheel ".

Один оценщик еще не обсуждался, это Клаату .

Удачи!

4 голосов
/ 06 марта 2016

Я разработал алгоритм оценки руки из 7 карт, не повторяя все 21 комбинации.

По сути, 7-карточная рука делится на две категории: флеш, а не флеш. Если это флэш, было бы легко найти значение в таблице из 8192 записей. Если это не сброс, он запустит хеш-функцию с методами динамического программирования, а затем найдет значение в хеш-таблице из 49205 записей.

Если вам интересно, пожалуйста, проверьте мою работу на github.

https://github.com/HenryRLee/PokerHandEvaluator

2 голосов
/ 18 мая 2015

Я создал тестовую площадку для покерных оценщиков в C здесь . Из оценщиков, которых я тестировал, победителем стала библиотека poker-eval . Стив Бречер Холдем Showdown также был довольно быстрым и имел значительно меньше требований к памяти. Мои собственные ACE_Eval держали свои собственные.

Я бы приветствовал помощь в добавлении других оценщиков и результатов тестов с других машин.

2 голосов
/ 21 ноября 2012

Я думаю, вы должны составить 21 комбинацию и использовать какую-то таблицу 7462. 1-й: любые 7 карт имеют 21 комбинацию из 5 карт 2-й: каждая возможная последняя покерная комбинация (2.598.960) представляет собой одну из 7462 разного рода рук так что это просто.

Вам просто нужно взглянуть на каждые 21 комбинацию ваших карт и посмотреть каждую из них в таблице рейтинга 7462. http://www.sendspace.com/file/pet0dd

Тогда для каждых 7 карт у вас будет 21 рейтинг из этой таблицы 7462, которую я составил. Самый высокий рейтинг из 21 комбинации - это та, которую вы хотите знать.

Чтобы понять таблицу: в каждой строке у вас есть 5-карточная рука (Z для масти, Y для не масти), и у вас есть ее рейтинг. Это только вам нужно. Я даю вам таблицу и пример алгоритма. Это не совсем код. Это визуальный базовый формат, и я написал его сейчас. вероятно, не работает, но вы должны понимать. Код будет примерно таким:

'############### 1st: Define your hand, for example "2c2d2h2s3c3h3s" #############################################################################################

Dim mycard As New ArrayList

mycard(1).Add("2c")
mycard(2).Add("2d")
mycard(3).Add("2h")
mycard(4).Add("2s")
mycard(5).Add("3c")
mycard(6).Add("3h")
mycard(7).Add("3s")
mycard.Sort() '################# you need to sort in alphabeticall order to match it later with 7462 table #############################################



' ################## 2nd: Let´s transform it to every kind of 5 cards combinations (21). It will also preserve the alphabeticall order ##################################

Dim myHand5 As String = ""
Dim suited as String = ""
Dim ranking as Integer = 0
Dim myranking as Integer = 7462
Dim mystring as String = ""

For cicle1 = 0 to 2
     For cicle2 = cicle1 + 1 to 3
          For cicle3 = cicle3 + 1 to 4
               For cicle4 = cicle3 + 1 to 5
                    For cicle5 = cicle4 + 1 to 6
                         myhand5 = left(mycard(cicle1),1) & left(mycard(cicle2),1) & left(mycard(cicle3),1) & left(mycard(cicle4),1)  & left(mycard(cicle5),1)
                         suited = left(mycard(cicle1),2) & left(mycard(cicle2),2) & left(mycard(cicle3),2) & left(mycard(cicle4),2)  & left(mycard(cicle5),2)
                         if suited = "ccccc" or suited = "ddddd" or suited = "hhhhh" or suited = "sssss" then myhand5 = myhand5 & "Z" Else myhand5 = myhand5 & "Y"  
                          ranking = 0                              
                          FileOpen (1, "7462.txt", Input)
                          Do
                               ranking = ranking + 1
                               Input(1, mystring)
                               Input(1, ranking)
                               If mystring = myhand5 Then 
                                    If ranking < myranking then myrankin = ranking
                               End If
                          Loop Until EOF(1)
                          FileClose(1)
                    Next cicle5
               Next cicle4
          Next cicle3
     Next cicle2
Next cicle1

Окончательный рейтинг - переменная myranking. Вы должны знать свою руку менее чем за секунду. А также это хорошо для сравнения с другими руками, потому что у вас есть значение рейтинга, а не его название. И если вы хотите что-то сделать с помощью покерных алгоритмов, это то, с чего вам следует начать. Со значениями рейтинга все быстро и просто.

Примечание: я не программист. Я хочу быть. Я понимаю некоторые визуальные основные функции. Я хотел знать, как создавать настоящие программы. Если алгоритм работает, пожалуйста, оставьте комментарий. Если вы хотите, чтобы это было очень-очень быстро, я не знаю, как это сделать. Я хочу сказать, что у меня есть сверхбыстрый алгоритм, который позволяет мне проверять (в режиме реального времени) свои шансы против любых оппонентов на каждом этапе игры. Я перепробовал много алгоритмов, чтобы рассчитать свои шансы на флопе в режиме реального времени, но самый быстрый, который я могу, это 30 секунд. Теперь я могу рассчитать свои шансы на флопе за 3 секунды, но я использую базу данных на 150 гигабайт со многими предварительно рассчитанными вещами. Если вы хотите узнать свои шансы в режиме реального времени, вы должны рассчитать многие вещи заранее. Вот как я это сделал.

0 голосов
/ 04 июля 2018

Могу я порекомендовать https://github.com/chenosaurus/poker-evaluator/

Он написан на JavaScript и использует файл HandRanks.dat 128 МБ.

Код состоит всего из нескольких строк, и его очень легко перенести на любой другой язык.

0 голосов
/ 22 января 2013

Я разработал симулятор Техасского Холдема и во время этой разработки я нашел на флопе 7462 уникальных комбинации (52 - 5/5 карт) В свою очередь, это число падает до 6075 (5/6), а в реке до 4824 (5/7). Это связано с тем, что 1 или 2 карты не имеют значения при классификации покерной руки. Примером является: 76543QK = 7654332 прямой (от 3 до 7)

Мой симулятор называется Easy Poker и доступен на моем сайте http://crvltda.webs.com

Ref. Pokersoftware.com/forum

0 голосов
/ 21 ноября 2012

Конечно, если вы хотите сделать это очень быстро. Алгоритм, который я изложил ранее, слишком медленный.

Таблица7462 должна быть в массиве, а не в файле.

Затем вы должны пересчитать каждую раздачу из 7 карт и сохранить ее в базе данных. Существует 133 784,560 различных комбинаций 7 карт.

Вы должны использовать этот формат (в алфавитном порядке):

"2c2d2h2s3c3d3h" и оцените его

Храните каждые 133.784.560 различных комбинаций. Вы делаете 52C7 циклы, ранжируете их и сохраняете в базе данных. Возможно, через несколько дней у вас все будет готово. Когда все будет готово, вам больше не понадобится 21 комбинация, просто поместите отсортированную по алфавиту руку и найдите ее в своей базе данных.

Если вы сделаете это, вы увидите, что вы можете рассчитывать свои шансы против своих противников в режиме реального времени, когда вам нужно.

Поверь мне. Я не программист, и я могу это сделать. Я знаю свои шансы на флопе за 3 секунды.

...