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

Python开发掷骰子赛跑游戏报错NameError: name 'random_roll_1'未定义求助

掷骰子赛跑游戏问题修复

报错直接原因

NameError: name 'random_roll_1' is not defined是因为函数内部的变量是局部作用域,仅在函数内部有效。你在roll_die函数里返回了随机点数,但调用函数时没有用变量接收返回值,直接使用函数内部的变量名自然找不到。

其他需要修复的逻辑问题

  • update_position每次调用都会把玩家位置重置为0,无法累计点数;同时整数和字符串直接拼接会触发类型错误
  • check_game_over没有完整的函数定义,只有半截判断语句
  • opponent函数每次调用都会重置p1_move=True,永远只会轮到玩家1行动,无法切换回合
  • 主函数中player_1_position、p1_move等变量没有提前定义就直接传入其他函数,会触发更多未定义报错
  • 拼写错误:玩家2回合判断写了小写的true(Python布尔值为True),display_state中player_2_position拼错为player_2_positon

修复后完整代码

import random
from random import randint

def roll_die(p1_move,p2_move):
    if p1_move is True:
        input('Press enter to roll the die for player 1')
        random_roll = randint(1,6)
        print(f'Player 1 rolled {random_roll}')
        return random_roll
    elif p2_move is True:
        input('Press enter to roll the die for player 2')
        random_roll = randint(1,6)
        print(f'Player 2 rolled {random_roll}')
        return random_roll

def update_position(current_position, roll):
    max_score = 8
    if current_position + roll > max_score:
        print('The roll was too high, player stays in the same spot')
        return current_position
    else:
        current_position += roll
        print(f'Player moved up {roll} spots!')
        return current_position

def check_game_over(player_1_position, player_2_position):
    max_score = 8
    if player_1_position == max_score:
        print('Player 1 has won!')
        print('Thank you for playing!')
        return False
    elif player_2_position == max_score:
        print('Player 2 has won!')
        print('Thank you for playing!')
        return False
    return True

def opponent(p1_move, p2_move):
    if p1_move is True:
        roll = roll_die(p1_move, p2_move)
        p1_move = False
        p2_move = True
        return roll, p1_move, p2_move
    elif p2_move is True:
        roll = roll_die(p1_move, p2_move)
        p1_move = True
        p2_move = False
        return roll, p1_move, p2_move

def display_state(player_1_position, player_2_position):
    print(f'Player 1 is in {player_1_position} spot')
    print(f'Player 2 is in {player_2_position} spot')

def main():
    # 初始化所有全局状态
    continue_game = True
    player_1_position = 0
    player_2_position = 0
    p1_move = True
    p2_move = False
    while continue_game:
        current_roll, p1_move, p2_move = opponent(p1_move, p2_move)
        # 根据当前回合更新对应玩家位置
        if p2_move: # 刚走完玩家1的回合,现在轮到p2,所以更新p1的位置
            player_1_position = update_position(player_1_position, current_roll)
        else: # 刚走完玩家2的回合,更新p2的位置
            player_2_position = update_position(player_2_position, current_roll)
        display_state(player_1_position, player_2_position)
        continue_game = check_game_over(player_1_position, player_2_position)

if __name__ == "__main__":
    main()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 10:15:03