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

