确定掷骰子是否包含某些组合?
我正在用Python写一个骰子游戏模拟器。我用一个包含1到6的整数的列表来表示一次掷骰子的结果。所以我可能会有这样的结果:
[1,2,1,4,5,1]
我需要判断这个结果中是否包含得分组合,比如三条、四条、两组三条和顺子。
有没有简单的Python方法可以做到这一点?我尝试了几种方法,但都显得很复杂。
3 个回答
2
我之前写过类似的代码(不过是用来处理扑克的牌)。在编码游戏规则时,代码的复杂性是不可避免的。比如,检查“n个相同”的牌的代码和检查“顺子”的代码就完全不同。
先来看看“n个相同”的情况。正如其他人所建议的,创建一个 dict
来记录每个元素的数量。然后:
counts = sorted(d.values())
if counts[-1] == 4:
return four_of_a_kind
if counts[-1] and counts[-2] == 3:
return two_sets_of_three
# etc.
而检查“顺子”则需要另一种方法。当你检查“n个相同”时,你需要获取数量并忽略具体的值。现在我们需要关注值,而忽略数量:
ranks = set(rolls)
if len(ranks) == 6: # all six values are present
return long_straight
# etc.
一般来说,你应该能够识别出一些相似的规则,把那些规则的代码抽象出来,然后每个规则只写几行代码。有些规则可能是完全独特的,无法和其他规则共享代码。这就是事情发展的自然规律。
2
有两种方法可以做到这一点:
def getCounts(L):
d = {}
for i in range(1, 7):
d[i] = L.count(i)
return d # d is the dictionary which contains the occurrences of all possible dice values
# and has a 0 if it doesn't occur in th roll
这一种方法的灵感来自于Ignacio Vazquez-Abrams和dkamins。
def getCounts(L):
d = {}
for i in set(L):
d[i] = L.count(i)
return d # d is the dictionary which contains the occurrences of
# all and only the values in the roll
4
把数据整理成一个字典,格式是 值: 计数
,然后检查里面是否有不同的模式。