如何用Python统计Risk游戏所有骰子组合的胜负结果分布
Risk骰子游戏全组合统计实现方案
问题描述
我是编程新手,知识储备有限。现有如下场景:在Risk游戏中,玩家A掷3次骰子,玩家B掷2次骰子。取玩家A的两个最高点数与玩家B的两个点数分别比较:若A的最高点数大于B的最高点数,A得1分,否则(小于等于)B得1分;A的次高点数与B的次高点数比较规则相同。最终结果分为2:0、1:1、0:2三种。已知总骰子组合数为6^5=7776,其中2890种对应2:0,2611种对应1:1,2275种对应0:2。我已实现随机单次游戏的胜负判断,但不知道如何遍历所有组合并统计输出如“共有2890种可能获得2:0的胜利”这类统计信息,附上我的随机游戏代码:
import random r1 = random.randint(1,6) r2 = random.randint(1,6) r3 = random.randint(1,6) b1 = random.randint(1,6) b2 = random.randint(1,6) Points_A = 0 Points_B = 0 Dice_A = [r1,r2,r3] Dice_B = [b1,b2] print("results of A: ", Dice_A) print("results of B: ", Dice_B) A = sorted(Würfel_A) B = sorted(Würfel_B) if A[2] > B[1]: Points_A += 1 elif A[2] == B[1]: Points_B +=1 else: Points_B += 1 if A[1] > B[0]: Points_A += 1 elif A[1] == B[0]: Points_B += 1 else: Points_B += 1 print("A has ", Points_A, "Points.") print("B has ", Points_B, "Pionts.")
解决方案
要遍历所有骰子组合并统计结果,核心是生成所有可能的骰子取值组合,复用你的胜负判断逻辑,最后计数每种结果的出现次数。以下是两种实现方式:
方式1:嵌套循环实现(直观易懂)
def calculate_result(a_dice, b_dice): # 排序后取最高和次高点数 sorted_a = sorted(a_dice) sorted_b = sorted(b_dice) points_a = 0 points_b = 0 # 比较最高点数 if sorted_a[2] > sorted_b[1]: points_a += 1 else: points_b += 1 # 比较次高点数 if sorted_a[1] > sorted_b[0]: points_a += 1 else: points_b += 1 return (points_a, points_b) # 初始化三种结果的计数器 count_2_0 = 0 count_1_1 = 0 count_0_2 = 0 # 遍历玩家A的3个骰子所有可能取值(1-6) for a1 in range(1, 7): for a2 in range(1, 7): for a3 in range(1, 7): # 遍历玩家B的2个骰子所有可能取值(1-6) for b1 in range(1, 7): for b2 in range(1, 7): result = calculate_result([a1, a2, a3], [b1, b2]) # 根据结果更新计数器 if result == (2, 0): count_2_0 += 1 elif result == (1, 1): count_1_1 += 1 elif result == (0, 2): count_0_2 += 1 # 输出统计结果 print(f"共有{count_2_0}种可能获得2:0的胜利") print(f"共有{count_1_1}种可能获得1:1的平局") print(f"共有{count_0_2}种可能获得0:2的失败") print(f"总组合数验证:{count_2_0 + count_1_1 + count_0_2}")
方式2:用itertools简化循环(代码更简洁)
如果觉得嵌套循环太繁琐,可以用itertools.product生成所有组合,代码更简洁:
import itertools def calculate_result(a_dice, b_dice): sorted_a = sorted(a_dice) sorted_b = sorted(b_dice) points_a = 0 points_b = 0 if sorted_a[2] > sorted_b[1]: points_a += 1 else: points_b += 1 if sorted_a[1] > sorted_b[0]: points_a += 1 else: points_b += 1 return (points_a, points_b) count_2_0 = 0 count_1_1 = 0 count_0_2 = 0 # 生成玩家A的所有3骰子组合(每个骰子1-6) a_combinations = itertools.product(range(1, 7), repeat=3) # 生成玩家B的所有2骰子组合(每个骰子1-6) b_combinations = itertools.product(range(1, 7), repeat=2) # 遍历所有A和B的组合 for a_dice in a_combinations: for b_dice in b_combinations: result = calculate_result(a_dice, b_dice) if result == (2, 0): count_2_0 += 1 elif result == (1, 1): count_1_1 += 1 elif result == (0, 2): count_0_2 += 1 print(f"共有{count_2_0}种可能获得2:0的胜利") print(f"共有{count_1_1}种可能获得1:1的平局") print(f"共有{count_0_2}种可能获得0:2的失败") print(f"总组合数验证:{count_2_0 + count_1_1 + count_0_2}")
关键说明
- 把胜负判断逻辑封装成
calculate_result函数,避免重复代码,也方便后续修改规则。 - 两种方式本质都是遍历所有6^5=7776种组合,运行后会得到你提到的2890、2611、2275这三个数值。
- 最后加了总组合数验证,可以确认统计没有遗漏。
内容的提问来源于stack exchange,提问作者Leblock
相关产品推荐
相关产品推荐

