当前位置: 首页 > news >正文

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.dtcms.com/a/193440.html

相关文章:

  • 山东大学计算机图形学期末复习整理5——CG10上
  • 司法系统之外的第三方平台未经许可披露企业涉诉信息是否构成侵权
  • CodeBuddy编程新范式
  • 动态规划-状态压缩DP
  • Java并发编程:synchronized机制
  • vue2 根据不同路由url设置不同的网页背景颜色
  • android display 笔记(十四)VAU 和GSP 分别代表什么
  • 谷歌量子计算机:开启计算新纪元
  • 鸿蒙OSUniApp 实现的表单验证与提交功能#三方框架 #Uniapp
  • 2021-10-25 C++三的倍数含五
  • 【图片识别工具】批量单据识别批量重命名,批量OCR识别图片文字并重命名,批量改名工具的使用步骤和注意事项
  • OpenCv高阶(4.0)——案例:海报的透视变换
  • 无需付费,安装就能使用!
  • 高效电脑隐私信息清理实用工具
  • 贪吃蛇游戏消息通知功能开发全解析
  • iptables 防火墙
  • Java中Money类的使用及与BigDecimal的对比
  • 软考软件评测师——计算机组成与体系结构
  • Sumsub 活体检测与人证对比 Java Demo
  • zabbix7.2 zabbix-agent自动注册 被动模式(五)
  • 层序遍历(BFS)核心逻辑:从二叉树到复杂题型的一通百通
  • 初识Linux · IP分片
  • 牛客网 NC22167: 多组数据a+b
  • ROS--NAVI DWA
  • 牛客网刷题:NC208813求逆序数
  • 深度学习之用CelebA_Spoof数据集搭建一个活体检测-一些模型训练中的改动带来的改善
  • Linux系统——进程结束时退出的分析与总结(关于wait与waitpid函数)
  • 扣子(Coze)案例:工作流生成小红书心理学卡片
  • 测序的原理
  • 鸿蒙OSUniApp 实现的地图定位与导航功能#三方框架 #Uniapp