You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 10:01:16