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
相关产品推荐
相关产品推荐

