Python石头剪刀布游戏player_score未定义报错修复及优化求助
报错修复方案
报错原因
NameError: name 'player_score' is not defined 错误触发的核心是变量作用域不匹配:
- 你仅在
score()函数内部定义了player_score和comput_score,这两个属于函数局部变量,只能在score()函数内部访问,全局作用域不存在这两个变量 play()函数中通过global声明调用全局的两个分数变量,自然找不到对应变量触发报错
修复步骤
- 删掉完全没用的
comput_score()函数和score()函数,前者的判断逻辑和你初始化comput的逻辑完全不匹配(你初始comput是直接从字符串数组取值,根本不会是'1'/'2'/'3'),后者没有被调用过,且和分数变量重名会引发命名冲突 - 在全局作用域直接初始化两个分数变量:
player_score = 0 comput_score = 0
- 修正累加分数的写法:你写的
comput_score = +1是直接将变量赋值为1,不是累加分数,要改成comput_score += 1,玩家分数的累加同理修正 - 将电脑出招的逻辑放到
play()函数内部,否则每次玩游戏电脑只会出同一个招,没有可玩性 - 删掉没用的导入语句
import tkinter as sg、import time,你全程没有用到这两个库
代码优化建议
- 简化胜负判断逻辑:不用写三层嵌套的if判断,直接用胜负映射表减少重复代码,示例如下:
# 键对应出招,值对应能被键击败的出招 win_rule = { "rock": "scissors", "paper": "rock", "scissors": "paper" } # 胜负判断只需要3行 if player == comput: print("平局") elif win_rule[player] == comput: print("玩家获胜") player_score +=1 else: print("电脑获胜") comput_score +=1
- 增加循环逻辑:现在代码只能玩一次就退出,加上
while True循环,玩家输入end时才break退出,实现连续游玩功能 - 增加输入校验:判断玩家输入内容是否是合法值,非法输入直接提示用户重新输入,避免触发异常
- 抽离重复的打印分数逻辑为单独函数,不用每次胜负判断后都重复写两遍打印代码
- 修正拼写错误:代码中多处把
computer拼成copmuter,可以统一修正
修复优化后的完整可运行代码
from random import randint OPTIONS = ["rock", "paper", "scissors"] WIN_RULE = { "rock": "scissors", "paper": "rock", "scissors": "paper" } player_score = 0 comput_score = 0 def print_score(): print(f"你的分数: {player_score}") print(f"电脑分数: {comput_score}") def play(): global player_score, comput_score while True: comput = OPTIONS[randint(0, 2)] player = input("选择石头/剪刀/布(输入end结束游戏): ").lower() if player == "end": print("游戏结束,最终得分:") print_score() break if player not in OPTIONS: print("输入无效,请输入rock/paper/scissors/end") continue print(f"电脑出了: {comput}") if player == comput: print("平局!") elif WIN_RULE[player] == comput: print(f"恭喜你赢了!{player} 击败 {comput}") player_score += 1 else: print(f"你输了!{comput} 击败 {player}") comput_score += 1 print_score() print("-"*30) if __name__ == "__main__": play() print("游戏退出成功")
内容的提问来源于stack exchange,提问作者Cage Free Lion
相关产品推荐
相关产品推荐

