我正竭尽全力编写一个有趣的扑克评估库,并希望为给定的一组卡片增加测试抽签(开放式,gutshot)的能力。

只是想知道什么是“最新技术”?我试图使我的内存占用保持合理,因此使用查找表的想法不太合理,但可能是一个必要的弊端。

我目前的计划是:

  • 从集合中所有卡的排名中减去最低排名。
  • 查看是否某些序列,即0、1、2、3或1,2,3,4(对于OESD)是修改后的集合的子集。

  • 我希望明智地提高复杂度,因为使用我的方法,7张或9张卡套会使事情停顿。

    任何输入和/或更好的想法将不胜感激。

    最佳答案

    最快的方法可能是为每个卡等级分配一个位掩码(例如,deuce = 1,三个= 2,四个= 4,五个= 8,六个= 16,七个= 32,八个= 64,九= 128,十= 256 ,插孔= 512,女王/王后= 1024,国王= 2048,王牌= 4096),或对所有牌中的所有纸牌的掩码值进行“或”运算。然后使用8192个元素的查找表来指示该手牌是直牌,张开牌,直击还是没意义(一个人也可以包括各种后门直牌,而不会影响执行时间)。

    顺便说一句,使用不同的位掩码值,人们可以快速检测其他有用的手,例如,两种,三种等。如果一个具有64位整数数学运算,请使用所示位的立方上面的掩码(所以deuce = 1,三个= 8,依此类推,直到ace = 2 ^ 36),然后将卡片的值加在一起。如果结果加上04444444444444(八进制)与非零,则该手为四合一。否则,如果加正01111111111111,然后与04444444444444进行加和运算,得出的结果非零,则该手为三人或全家。否则,如果结果加上02222222222222的值不为零,则该手牌为一对或两对。要查看一手牌是否包含两对或更多对,请用02222222222222将“和”牌值“和”,然后保存该值。减去1,并用保存的值“和”结果。如果非零,则该手至少包含两对(因此,如果其中包含三类,则为满屋;否则为两对)。

    值得一提的是,检查直线度的计算也将使您快速确定手中有多少张不同等级的纸牌。如果有N张牌和N个不同等级的牌,则该手牌不能包含任何对或更好的对(但是,当然可以包含平直或同花)。如果存在N-1个不同等级,则该手正好包含一对。只有在不同等级的人较少的情况下,才可以使用更复杂的逻辑(如果有N-2,则该手可以是两对或三种);如果N-3或更少,则该手可以是“三对”(得分为两对),满屋子或同类四子)。

    还有一件事:如果您无法管理8192元素的查找表,则可以使用512元素的查找表。如上计算位掩码,然后在array [bitmask&511]和array [bitmask >> 4]上进行查找,然后对结果进行“或”运算。任何合法的平局或平局都会在一个或其他查找中进行注册。请注意,这不会直接为您提供不同等级的数量(因为两次查找都会计算出六到十张卡片),但是对同一阵列再进行一次查找(使用array [bitmask >> 9])将仅计入千斤顶。通过ace。

    09-07 05:15