7 Card Poker Hand Evaluator

时间:2010-05-13 19:59:23

标签: algorithm poker playing-cards

有谁知道评估7张扑克牌手的快速算法?比一组7中的每21张5张牌组合更有效率的东西。

干杯,

皮特

9 个答案:

答案 0 :(得分:31)

我在 JavaScript 中写了一个。核心评估方法仅使用位操作,因此非常快。考虑到这一点,看21种组合仍然非常快。我们需要更深入的唯一一次是何时出现平局。当发生这种情况时,我们需要查看更多详细信息,以确定哪一张牌实际上是最好的。这是我提出的解决方案:

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],  [ _["♠"], _["♠"], _["♠"], _["♠"], _["♠"] ] ); 

Explanation Here
Demo Here

答案 1 :(得分:12)

此网站列出了一堆Poker Hand Evaluator libraries,并提供了有关每个网站的详细信息。他们中的大多数都是5张牌,但至少有一张名为The Snezee7 Evaluator的7张牌。此外,该网站还提供了用于快速分析扑克手的不同技术和算法的概述。

我在一些不同的poker projects中使用了Pokers Rule C#Port of Pokersource Evaluator,并认为它是一个优秀的库。有许多聪明的技巧可以用来制作真正快速的手动评估器,但是编写代码需要做很多工作,我强烈建议使用现有的库。

答案 2 :(得分:7)

很高兴你问:)是的,这是一个全新的解决方案,可能只是门票:

代码:http://code.google.com/p/specialkpokereval/
博客:http://specialk-coding.blogspot.com/2010/04/texas-holdem-7-card-evaluator_23.html

此评估器的商业级演变可通过iTunes Store用于iPhone / iPod Touch。它被称为“Poker Ace”。

James Devlin的博客“Coding The Wheel”中提供了各种解决方案的完美链接的完美摘要。

尚未讨论的一位评估员有Klaatu's

祝你好运!

答案 3 :(得分:4)

我开发了一种7卡手评估算法,无需迭代所有21种组合。

基本上,它将7张牌分为两类:冲洗而非冲洗。如果它是一个刷新,那么很容易在一个包含8192个条目的表中查找该值。如果它不是刷新,它将使用动态编程技术运行哈希函数,然后在49205个条目的哈希表中查找该值。

如果您有兴趣,请查看我在github的工作。

https://github.com/HenryRLee/PokerHandEvaluator

答案 4 :(得分:2)

我认为你应该做21种组合并使用某种7462表。 第1名:任意7张牌都有21种不同的5张牌组合 第二名:每个可能的最终扑克牌(2.598.960)代表7462种不同类型的牌之一 所以,这很容易。

您只需要查看每张卡片的21种组合,并且每张组合都会看到7462排名表的排名。 http://www.sendspace.com/file/pet0dd

然后,对于每张7张牌,你将获得与我制作的这张7462牌桌有21种不同的排名。 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千兆字节的数据库,预先计算了很多东西。如果你想实时了解你的赔率,你应该预先计算很多东西。这就是我做的。

答案 5 :(得分:2)

我在C here为扑克评估员创建了一个测试平台。在我测试过的评估人员中,poker-eval图书馆是获胜者。 Steve Brecher's Holdem Showdown也非常快,内存需求明显减少。我自己的ACE_Eval拥有它自己。

我欢迎帮助添加其他评估者,以及其他计算机的测试结果的贡献。

答案 6 :(得分:0)

我开发了一个模拟器德州扑克,在这个开发过程中,我在翻牌圈找到了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

答案 7 :(得分:0)

我可以推荐https://github.com/chenosaurus/poker-evaluator/

它是用JavaScript编写的,并使用128 MB的HandRanks.dat文件。

代码仅几行,并且很容易移植到任何其他语言。

答案 8 :(得分:-1)

当然,如果你想快速做到这一点。我之前提出的算法太慢了。

table7462应该是一个数组,而不是一个文件。

然后,您应该预先计算每个不同的7cards牌并将其存储到数据库中。有133.784.560种不同的7cards组合。

您应该使用此格式(按字母顺序排列):

“2c2d2h2s3c3d3h”并将其排名

存储每133.784.560种不同的组合。你做52C7 cicles,对它进行排名并将其存储在数据库中。 也许在几天之内就准备好了。 当你准备好它时,你不再需要21种组合,只需按字母顺序排序并在数据库中搜索它。

如果你这样做,你会发现你可以在需要的时候实时计算你对手的几率。

相信我。我不是程序员,我可以做到。我知道我在翻牌圈的赔率是3秒。