You need to enable JavaScript to run this app. Python石头剪刀布游戏开发:函数实现电脑出招及choices未定义报错处理
优惠活动
大模型
产品
解决方案
定价
更多

Python石头剪刀布游戏开发:函数实现电脑出招及choices未定义报错处理

报错原因拆解
  • 触发choices未定义报错的核心是Python的变量作用域规则:在函数缩进块内部定义的变量属于局部变量,仅能在函数自身的代码范围内访问,外部循环的代码逻辑完全无法读取到写在aiChoice函数内部的choices列表。
  • 编写的aiChoice函数本身存在逻辑漏洞:函数内连续写了两个return语句,第一个return choices执行后函数会直接终止运行,后面的return com_choice永远不会被执行,完全无法实现“生成电脑出招”的设计目的。
正确实现方案
  • 将固定的出招可选列表choices定义在全局作用域(所有函数、循环的外部位置),确保所有代码块都能正常访问该变量。
  • 修正aiChoice函数逻辑:移除冗余的返回choices列表的语句,仅保留随机选取出招值、最终返回出招结果的逻辑,匹配项目要求的“专用函数生成电脑出招”的规则。
  • 替换循环内重复的随机出招逻辑:删除原本写在循环里的random.choice(choices)代码,改为直接调用已经写好的aiChoice函数获取电脑出招值,减少重复代码。
修正后可正常运行的参考代码
import random

# 全局定义可选出招列表,解决作用域导致的未定义报错
choices = ['r', 'p', 's']
draw = 0
games = 3 # 替换为项目中实际设置的总局数变量

def aiChoice():
    com_choice = random.choice(choices)
    # 仅返回电脑随机生成的出招结果
    return com_choice


for i in range(games):
    print(f"Match {i+1}, trust your instinct")
    while True:
        user_play = input("Select r, p, or s: ")
        # 全局定义的choices可直接访问,不会触发未定义报错
        if user_play in choices:
            break
        print("Please enter only r, p, or s")

    # 调用专用函数获取电脑出招,符合项目设计要求
    com_choice = aiChoice()
    print(com_choice)
    
    if user_play == com_choice:
        print('Draw!')
        draw = draw + 1

补充说明:将重复使用的固定列表定义在全局位置,除了能解决作用域报错外,还能避免每次调用函数都重复创建相同列表的冗余操作,提升代码运行效率。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.26 00:45:03