Python 猜杯子游戏:用列表索引实现经典“找O”互动小游戏
发布时间 - 2025-12-27 00:00:00 点击率:次本文教你用 python 实现一个简洁可靠的“找o”位置猜测游戏,通过随机打乱含空位和目标符号('o')的列表,验证用户输入索引是否命中目标,并支持循环重玩,彻底规避嵌套函数中的变量作用域问题。
这是一个经典的交互式小练习——模拟“猜杯子”游戏:三个位置中仅有一个藏有目标('O'),玩家输入索引(0、1 或 2)进行猜测,程序判断是否猜中。原代码的核心问题在于嵌套函数内对 guess 和 choice 的赋值未声明 nonlocal,且未将输入值正确返回并传递给外层逻辑,导致 guess 在 check_answer() 中仍为 None,引发 TypeError: list indices must be integers 错误。
以下是优化后的完整可运行版本,采用扁平化结构、清晰流程控制与健壮输入处理:
from random import shuffle
def cup_game():
# 预定义初始状态(使用大写 'O',避免与数字 0 混淆)
cups = ['', 'O', '']
while True:
# 每轮重置:打乱杯子顺序
shuffle(cups)
# 获取用户输入(带基础异常处理)
try:
guess = int(input("Select the position: 0, 1, or 2 → "))
if guess not in [0, 1, 2]:
print("⚠️ Invalid input! Please enter 0, 1, or 2.")
continue
except ValueError:
print("⚠️ Please enter a valid number.")
continue
# 判断结果
if cups[guess] == 'O':
print("✅ Correct choice! You found the O!")
else:
print("❌ Wrong choice. Better luck next time!")
print(f"Revealed layout: {cups}")
# 询问是否再玩一次
while True:
play_again = input("Play again? (0 to continue, 1 to quit) → ").strip()
if play_again == '0':
break # 退出内层循环,继续外层 while
elif play_again == '1':
print("? Thanks for playing!")
return # 结束整个游戏
else:
print("⚠️ Please enter '0' or '1'.")
# 启动游戏
if __name__ == "__main__":
cup_game()关键改进说明:
- ✅ 消除作用域陷阱:不再使用嵌套函数,所有变量在单一作用域内自然可见;
- ✅ 增强鲁棒性:添加 try-except 捕获非数字输入,避免程序崩溃;
- ✅ 明确用户反馈:区分提示语(✅/❌/⚠️)、显示真实布局、支持空格输入容错;
- ✅ 逻辑更直观:while True 主循环 + break/return 控制流,比递归调用 game() 更安全(避免栈溢出风险);
- ✅ 命名语义化:cups 比 my_list 更贴合游戏场景,提升可读性。
? 小贴士:若需扩展功能(如计分、难度升级、图形界面),建议将核心逻辑封装为独立函数(如 check_guess(cups, index)),便于单元测试与模块复用。切忌在函数内部修改外部作用域变量而不加 nonlocal 声明——这是初学者最常见的作用域误区之一。
# python
# 栈
# ai
# 作用域
# elif
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何在Tomcat中配置并部署网站项目?
Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】
如何破解联通资金短缺导致的基站建设难题?
Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】
JavaScript模板引擎Template.js使用详解
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】
Laravel如何实现密码重置功能_Laravel密码找回与重置流程
Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制
Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层
Swift中switch语句区间和元组模式匹配
打造顶配客厅影院,这份100寸电视推荐名单请查收
详解Android——蓝牙技术 带你实现终端间数据传输
UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】
米侠浏览器网页背景异常怎么办 米侠显示修复
美食网站链接制作教程视频,哪个教做美食的网站比较专业点?
Laravel如何使用Service Provider注册服务_Laravel服务提供者配置与加载
Laravel如何处理表单验证?(Requests代码示例)
INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】
网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?
laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法
详解CentOS6.5 安装 MySQL5.1.71的方法
Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制
Python图片处理进阶教程_Pillow滤镜与图像增强
免费视频制作网站,更新又快又好的免费电影网站?
如何快速搭建高效简练网站?
Laravel Octane如何提升性能_使用Laravel Octane加速你的应用
如何在搬瓦工VPS快速搭建网站?
Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】
如何确保FTP站点访问权限与数据传输安全?
Laravel事件监听器怎么写_Laravel Event和Listener使用教程
Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置
Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程
详解阿里云nginx服务器多站点的配置
LinuxCD持续部署教程_自动发布与回滚机制
浅谈redis在项目中的应用
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
Laravel如何使用Blade模板引擎?(完整语法和示例)
千库网官网入口推荐 千库网设计创意平台入口
Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程
网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?
如何在橙子建站上传落地页?操作指南详解
Laravel如何自定义错误页面(404, 500)?(代码示例)
Python自然语言搜索引擎项目教程_倒排索引查询优化案例
Windows Hello人脸识别突然无法使用
如何快速生成ASP一键建站模板并优化安全性?
javascript中的数组方法有哪些_如何利用数组方法简化数据处理
JS经典正则表达式笔试题汇总
jQuery validate插件功能与用法详解
如何为不同团队 ID 动态生成多个非值班状态按钮


# 启动游戏
if __name__ == "__main__":
cup_game()