确定掷骰子是否包含某些组合?

2 投票
3 回答
1436 浏览
提问于 2025-04-16 05:06

我正在用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

把数据整理成一个字典,格式是 值: 计数,然后检查里面是否有不同的模式。

撰写回答