You need to enable JavaScript to run this app. Python石头剪刀布游戏player_score未定义报错修复及优化求助
优惠活动
大模型
产品
解决方案
定价
更多

Python石头剪刀布游戏player_score未定义报错修复及优化求助

报错修复方案

报错原因

NameError: name 'player_score' is not defined 错误触发的核心是变量作用域不匹配:

  • 你仅在score()函数内部定义了player_score和comput_score,这两个属于函数局部变量,只能在score()函数内部访问,全局作用域不存在这两个变量
  • play()函数中通过global声明调用全局的两个分数变量,自然找不到对应变量触发报错

修复步骤

  1. 删掉完全没用的comput_score()函数和score()函数,前者的判断逻辑和你初始化comput的逻辑完全不匹配(你初始comput是直接从字符串数组取值,根本不会是'1'/'2'/'3'),后者没有被调用过,且和分数变量重名会引发命名冲突
  2. 在全局作用域直接初始化两个分数变量:
player_score = 0
comput_score = 0
  1. 修正累加分数的写法:你写的comput_score = +1是直接将变量赋值为1,不是累加分数,要改成comput_score += 1,玩家分数的累加同理修正
  2. 将电脑出招的逻辑放到play()函数内部,否则每次玩游戏电脑只会出同一个招,没有可玩性
  3. 删掉没用的导入语句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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 02:36:05