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

Python——石头剪刀布(附源码+多模式二改优化版)

编程初学者通常会从简单的项目开始,以建立基础并增强信心。石头剪刀布游戏是一个很好的起点,因为它涉及到基本的逻辑判断、用户输入处理和随机数生成。本文将详细介绍如何使用Python编写一个石头剪刀布游戏,并提供完整的代码和解释。

目录

一、游戏介绍

二、基本代码解析与实现

2.1代码解释

三、多模式版代码实现与解析

3.1导入模块

3.2安装numpy模块的函数

3.3检查并安装numpy模块的函数

3.4显示选择的函数

3.5获取玩家选择的函数

3.6判断胜负的函数

3.7显示进度条的函数

3.8锦标赛模式的函数

3.9单局游戏模式的函数

3.10主函数

3.11程序入口

3.12完整代码

四、实现原理

五、总结


一、游戏介绍

石头剪刀布是一种两人游戏,玩家通过选择石头、剪刀或布来相互竞争。在这个Python实现的版本中,玩家将与计算机对战,计算机会随机选择一个手势,然后根据石头剪刀布的规则判断胜负。

二、基本代码解析与实现

以下是实现石头剪刀布游戏的Python代码,我们将逐步解析每个部分。

import subprocess
import sys
import randomdef install(package):subprocess.check_call([sys.executable, "-m", "pip", "install", package])def check_numpy():try:import numpyexcept ImportError:print("numpy 未安装,正在安装...")install("numpy")print("numpy 安装完成!")def display_choices():print("请选择:")print("1. 石头")print("2. 剪刀")print("3. 布")print("输入 '0' 退出游戏")def get_player_choice():while True:player_input = input("请输入你的选择(1/2/3):")if player_input in ['0', '1', '2', '3']:return player_inputprint("无效的选择,请输入 '1'、'2' 或 '3'。")def determine_winner(player_choice, computer_choice):if player_choice == computer_choice:return "平局!", 0elif (player_choice == "石头" and computer_choice == "剪刀") or \(player_choice == "剪刀" and computer_choice == "布") or \(player_choice == "布" and computer_choice == "石头"):return "你赢了!", 1else:return "你输了!", -1def rock_paper_scissors():print("欢迎来到石头、剪刀、布游戏!")choices = ["石头", "剪刀", "布"]score = 0rounds = 0display_choices()while True:player_input = get_player_choice()if player_input == '0':print("感谢你玩这个游戏!再见!")print(f"你的总得分是:{score}")breakplayer_choice = choices[int(player_input) - 1]computer_choice = random.choice(choices)print(f"你选择了:{player_choice}")print(f"计算机选择了:{computer_choice}")result, round_score = determine_winner(player_choice, computer_choice)score += round_scorerounds += 1print(result)print(f"当前得分:{score}(共 {rounds} 轮)")print()  # 输出空行以便于可读性if __name__ == "__main__":check_numpy()rock_paper_scissors()

2.1代码解释

  1. 导入模块:我们导入了subprocesssysrandom模块。subprocess用于执行系统命令,sys用于获取Python解释器的路径,random用于生成随机数。

  2. 安装依赖install函数用于安装缺失的Python包,这里用于安装numpy库,虽然在本游戏中并未直接使用numpy,但这个函数展示了如何管理依赖。

  3. 检查numpy库check_numpy函数检查numpy库是否已安装,如果未安装,则自动安装。

  4. 显示选择display_choices函数显示游戏的选择菜单,告知玩家可以选择的手势和退出游戏的选项。

  5. 获取玩家选择get_player_choice函数获取玩家的输入,并检查输入是否有效。如果输入无效,会提示玩家重新输入。

  6. 判断胜负determine_winner函数根据石头剪刀布的规则判断玩家和计算机的胜负,并返回结果和本轮得分。

  7. 游戏主函数rock_paper_scissors函数是游戏的主函数,负责游戏流程的控制。它首先显示选择菜单,然后进入一个循环,直到玩家选择退出。在每一轮中,玩家输入他们的选择,计算机随机生成一个选择,然后判断胜负并更新得分。

  8. 程序入口if __name__ == "__main__":部分是程序的入口点,它首先检查numpy库是否安装,然后调用rock_paper_scissors函数开始游戏。

三、多模式版代码实现与解析

这段代码是一个简单的石头、剪刀、布游戏,它包含了两个模式:单局游戏和锦标赛模式。下面是对代码的解析和原理解释:

3.1导入模块

import subprocess
import sys
import random
import time

这段代码导入了四个Python模块:

  • subprocess:用于执行外部命令。
  • sys:提供了一些与Python解释器和它的环境有关的函数。
  • random:用于生成随机数。
  • time:提供了各种与时间相关的函数。

3.2安装numpy模块的函数

def install(package):subprocess.check_call([sys.executable, "-m", "pip", "install", package])

这个函数接受一个参数package,使用subprocess模块来调用pip安装指定的包。

3.3检查并安装numpy模块的函数

def check_numpy():try:import numpyexcept ImportError:print("numpy 未安装,正在安装...")install("numpy")print("numpy 安装完成!")

这个函数尝试导入numpy模块,如果导入失败(即numpy未安装),则调用install函数来安装numpy

3.4显示选择的函数

def display_choices():print("请选择:")print("1. 石头")print("2. 剪刀")print("3. 布")print("输入 '0' 退出游戏")

这个函数打印出玩家可以选择的选项。

3.5获取玩家选择的函数

def get_player_choice():while True:player_input = input("请输入你的选择(1/2/3):")if player_input in ['0', '1', '2', '3']:return player_inputprint("无效的选择,请输入 '1' 到 '3'。")

这个函数通过无限循环获取玩家的输入,并检查输入是否有效。如果输入是0123,则返回输入值;否则,提示玩家重新输入。

3.6判断胜负的函数

def determine_winner(player_choice, computer_choice):rules = {"石头": ["剪刀"],"剪刀": ["布"],"布": ["石头"]}if player_choice == computer_choice:return "平局!", 0elif computer_choice in rules[player_choice]:return "你赢了!", 1else:return "你输了!", -1

这个函数根据游戏规则判断玩家和计算机的胜负,并返回结果和分数变化。

3.7显示进度条的函数

def show_progress_bar(total_rounds, current_round):progress = (current_round / total_rounds) * 100# 进度条样式bar_length = 30block = int(round(bar_length * progress / 100))# 使用 ANSI 转义序列来改变颜色bar = f"\033[92m{'█' * block}\033[0m" + '-' * (bar_length - block)  # 绿色的块sys.stdout.write(f"\r进度: |{bar}| {progress:.2f}%")sys.stdout.flush()time.sleep(0.1)  # 控制进度条的速度

这个函数显示一个进度条,用于锦标赛模式中显示当前轮次的进度。

3.8锦标赛模式的函数

def tournament_mode():print("欢迎来到锦标赛模式!")rounds = 8  # 固定轮次print("锦标赛共八轮")player_score = 0computer_score = 0# 显示进度条print("准备开始比赛,请稍等...")for round_num in range(1, rounds + 1):show_progress_bar(rounds, round_num)print("\n进度条完成,开始比赛!\n")for round_num in range(1, rounds + 1):print(f"\n第 {round_num} 轮:")display_choices()  # 在每轮中显示选项player_input = get_player_choice()if player_input == '0':print("感谢你玩这个游戏!再见!")breakchoices = ["石头", "剪刀", "布"]player_choice = choices[int(player_input) - 1]computer_choice = random.choice(choices)print(f"你选择了:{player_choice}")print(f"计算机选择了:{computer_choice}")result, round_score = determine_winner(player_choice, computer_choice)if round_score == 1:player_score += 1elif round_score == -1:computer_score += 1print(result)print(f"当前得分 - 你:{player_score},计算机:{computer_score}")if player_score > computer_score:print("\n恭喜你,赢得了锦标赛!")elif player_score < computer_score:print("\n很遗憾,你输了锦标赛!")else:print("\n锦标赛平局!")

这个函数实现了锦标赛模式,玩家需要进行8轮游戏,每轮结束后更新得分,并在最后判断胜负。

3.9单局游戏模式的函数

def single_game_mode():print("欢迎来到单局游戏!")display_choices()player_input = get_player_choice()if player_input == '0':print("感谢你玩这个游戏!再见!")returnchoices = ["石头", "剪刀", "布"]player_choice = choices[int(player_input) - 1]computer_choice = random.choice(choices)print(f"你选择了:{player_choice}")print(f"计算机选择了:{computer_choice}")result, _ = determine_winner(player_choice, computer_choice)print(result)

这个函数实现了单局游戏模式,玩家和计算机进行一次石头、剪刀、布的对决,并判断胜负。

3.10主函数

def rock_paper_scissors():print("欢迎来到石头、剪刀、布游戏!")print("IT·小灰灰")while True:print("\n选择游戏模式:")print("1. 单局游戏")print("2. 锦标赛模式")print("输入 '0' 退出游戏")mode_input = input("请选择模式(1/2):")if mode_input == '0':print("感谢你玩这个游戏!再见!")breakelif mode_input == '1':single_game_mode()elif mode_input == '2':tournament_mode()else:print("无效的选择,请输入 '1' 或 '2'。")

这个函数是游戏的主函数,它提供了一个循环,允许玩家选择游戏模式,并根据选择调用相应的函数。

3.11程序入口

if __name__ == "__main__":check_numpy()rock_paper_scissors()

这是程序的入口点。首先检查numpy是否安装,如果未安装则安装它,然后调用rock_paper_scissors函数开始游戏。

3.12完整代码

import subprocess
import sys
import random
import timedef install(package):subprocess.check_call([sys.executable, "-m", "pip", "install", package])def check_numpy():try:import numpyexcept ImportError:print("numpy 未安装,正在安装...")install("numpy")print("numpy 安装完成!")def display_choices():print("请选择:")print("1. 石头")print("2. 剪刀")print("3. 布")print("输入 '0' 退出游戏")def get_player_choice():while True:player_input = input("请输入你的选择(1/2/3):")if player_input in ['0', '1', '2', '3']:return player_inputprint("无效的选择,请输入 '1' 到 '3'。")def determine_winner(player_choice, computer_choice):rules = {"石头": ["剪刀"],"剪刀": ["布"],"布": ["石头"]}if player_choice == computer_choice:return "平局!", 0elif computer_choice in rules[player_choice]:return "你赢了!", 1else:return "你输了!", -1def show_progress_bar(total_rounds, current_round):progress = (current_round / total_rounds) * 100# 进度条样式bar_length = 30block = int(round(bar_length * progress / 100))# 使用 ANSI 转义序列来改变颜色bar = f"\033[92m{'█' * block}\033[0m" + '-' * (bar_length - block)  # 绿色的块sys.stdout.write(f"\r进度: |{bar}| {progress:.2f}%")sys.stdout.flush()time.sleep(0.1)  # 控制进度条的速度def tournament_mode():print("欢迎来到锦标赛模式!")rounds = 8  # 固定轮次print("锦标赛共八轮")player_score = 0computer_score = 0# 显示进度条print("准备开始比赛,请稍等...")for round_num in range(1, rounds + 1):show_progress_bar(rounds, round_num)print("\n进度条完成,开始比赛!\n")for round_num in range(1, rounds + 1):print(f"\n第 {round_num} 轮:")display_choices()  # 在每轮中显示选项player_input = get_player_choice()if player_input == '0':print("感谢你玩这个游戏!再见!")breakchoices = ["石头", "剪刀", "布"]player_choice = choices[int(player_input) - 1]computer_choice = random.choice(choices)print(f"你选择了:{player_choice}")print(f"计算机选择了:{computer_choice}")result, round_score = determine_winner(player_choice, computer_choice)if round_score == 1:player_score += 1elif round_score == -1:computer_score += 1print(result)print(f"当前得分 - 你:{player_score},计算机:{computer_score}")if player_score > computer_score:print("\n恭喜你,赢得了锦标赛!")elif player_score < computer_score:print("\n很遗憾,你输了锦标赛!")else:print("\n锦标赛平局!")def single_game_mode():print("欢迎来到单局游戏!")display_choices()player_input = get_player_choice()if player_input == '0':print("感谢你玩这个游戏!再见!")returnchoices = ["石头", "剪刀", "布"]player_choice = choices[int(player_input) - 1]computer_choice = random.choice(choices)print(f"你选择了:{player_choice}")print(f"计算机选择了:{computer_choice}")result, _ = determine_winner(player_choice, computer_choice)print(result)def rock_paper_scissors():print("欢迎来到石头、剪刀、布游戏!")print("IT·小灰灰")while True:print("\n选择游戏模式:")print("1. 单局游戏")print("2. 锦标赛模式")print("输入 '0' 退出游戏")mode_input = input("请选择模式(1/2):")if mode_input == '0':print("感谢你玩这个游戏!再见!")breakelif mode_input == '1':single_game_mode()elif mode_input == '2':tournament_mode()else:print("无效的选择,请输入 '1' 或 '2'。")if __name__ == "__main__":check_numpy()rock_paper_scissors()

无需手动安装库,代码中会自动安装。

四、实现原理

  1. 用户交互:通过input函数获取用户输入,根据用户的选择执行不同的游戏模式。
  2. 随机选择:使用random.choice函数让计算机随机选择石头、剪刀或布。
  3. 游戏规则:通过一个字典rules定义了游戏的胜负规则。
  4. 进度条:在锦标赛模式中使用进度条显示当前的进度。
  5. 得分统计:在锦标赛模式中统计玩家和计算机的得分,并在最后判断胜负。

五、总结

通过这个详细的指南,我们不仅学习了如何用Python编写一个石头剪刀布游戏,还了解了如何处理用户输入、随机事件以及基本的程序逻辑。

当然,希望你喜欢这个简单的石头、剪刀、布游戏。它虽然简单,但包含了基本的游戏逻辑和用户交互。如果你对编程感兴趣,可以尝试自己修改和扩展这个游戏,比如添加新的游戏模式、改进用户界面或者增加网络对战功能。编程的世界充满无限可能,愿你在探索中找到乐趣!记得,无论你的代码多么复杂,始终保持代码的清晰和可维护性是非常重要的。祝你编程愉快!点我入群一起交流
 


http://www.mrgr.cn/news/62321.html

相关文章:

  • JAVA程序导致cpu标高排查
  • Kylin Server V10 下编译安装 Python
  • 哈希——哈希表处理哈希冲突的方法
  • Linux 宝塔安装(各操作系统命令合集)
  • Docker:存储原理
  • node升级package.json中的版本
  • C++学习笔记----9、发现继承的技巧(六)---- 有趣且令人迷惑的继承问题(6)
  • <HarmonyOS第一课>给应用添加通知和提醒的习题
  • VC2012创建弹出式菜单
  • 智能进阶之路:从基础模型到个性化代理—探索Agent与微调的共生之道
  • [专有网络VPC]创建和管理流量镜像
  • 神奇的数据恢复工具:让丢失的数据重现
  • 线上 Dump
  • 【数据结构】链表详解:数据节点的链接原理
  • 积鼎国产CFD软件VirtualFlow新版上线:新增30余项新功能,多相流仿真效率升级
  • C#与C++交互开发系列(十七):线程安全
  • MyBatis-Plus:简化 CRUD 操作的艺术
  • 「动态规划」1/n:什么是动态规划?
  • 能通过Ping命令访问CentOS 9 Stream,但在使用Xshell连接
  • SQLI LABS | Less-20 POST-Cookie Injections-Uagent field-error based
  • Python酷库之旅-第三方库Pandas(178)
  • MySQL Workbench Data Import Wizard:list index out of range
  • Robot Framework 搭建环境
  • C# 编程语言学习教程
  • vuex、vue-router实现原理
  • AcWing 1303:斐波那契前 n 项和 ← 矩阵快速幂加速递推