7-карточный покер

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

Ура,

Пит

9 ответов

Решение

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

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

Я написал один на 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],  [ _["♠"], _["♠"], _["♠"], _["♠"], _["♠"] ] ); 

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

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

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

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

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

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

Удачи!

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

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

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

https://github.com/HenryRLee/PokerHandEvaluator

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

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

Я думаю, что вы должны сделать 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 гигабайт со многими предварительно рассчитанными вещами. Если вы хотите узнать свои шансы в режиме реального времени, вы должны рассчитать многие вещи заранее. Так я и сделал.

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

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

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

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

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

Ссылка Pokersoftware.com/forum

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

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

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

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

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

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

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

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

Другие вопросы по тегам