(免责声明:我正在开发一款扑克软件,其中包括手牌评估)
你给它 7 张牌,它会吐出一个手等值值。
有几个评估员这样做,如果我没记错的话,他们中的一些人每秒计算超过一亿手(!)。这些评估器基本上可以在一个巨大的数组中进行 7 次数组查找,并且只需要几个周期(尽管缓存未命中)来评估一手牌。我不认为 14-15 百万/秒是最快的。如果我没记错的话,CactusKev 的评估器要快 10 倍。
现在回答你的问题:
你如何从你传递给它的 7 张牌中得到最好的 5 张牌组合?
好吧,它不会告诉你,但一旦你掌握了手的力量,它就会变得非常容易:你不需要重新发明轮子。
您可以使用强度来简化“七分之五”的计算。
您也可以使用其他库,直接给您最好的五张卡片(而不仅仅是他们的强度),或者您可以使用强度自己找到五张最佳卡片。
我只举几个例子...
你知道你有一个完整的房子(又名“船”),然后你知道你正在寻找三张具有相同等级的牌,然后是最好的一对(如果有两对,但你肯定会找到至少一个,因为评估员告诉你你有一艘船)。
你知道你有顺子:从最好的一张开始,找出五张彼此跟随的牌(小心特殊的轮盘盒)。
你也可以对顺子更感兴趣:你可以取每一个可能的顺子的力量,并将评估者给你的力量与这些力量进行比较。如果它匹配,比如说,一个 10 高的顺子,那么只需寻找任何 T、9、8、7 和 6 牌(无论花色如何)。
你知道你没有“对子”:只需拿你找到的最高的五张牌
等等
只有几个不同的等级......它们可能是,例如:
NO_PAIR
ONE_PAIR
TWO_PAIRS
SET
STRAIGHT
FLUSH
FULL_HOUSE
FOUR_OF_A_KIND
STRAIGHT_FLUSH
(如果需要,您当然可以创建中间“直轮”和“直轮”和“皇家同花顺”案例等)
一旦您知道您的手是哪种类型的手(感谢您正在使用的快速评估器),只需切换到一段代码,该代码会在该特定手的七分之五中找到最好的。
我认为这是一个很好的方法,因为您利用了超快速评估器,然后它大大简化了您的逻辑。
在启动时,您需要计算一次强度,例如通过计算:
HIGHEST_NO_PAIR_HAND = ultraFastEvaluator( "As Kd Qh Jc 9d 5s 2c" );
HIGHEST_FULL_HOUSE = ultraFastEvaluator( "As Ac Ad Kh Ks 8s 2h" );
我当然不提倡在这里使用字符串。这只是一个例子...
然后,您可以为每一手牌找到实际的五个最佳手牌:
- 使用快速评估器计算强度
- 是 <= HIGHEST_NO_PAIR_HAND 吗?
- 是:拿五张最高的牌
- 不:是 <= HIGHEST_ONE_PAIR_HAND 吗?是:拿最高的对子 + 最高的三张牌 否:是 <= HIGHEST_TWO_PAIRS_HAND 吗?
因此,在我看来,您可以重用一个直接从七个中找出五个最好的 API,或者完全重写您自己的 API,但是如果您使用快速评估器的结果来简化您的逻辑,它会更快。
编辑请注意,不一定有一种方法可以做到“七分之五”。例如,在 Kc Kd Qh Qs 2c 公共牌上使用 As Ac,“As Ac Kc Kd Qh”和“As Ac Kc Kd Qs”都是“五强”(最后一个皇后的花色无关紧要)。