我正在用C#开发扑克游戏。目前我正在尝试使用RegEx
获得球员手牌得分。我搜索字符串(由卡片套装和数字组成)并寻找西装或数字以匹配RegEx
。如果我得到2场比赛,则该球员有一对,3场比赛他有3场比赛。
我现在有3个班级,一个卡级(有数字和套装),一个甲板班(包含52张牌)和一个从洗牌的牌组中获得五张牌的Hand类。
甲板课有shuffleDeck()
; Hand类具有计算得分的功能(在我使用RegEx的这些功能中)。
我通过添加手的5个套装和数字来生成我使用RegEx
的字符串。
这是一个好主意还是我应该采取另一种方式,如果是这样,怎么做?
谢谢您的帮助
PS。我是一个没有经验的程序员,想要使用新学到的工具
我认为正则表达式不是解决这个问题的合适方法。您可能应该使用比字符串更复杂的手形表示。
你没有提供太多的细节,但从我读过的内容来看,我认为你并没有把OOP推得太远......
我会有一个具有Rank和Suit类实例的Card类。然后我会有一个处理改组/交易的甲板课......
然后我会有一个Hand类,它将包含你的n卡对象的扑克牌......
通过这种方式,您可以构建规则来评估每个手对象,从而在未来更灵活,更具可扩展性......如果您想要制作另一个纸牌游戏/添加对另一种扑克变种的支持......
使用正则表达式来完成所有这些似乎是一个非常糟糕的选择。
我同意其他人的观点,即Regex似乎是一个糟糕的选择。它可能适用于成对,3种,4种。然而,一旦你开始看着像冲水,直道和2对这样的手,它可能会变得有点棘手(或不可能)。
我认为最好的解决方案是评估牌从最好牌到最差牌,as shown here,一旦找到比赛,那就是你的牌。这确保您不会误认为4对2对。或直接冲洗,只是一个直,或只是一个同花顺。我会使用mmattax并为卡片创建一个对象,并为手牌创建一个对象,然后您可以评估每只手中的牌以查看它们是否符合每只手的所需标准。
我认为素数是一个很好的解决方案。考虑:
// 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(7 ^ 5因为钻石颜色素数为7)而被分割(mod = 0)
使用字符串来表示手似乎是一个糟糕的决定。我的建议是使用Enum代表套装,另一个代表卡的数值。