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 动态生成多个非值班状态按钮