如何用变量与掷骰方法实现骰子结果对比及代码问题排查
问题原因及修复方案
核心错误点
- 变量作用域与缩进错误:
count_number_of_wins函数内的计数变量(die_A_larger等)仅在函数内部可见,但循环代码缩进错误,脱离了函数体,导致循环无法访问这些变量;同时函数未执行循环就直接返回初始值,完全没实现掷骰子对比逻辑。 - 类属性与索引错误:
die类的roll方法误用了未定义的self.sides属性,正确属性应为self.side_values;且np.random.randint(1,7)生成1-6的整数,而列表索引是0-5,会触发索引越界异常。 - 对象比较逻辑错误:直接对比骰子对象(
A > B)而非掷出的点数,必须调用roll()方法获取每次的点数后再比较。 - 断言逻辑错误:
determine_best_die中的断言错误,die是自定义类实例,不是列表,应检查die.side_values的长度是否为6。
修复后的完整代码
import numpy as np class die: def __init__(self, side_values=[1,2,3,4,5,6]): self.side_values = side_values def roll(self): # 修复:使用正确的属性名,且索引范围改为0-5 i = np.random.randint(0, 6) return self.side_values[i] # 定义骰子与对比次数 A = die([3,3,3,3,3,6]) B = die([2,2,2,5,5,5]) C = die([1,4,4,4,4,4]) nmax = 5782 def count_number_of_wins(die_x, die_y): die_x_larger = 0 die_y_larger = 0 equal_count = 0 # 修复:循环缩进至函数内部,每次掷骰子后对比点数 for _ in range(nmax): x_roll = die_x.roll() y_roll = die_y.roll() if x_roll > y_roll: die_x_larger += 1 elif x_roll < y_roll: die_y_larger += 1 else: equal_count += 1 return (die_x_larger, die_y_larger, equal_count) # 执行所有对比并输出结果 a_vs_b = count_number_of_wins(A, B) a_vs_c = count_number_of_wins(A, C) b_vs_c = count_number_of_wins(B, C) print(f"A vs B: A胜{a_vs_b[0]}次,B胜{a_vs_b[1]}次,平局{a_vs_b[2]}次") print(f"A vs C: A胜{a_vs_c[0]}次,C胜{a_vs_c[1]}次,平局{a_vs_c[2]}次") print(f"B vs C: B胜{b_vs_c[0]}次,C胜{b_vs_c[1]}次,平局{b_vs_c[2]}次") def determine_best_die(dice): # 修复:断言检查骰子的面数是否为6 assert all(len(d.side_values) == 6 for d in dice) wins = [0] * len(dice) for i in range(len(dice)): for j in range(i+1, len(dice)): x_wins, y_wins, _ = count_number_of_wins(dice[i], dice[j]) if x_wins > y_wins: wins[i] += 1 elif y_wins > x_wins: wins[j] += 1 # 平局时双方都不增加胜场计数 # 找出胜场最多的骰子索引 max_wins = max(wins) if max_wins == len(dice)-1: return wins.index(max_wins) return -1 # 可选:调用最佳骰子判断函数 best_idx = determine_best_die([A, B, C]) print(f"最佳骰子索引(0=A,1=B,2=C):{best_idx}")
修复说明
- 类方法修复:将
roll方法中的属性改为self.side_values,并把随机索引范围调整为0-5,避免越界。 - 函数逻辑修复:把循环代码缩进至
count_number_of_wins函数内部,每次循环调用两个骰子的roll()方法获取点数,再进行对比计数。 - 对比逻辑修复:替换对象直接比较为点数比较,确保每次对比的是实际掷出的结果。
- 断言修复:修改断言逻辑,检查骰子实例的
side_values长度是否为6,符合需求。 - 结果输出优化:增加了所有对比组合的结果输出,直接展示A/B、A/C、B/C的胜负平次数。
内容的提问来源于stack exchange,提问作者Math26n
相关产品推荐
相关产品推荐

