Python新手求助:双骰子掷骰循环程序的打印次数及结果计数实现
解决方案:双骰子掷骰统计程序
嗨,你已经有了不错的开头,不过要实现计数功能,核心要点是把计数器初始化在while循环外面(不然每次循环都会重置为0,完全没法累计统计),然后在每次符合对应条件时给计数器加1。下面是完整的实现代码,我会一步步拆解关键逻辑:
完整代码
import random # 定义骰子面数,这里默认用6面骰子 sides = 6 # 初始化所有计数器,必须放在循环外部! total_rolls = 0 odds_count = 0 # 两个骰子均为奇数的次数(包含奇数对子) evens_count = 0 # 两个骰子均为偶数的次数(包含偶数对子) doubles_count = 0 # 所有对子的总次数(无论奇偶) # 各打印内容的专属计数器 snake_eyes_print = 0 evens_doubles_sum_print = 0 evens_doubles_highroll_print = 0 evens_doubles_print = 0 evens_only_print = 0 odds_doubles_print = 0 odds_only_print = 0 mixed_roll_print = 0 condition2 = False while not condition2: total_rolls += 1 # 每次循环对应一次掷骰,总次数加1 die1 = random.randint(1, sides) die2 = random.randint(1, sides) # 先判断是否掷出对子 is_double = (die1 == die2) if is_double: doubles_count += 1 # 对子计数加1 # 判断当前掷骰属于双偶、双奇还是混合奇偶 both_even = (die1 % 2 == 0) and (die2 % 2 == 0) both_odd = (die1 % 2 != 0) and (die2 % 2 != 0) if both_even: evens_count += 1 # 处理偶数类的打印逻辑 if is_double: if die1 + die2 == sides: # 按你原代码的逻辑判断和为sides的偶数对子 print(f"die #1 is *{die1}* and die #2 is *{die2}* Evens! Doubles! Sum is size value!") evens_doubles_sum_print += 1 elif die1 == 6 and die2 == 6: print(f"die #1 is *{die1}* and die #2 is *{die2}* Evens! Doubles! High Roll!") evens_doubles_highroll_print += 1 else: print(f"die #1 is *{die1}* and die #2 is *{die2}* Evens! Doubles!") evens_doubles_print += 1 else: print(f"die #1 is *{die1}* and die #2 is *{die2}* Evens!") evens_only_print += 1 elif both_odd: odds_count += 1 # 处理奇数类的打印逻辑 if is_double: if die1 == 1 and die2 == 1: print(f"die #1 is *{die1}* and die #2 is *{die2}* Snake Eyes!") snake_eyes_print += 1 condition2 = True # 掷出Snake Eyes,终止循环 else: print(f"die #1 is *{die1}* and die #2 is *{die2}* Odds! Doubles!") odds_doubles_print += 1 else: print(f"die #1 is *{die1}* and die #2 is *{die2}* Odds!") odds_only_print += 1 else: # 一奇一偶的混合情况,不属于你定义的Odds或Evens print(f"die #1 is *{die1}* and die #2 is *{die2}* Mixed Roll!") mixed_roll_print += 1 # 循环结束后输出所有统计结果 print("\n=== 掷骰统计结果 ===") print(f"总掷骰次数: {total_rolls}") print(f"双奇结果次数: {odds_count}") print(f"双偶结果次数: {evens_count}") print(f"对子总次数: {doubles_count}") print("\n=== 打印内容次数统计 ===") print(f"Snake Eyes 打印次数: {snake_eyes_print}") print(f"Evens+Doubles+Sum 打印次数: {evens_doubles_sum_print}") print(f"Evens+Doubles+High Roll 打印次数: {evens_doubles_highroll_print}") print(f"Evens+Doubles 打印次数: {evens_doubles_print}") print(f"仅Evens 打印次数: {evens_only_print}") print(f"Odds+Doubles 打印次数: {odds_doubles_print}") print(f"仅Odds 打印次数: {odds_only_print}") print(f"混合奇偶掷骰打印次数: {mixed_roll_print}")
关键逻辑说明
- 计数器初始化:所有统计用的变量必须放在
while循环外面,否则每次循环都会重置为0,完全无法累计数据。 - 总掷骰次数统计:每次进入循环就执行
total_rolls +=1,因为每次循环对应一次完整的掷骰操作。 - 分类计数:
- 先判断是否是对子,统一维护
doubles_count; - 再区分双偶、双奇、混合奇偶三类,分别给
evens_count和odds_count累计;
- 先判断是否是对子,统一维护
- 打印次数统计:每执行一次
print语句,就给对应的打印计数器加1,这样就能精准统计每种输出的出现次数。 - 循环终止条件:当掷出双1(Snake Eyes)时,将
condition2设为True,循环自动终止。
修正的原代码问题
- 你原代码里的
random.randint(1,sides+1)是错误的,randint是左右闭区间,6面骰子应该用random.randint(1, sides); - 原代码里的
die1 + die1 == die2逻辑有误,我改成了用is_double变量统一判断对子,逻辑更清晰。
内容的提问来源于stack exchange,提问作者altalio
相关产品推荐
相关产品推荐

