使用 RegEx 获得扑克手分数
Posted
技术标签:
【中文标题】使用 RegEx 获得扑克手分数【英文标题】:Using RegEx to get Poker Hand score 【发布时间】:2010-09-19 15:16:29 【问题描述】:我正在用 C# 开发一个扑克游戏。目前我正在尝试使用RegEx
获取玩家手牌得分。我搜索字符串(由卡片花色和数字组成)并查找与RegEx
匹配的花色或数字。如果我得到 2 场比赛,那么球员有一对,3 场比赛他有 3 场同类。
目前我有 3 个类,一个 Card 类(带有数字和花色),一个 Deck 类(包含 52 张牌)和一个从洗好的牌堆中获得 5 张牌的 Hand 类。
Deck 类有一个shuffleDeck()
;
Hand 类具有计算分数的功能(在我使用 RegEx 的这些功能中)。
我通过添加手的 5 个花色和数字来生成我使用 RegEx
的字符串。
这是一个好主意还是我应该以其他方式来做,如果是,怎么做?
感谢您的帮助
PS。我是没有经验的程序员之一,想在所有事情上都使用新学的工具
【问题讨论】:
我不确定扑克中的手牌是否有固有的“分数”方面。 【参考方案1】:我不认为正则表达式是处理这个问题的合适方法。您可能应该使用比字符串更复杂的手形表示。
【讨论】:
关于正则表达式的最重要的一点是什么时候不使用它们。 我写了正则表达式来处理这个问题。 ***.com/questions/3463964/… @Richard - 我只想说它可能,不好。 @Topera - 酷;不过,我只是在开玩笑;我希望你没有冒犯。我会删除我的评论以防万一:) @Richard - 好的!我的英语不是很好,所以我不能用适当的方式表达自己。但我没事! :D【参考方案2】:您没有提供太多细节,但从我所阅读的内容来看,我认为您并没有将 OOP 推得太远......
我会有一个 Card 类,它有一个 Rank 和 Suit 类实例。然后我会有一个处理洗牌/发牌的甲板类......
然后我会有一个 Hand 类,其中包含 n 个 Card 对象的扑克手...
通过这种方式,您可以建立规则来评估每个手牌对象,从而在未来更加灵活和可扩展......比如说,如果您想制作另一个纸牌游戏/添加对另一种扑克变体的支持......
使用正则表达式来做这一切似乎是一个很糟糕的选择。
【讨论】:
【参考方案3】:我同意其他人的观点,Regex 似乎是一个糟糕的选择。它可能适用于对,3个,4个。然而,一旦你开始研究同花、顺子和 2 对等牌,它可能会变得有点棘手(或不可能)。
我认为最好的解决方案是从最好的牌到最差的牌来评估牌,as shown here,一旦你找到匹配的牌,那就是你的牌。这样可以确保您不会将 4 种误认为 2 对。或同花顺只是顺子,或只是同花。我会使用 mmattax 并为卡片创建一个对象,并为手牌创建一个对象,然后您可以评估每手牌中的牌,看看它们是否符合每手牌所需的标准。
【讨论】:
实际上用我目前的方法,我可以知道手上是否有 2 对或满堂彩。对于同花,我会搜索第一手牌,如果我得到 5 个匹配,就会出现同花。有了这两个功能,我知道玩家可以拥有的大部分手牌 这样做的工作量很大,正如 Kibbee 指出的那样,同花有时是同花顺,而正则表达式不适合确定这一点。 因为它们是不同的功能,如果我有顺子和同花(返回布尔值),我会知道这手牌有同花顺【参考方案4】:我认为素数是一个很好的解决方案。 考虑:
// D H S C
colors = [7,5,3,2]
// A Q K J T 9 8 7 6 5 4 3 2
ranks = [61,59,53,43,41,37,31,29,23,19,17,13,11,61]
唯一的卡片由颜色素数 * 等级素数标识。 (例如,截至钻石:素数 = 7 * 61)
因此,整个独特的牌组或组合由素数 * 素数 * 素数 * 素数 * 素数标识
如果有同花钻石,则 5 张牌的素数 ID 必须被同花钻石 ID 整除 (mod = 0) (7 ^ 5,因为钻石的素数是 7)
【讨论】:
用这个很难计算直道。【参考方案5】:使用字符串来表示手似乎是一个糟糕的决定。我的建议是使用一个 Enum 来表示花色,另一个来表示卡片的数值。
【讨论】:
以上是关于使用 RegEx 获得扑克手分数的主要内容,如果未能解决你的问题,请参考以下文章