我正在用C#开发扑克游戏。目前我正在尝试使用 RegEx 获得玩家手牌得分。我搜索字符串(由卡片套装和编号组成)并查找西装或数字以匹配 RegEx 。如果我得到2场比赛,则该球员有一对,3场比赛他有3场比赛。

我目前有3个班级,一个卡级(有数字和套装),一个甲板班(包含52张牌)和一个从洗牌的牌组中获得五张卡牌的Hand类。

Deck类有一个 shuffleDeck(); Hand类具有计算得分的功能(在我使用RegEx的这些功能中)。

我通过添加手牌的5个套装和数字来生成我使用 RegEx 的字符串。

这是一个好主意还是我应该采取另一种方式,如果是这样,怎么做?

感谢您的帮助

PS。我是一位没有经验的程序员,想要使用新学到的工具来实现一切

有帮助吗?

解决方案

我认为正则表达式不是解决这个问题的合适方法。您可能应该使用比字符串更复杂的手形表示。

其他提示

你没有提供太多的细节,但是从我读过的内容来看,我认为你并没有把OOP推得太远......

我会有一个具有Rank和Suit类实例的Card类。然后我会有一个处理改组/交易的甲板课......

然后我会有一个Hand类,它将包含n个Card对象的扑克牌......

通过这种方式,您可以构建规则来评估每个手对象,从而在未来更灵活,更具可扩展性...如果您想要制作另一个纸牌游戏/添加对另一个扑克变种的支持...

使用正则表达式来完成所有这些似乎是一个非常糟糕的选择。

我同意其他人的观点,即Regex似乎是一个糟糕的选择。它可能适用于成对,3种,4种。然而,一旦你开始看着像冲水,直道和2对这样的手,它可能会变得有点棘手(或不可能)。

我认为最好的解决方案是评估从最佳牌到最差牌的牌,如此处所示,一旦找到匹配,那就是你的手。这确保您不会误认为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代表套装,另一个代表卡片的数值。

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