Python实战案例:打造趣味猜拳小游戏

Python实战案例:猜拳小游戏


文章目录

  • Python实战案例:猜拳小游戏
    • 一、案例背景
    • 二、代码实现
    • 三、代码解析
      • 3.1 执行过程
      • 3.2 流程图
    • 四、案例总结
      • 1. 核心知识点运用
      • 2. 编程思维提升


一、案例背景

猜拳游戏(石头剪刀布)是一款规则简单却极具策略性的经典对决游戏,几乎人人都能快速上手。
对于编程学习者而言,通过实现这一游戏,能够深度理解条件判断循环控制数据结构等核心编程概念,同时锻炼逻辑思维与代码调试能力。
本文将从基础规则出发,逐步完成一个具备输入验证、胜负判定、战绩统计的完整猜拳小游戏案例。

游戏规则
游戏中双方需在 石头、剪刀、布 三种手势中选择其一,胜负判定规则如下:

  1. 石头剪刀 (石头砸坏剪刀)
  2. 剪刀 (剪刀剪碎布)
  3. 石头 (布包裹石头)
  4. 若双方手势相同,则判定为 平局

通过将现实规则转化为代码逻辑,可以锻炼我们将抽象生活场景转换为程序模型的能力。
接下来,让我们看看如何用Python代码模拟实现猜拳小游戏。


二、代码实现

本案例代码需要使用random模块相关方法, 所以需先导入模块。

import random# 游戏初始化
# 定义游戏规则:键代表玩家选择,值代表该选择能击败的对象
game_rules = {'石头': '剪刀', '剪刀': '布', '布': '石头'}
# 从游戏规则中提取所有可用的选择项
choices = list(game_rules.keys())
# 初始化历史战绩统计字典
history = {'赢': 0,  # 记录胜利次数'输': 0,  # 记录失败次数'平局': 0,  # 记录平局次数'回合数': 0,  # 记录总游戏回合数'胜率': '0%'  # 记录当前胜率
}
# 定义打印分隔线的格式
spec = '=^30'  # 格式(居中,宽度30,用=填充)# 打印游戏开始信息
print('\n欢迎来到猜拳小游戏.\n')
print(f"{'游戏开始':{spec}}\n")  # 使用定义好的格式打印"游戏开始"
print("当前第1回合".center(30, '-'))  # 使用字符串格式化方法打印当前回合数# 主游戏循环
while True:# 获取用户输入# strip()去除首尾空格,lower()转换为小写user_select = input('请输入你的选择--石头/剪刀/布(输入Q退出): ').strip().lower()# 检查用户是否选择退出if user_select == 'q':      # 使用定义好的格式打印"游戏退出"print(f"\n{'游戏退出':{spec}}")# 打印历史战绩print(f"历史战绩: 回合数 {history['回合数']} | 胜利 {history['赢']} |"f" 失败 {history['输']} | 平局 {history['平局']} | 胜率 {history['胜率']}\n")break  # 退出游戏循环   # 验证用户输入是否有效if user_select not in choices:print('选择输入错误,请重新输入(输入Q退出)')continue  # 跳过当前循环,重新获取输入# 电脑随机选择一个选项pc_select = random.choice(choices)# 判断游戏结果# 平局情况if user_select == pc_select:history['平局'] += 1  # 平局次数加1print(f'\n平局! 你:{user_select} vs 电脑:{pc_select}')else:# 获胜情况:检查玩家的选择是否能击败电脑的选择if game_rules[user_select] == pc_select:history['赢'] += 1  # 胜利次数加1print(f'\n你赢了! 你:{user_select} 击败 电脑:{pc_select}')else:# 失败情况history['输'] += 1  # 失败次数加1print(f'\n你输了! 电脑:{pc_select} 击败 你:{user_select}')# 更新回合数history['回合数'] += 1# 计算并更新胜率(避免除以零的错误)if history['回合数'] > 0:# 计算胜率winning_rate = history['赢'] / history['回合数']# 将胜率转换为百分比格式字符串history['胜率'] = f"{winning_rate:.1%}"# 打印当前战绩print(f"当前战绩:胜利 {history['赢']} | 失败 {history['输']} |"f" 平局 {history['平局']} | 胜率 {history['胜率']}\n")# 使用定义好的格式打印"游戏继续"print(f"{'游戏继续':{spec}}\n")# 使用字符串格式化方法打印当前回合数print(f"当前第{history['回合数'] + 1}回合".center(30, '-'))  

三、代码解析

3.1 执行过程

  1. 游戏初始化

    • 定义游戏规则字典game_rules,明确石头克剪刀、剪刀克布、布克石头。
    • 从规则中提取所有可用选择(石头、剪刀、布)存入choices列表。
    • 初始化历史战绩字典history,记录胜负平次数、回合数和胜率。
    • 设置打印格式spec用于美化输出。
    • 打印游戏开始信息和当前回合数(第1回合)。
  2. 主游戏循环

    • 通过while True创建无限循环,直到用户主动退出。
    • 获取用户输入并处理:
      • 去除输入首尾空格并转为小写。
      • 若输入为q,则打印游戏退出信息和完整历史战绩,然后终止循环。
      • 若输入无效(不在选择列表中),提示错误并继续循环。
  3. 游戏逻辑处理

    • 电脑从choices中随机选择一项。
    • 判断游戏结果:
      • 若用户和电脑选择相同,记录平局。
      • 否则根据game_rules判断胜负:用户选择能击败电脑选择则获胜,否则失败。
    • 更新历史战绩:
      • 增加相应的胜负平次数。
      • 更新总回合数。
      • 计算并更新胜率(格式化为百分比,保留1位小数)。
  4. 结果展示与循环

    • 打印当前回合结果(胜/负/平)。
    • 显示当前战绩统计。
    • 打印游戏继续信息和下一回合编号,继续循环。

3.2 流程图


四、案例总结

1. 核心知识点运用

  • 基础语法:条件判断(if-elif-else)、循环(while)、输入输出(input/print)。
  • 数据结构:字典(存储规则和战绩)、列表(存储合法手势)。
  • 实用技巧:字符串格式化、随机数生成(random.choice)、输入验证逻辑。

2. 编程思维提升

  • 抽象能力:将现实规则(石头剪刀布克制关系)转化为代码可处理的字典结构。
  • 健壮性设计:通过输入验证和异常处理(如避免除零错误)提升程序稳定性。
  • 交互式设计:合理使用分隔线和实时反馈,增强交互友好性。

通过本案例,我们可清晰看到如何从简单规则逐步构建功能完整的程序,该案例适合作为Python入门的实战练手项目。
在编程学习中,实现经典小游戏是掌握基础语法和逻辑思维的最佳方式。快来动手尝试自己实现代码功能,体验编程与游戏结合的乐趣吧!



关注「安于欣」获取更多Python技巧

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/83212.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MCP:重塑AI交互的通用协议,成为智能应用的基础设施

目录: 为什么我们需要一个AI世界的USB-C?MCP的核心架构与工作原理MCP如何解决当前AI生态系统的碎片化问题从代码到实践:构建基于MCP的智能应用MCP的未来:从工具到生态为什么我们需要一个AI世界的USB-C? 还记得在USB-C标准普及之前,我们的数字生活是什么样子吗?抽屉里塞…

如何保证RabbitMQ消息的顺序性?

保证RabbitMQ消息的顺序性是一个常见的需求,尤其是在处理需要严格顺序的消息时。然而,默认情况下,RabbitMQ不保证消息的全局顺序,因为消息可能会通过不同的路径(例如不同的网络连接或线程)到达队列&#xf…

HTML-2.2 列表--无序列表、有序列表、定义列表

本系列可作为前端学习系列的笔记,代码的运行环境是在HBuilder中,小编会将代码复制下来,大家复制下来就可以练习了,方便大家学习。小编作为新晋码农一枚,会定期整理一些写的比较好的代码,作为自己的学习笔记…

Vuex和Vue的区别

Vue和Vuex有着不同的功能和定位,主要区别如下: 概念与功能 - Vue:是一个构建用户界面的JavaScript框架,专注于视图层的开发,采用组件化的方式构建应用程序,通过数据绑定和指令系统,能方便地…

数据可视化-----子图的绘制及坐标轴的共享

目录 绘制固定区域的子图 (一)、绘制单子图 subplot()函数 Jupyter Notebook的绘图模式 (二)、多子图 subplots()--可以在规划好的所有区域中一次绘制多个子图 (三)、跨行跨列 subplot2grid()---将整…

基于Qt6 + MuPDF在 Arm IMX6ULL运行的PDF浏览器——MuPDF Adapter文档

项目地址:总项目Charliechen114514/CCIMXDesktop: This is a Qt Written Desktop with base GUI Utilities 本子项目地址:CCIMXDesktop/extern_app/pdfReader at main Charliechen114514/CCIMXDesktop 前言 这个部分说的是Mupdf_adaper下的文档的工…

Linux 防火墙 firewalld 实战配置教程!

最近工作上处理了很多关系配置服务器防火墙的操作,于是想写一篇理论与实践并存的文章,在这里分享给大家,希望对您有所帮助! 主要包括以下几部分内容: 防火墙概述 firewalld原理框架 与iptables的异同点 firewalld常…

C#发送文件到蓝牙设备

测试环境: visual studio 2022 win11笔记本电脑,具有蓝牙功能 .net6控制台 测试步骤如下: 1 新增名为BluetoothDemo控制台项目 2 通过nuget安装InTheHand.Net.Bluetooth,版本选择4.2.1和安装InTheHand.Net.Obex,版…

初识 Pandas:Python 数据分析的利器

在数据分析、数据清洗和可视化等领域,Python 无疑是最受欢迎的语言之一,而在 Python 的数据处理生态中,Pandas 是最核心、最基础的库之一。如果你接触数据分析、机器学习、金融建模,或者只是想处理一些 Excel 表格,那么…

SpringBoot项目使用POI-TL动态生成Word文档

近期项目工作需要动态生成Word文档的需求,特意调研了动态生成Word的技术方案。主要有以下两种: 第一种是FreeMarker模板来进行填充;第二种是POI-TL技术使用Word模板来进行填充; 以下是关于POI-TL的官方介绍 重点关注&#xff1…

fakeroot 在没有超级用户权限的情况下模拟文件系统的超级用户行为

fakeroot 是一个在 Linux 环境中使用的工具,它允许用户在没有超级用户权限的情况下模拟文件系统的超级用户行为。它是一个在 Linux 环境中广泛使用的工具,通常包含在大多数 Linux 发行版的软件仓库中。‌ 主要功能 ‌模拟 root 权限‌:fake…

Spring Spring Boot 常用注解整理

Spring & Spring Boot 常用注解整理 先理解核心概念:什么是注解(Annotation)?第一部分:IOC(控制反转)和 DI(依赖注入)1. Component2. Service, Repository, Controll…

AIGC与数字媒体实验室解决方案分享

第1部分 概述 1.1 建设目标 1.深度融合AIGC技术,培养能够驾驭新质生产力的数字媒体人才 通过引入前沿的AIGC技术,确保学生能够接触到最先进的人工智能应用。教学内容理论和实践结合,让学生在实际操作中熟练掌握AIGC工具,生成高…

讯联云库项目开发日志(二)AOP参数拦截

目录 利用AOP实现参数拦截: 一、​​HTTP请求进入Controller​(发送邮件验证码) 二、AOP切面触发 1. 切面拦截(GlobalOperactionAspect.class) method.getAnnotation()​​ null interceptor 判断​​ 2.参数校验注解 3. 参…

用OBD部署OceanBase社区版的避坑指南

以下是用OBD黑屏部署 OceanBase社区版时容易碰到的几个问题及解决思路,供大家参考。 一、 遇坑步骤:用yaml文件部署集群: obd cluster deploy obtest -c mini-single-example.yaml 报错: Package oceanbase-ce-4.2.1.8-108000…

无锡哲讯科技:引领芯片封装SAP系统的智能化革命

芯片封装行业的数字化转型 在全球半导体产业高速发展的今天,芯片封装作为产业链的关键环节,直接影响着芯片的性能、可靠性和成本。随着5G、人工智能、物联网等技术的普及,市场对芯片的需求激增,封装企业面临着效率提升、良率优…

从海洋生物找灵感:造个机器人RoboPteropod,它能在水下干啥?

大家好!在如今人类对水下环境探索不断深入的时代,从水下考古到珊瑚礁考察,各种任务都离不开水下机器人的助力。但传统水下机器人尺寸较大,在狭窄的水下空间施展不开。今天,我们就来认识一款受海洋小生物启发而设计的仿…

区块链blog1__合作与信任

🍂我们的世界 🌿不是孤立的,而是网络化的 如果是单独孤立的系统,无需共识,而我们的社会是网络结构,即结点间不是孤立的 🌿网络化的原因 而目前并未发现这样的理想孤立系统,即现实中…

Linux服务之lvs+keepalived nginx+keepalived负载均衡实例解析

目录 一.LVSKeepAlived高可用负载均衡集群的部署 二.NginxKeepAlived高可用负载均衡集群的部署 一.LVSKeepAlived高可用负载均衡集群的部署 实验环境 主keepalived:192.168.181.10 lvs (7-1) 备keepalived:192.168.181.10…

50天50个小项目 (Vue3 + Tailwindcss V4) ✨ |搭建项目框架

🖤 一个专注于「Vue3 TailwindCSS」的 50 天极简开发挑战,探索组件边界,打磨技术锋芒。 🎉 欢迎来到 50 个小项目的第一天!今天我们将从零开始搭建一个 Vue3 项目,并引入 Tailwind CSS v4,为后…