有谁知道评估 7 张牌扑克牌的快速算法吗?这比简单地暴力检查 7 组牌中每 21 个 5 张牌的组合更有效。

干杯,

皮特

有帮助吗?

解决方案

这个网站列出了一堆 扑克牌评估器库 并给出了每个的一些细节。大多数是针对 5 张牌的,但至少有一种是针对 7 张牌的,称为 Snezee7 评估器. 。此外,该网站还全面概述了用于快速分析扑克手牌的不同技术和算法。

我在几个不同的项目中使用了 Pokersource Evaluator 的 Keith Rule C# Port 扑克项目 并认为这是一个优秀的图书馆。您可以使用许多巧妙的技巧来制作真正快速的手动评估器,但编写代码需要大量工作,我强烈建议使用现有的库。

其他提示

我写一个在的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/ < BR> 博客: HTTP://specialk-coding.blogspot的.com / 2010/04 /得克萨斯-扑克-7-卡evaluator_23.html

该评估的商业级进化是可以通过iTunes商店的iPhone / iPod Touch的。这就是所谓的 “扑克王牌的。”

完成链路中不同的解决方案的一个很好的总结是詹姆斯·德夫林的博客“发现编码轮子”。

一个评价者尚未讨论有克拉图的

祝你好运!

我已经创建了用C 这里。我测试的评估中,扑克-EVAL 库是赢家。 史蒂夫·布雷彻的扑克摊牌得也比较快,有显著更少的内存需求。我自己的 ACE_Eval 举办它自己。

我希望能帮助增加其它评估,并从其他机器测试结果的贡献。

我认为你应该做的21个组合,并使用某种类型的7462表格。 第一:任何7卡具有21层不同的5层牌的组合 第二:每一个可能的最终手牌(2.598.960)代表7462别样手之一 因此,你会很容易。

您只需要看看你的卡每21个组合,并为每一个,见7462排名表的排名。 http://www.sendspace.com/file/pet0dd

然后,对于每个卡7你将不得不从该7462表I由21个不同的排名。排名最高的21个组合是你想知道的一个。

要理解的表:在每一行你有5张牌(Z为适合,Y非适合)并且已在它的排名。 That's只有你的需要。我给你的表和示例算法。 It's不是真正的代码。 It's视觉基本格式,我现在写的。大概doesn't的工作,但你应该明白。该代码将是这样的:

'############### 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千兆字节数据库预先计算。如果您想知道您的实时赔率你应该有很多事情预先计算。 That's我是否满意。

当然,如果你想这样做非常快。我把之前的算法是太慢了。

在table7462建议立即进行删除在数组,而不是在一个文件中。

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

您应使用此格式(alphabeticall顺序):

“2c2d2h2s3c3d3h” 和秩它

存储每133.784.560不同组合。你做52C7圈子中,排名,并将其存储在数据库中。 也许在几天之内你必须准备好。 当你拥有它准备好了,你鸵鸟政策需要21个组合了,只要把你的手按字母顺序排序,并在数据库中进行搜索。

如果你这样做,则将会看到,你可以计算出你的赔率对你的对手时实时需要。

相信我。我不是一个程序员,我能做到这一点。我知道我的可能性在3秒触发器。

我开发一个模拟器德州扑克和此开发过程中,我发现的7462个独特组合的数量 - 在翻(52 5/5卡)。反过来,这个数字下降到6075(5/6),并在河边4824(5/7)。这是因为:1张或2卡在手牌进行分类无关。一个例子是: 76543QK = 7654332一个直的(3〜7)

我的模拟器被称为简易扑克,是在我的网站 http://crvltda.webs.com使用

参考。 Pokersoftware.com/forum

五月我推荐 https://github.com/chenosaurus/poker-evaluator/

这是写在JavaScript和使用128 MB HandRanks.dat文件。

在代码仅仅是几行,很容易地移植到任何其他语言。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top