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

Python掷骰子程序roll函数返回None引发报错问题求助

掷骰子程序返回None崩溃的排查与解决

我写了个简单的掷骰子Python程序,运行几轮后偶尔会出现Player 1的掷骰结果返回None,导致程序报错终止,找不到原因。

程序错误输出截图:
程序错误输出截图

核心代码如下:

import random
from time import sleep

rounds = 5
delay = 1

playerTwoScore = 30
playerOneScore = 20

def roll():
 rollOne = random.randint(1,6)
 rollTwo = random.randrange(1,6)
 if rollOne == rollTwo:
   score = (rollOne + rollTwo) * 2
 else:
   score = rollOne + rollTwo
   return score


for i in range(rounds):
 playerOneRoll = roll()
 print("Player 1 rolled a",playerOneRoll)
 playerOneScore = int(playerOneScore) + int(playerOneRoll)
 print("Player 1's total score is",playerOneScore)
 print("----------------------------")
 sleep(delay)
 roll()
 playerTwoRoll = roll()
 print("Player 2 rolled a",playerTwoRoll)
 playerTwoScore = int(playerTwoScore) + int(playerTwoRoll)
 print("Player 2's total score is",playerTwoScore)
 print("----------------------------")
 sleep(delay)

问题根源

问题出在roll()函数的返回逻辑:

  • 当掷出两个相同点数(rollOne == rollTwo)时,函数只计算了score,但没写return语句,此时函数会默认返回None。
  • 只有两个点数不同时,函数才会返回计算好的score。
  • 另外循环里有一行多余的roll()调用,会浪费一次掷骰,但不是崩溃的直接原因。

修复方案

1. 修正roll()函数的返回逻辑

把return score移到if-else结构外面,确保不管掷出相同还是不同点数,函数都能返回正确的分数:

def roll():
 rollOne = random.randint(1,6)
 rollTwo = random.randrange(1,6)
 if rollOne == rollTwo:
   score = (rollOne + rollTwo) * 2
 else:
   score = rollOne + rollTwo
 return score  # 确保所有分支都有返回值

2. 移除多余的掷骰调用

循环中那行单独的roll()没有任何作用,直接删掉即可:

for i in range(rounds):
 playerOneRoll = roll()
 print("Player 1 rolled a",playerOneRoll)
 playerOneScore = int(playerOneScore) + int(playerOneRoll)
 print("Player 1's total score is",playerOneScore)
 print("----------------------------")
 sleep(delay)
 # 删掉这行多余的roll()
 playerTwoRoll = roll()
 print("Player 2 rolled a",playerTwoRoll)
 playerTwoScore = int(playerTwoScore) + int(playerTwoRoll)
 print("Player 2's total score is",playerTwoScore)
 print("----------------------------")
 sleep(delay)

3. 可选优化:统一骰子范围

注意到rollOne用的是random.randint(1,6)(闭区间,包含1-6),而rollTwo用的是random.randrange(1,6)(左闭右开,只有1-5),如果希望两个骰子都是1-6的点数,把rollTwo也改成random.randint(1,6)即可。

内容的提问来源于stack exchange,提问作者FireFin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 22:54:57