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代码解释
-
导入模块:我们导入了
subprocess
、sys
和random
模块。subprocess
用于执行系统命令,sys
用于获取Python解释器的路径,random
用于生成随机数。 -
安装依赖:
install
函数用于安装缺失的Python包,这里用于安装numpy
库,虽然在本游戏中并未直接使用numpy
,但这个函数展示了如何管理依赖。 -
检查numpy库:
check_numpy
函数检查numpy
库是否已安装,如果未安装,则自动安装。 -
显示选择:
display_choices
函数显示游戏的选择菜单,告知玩家可以选择的手势和退出游戏的选项。 -
获取玩家选择:
get_player_choice
函数获取玩家的输入,并检查输入是否有效。如果输入无效,会提示玩家重新输入。 -
判断胜负:
determine_winner
函数根据石头剪刀布的规则判断玩家和计算机的胜负,并返回结果和本轮得分。 -
游戏主函数:
rock_paper_scissors
函数是游戏的主函数,负责游戏流程的控制。它首先显示选择菜单,然后进入一个循环,直到玩家选择退出。在每一轮中,玩家输入他们的选择,计算机随机生成一个选择,然后判断胜负并更新得分。 -
程序入口:
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'。")
这个函数通过无限循环获取玩家的输入,并检查输入是否有效。如果输入是0
、1
、2
或3
,则返回输入值;否则,提示玩家重新输入。
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()
无需手动安装库,代码中会自动安装。
四、实现原理
- 用户交互:通过
input
函数获取用户输入,根据用户的选择执行不同的游戏模式。 - 随机选择:使用
random.choice
函数让计算机随机选择石头、剪刀或布。 - 游戏规则:通过一个字典
rules
定义了游戏的胜负规则。 - 进度条:在锦标赛模式中使用进度条显示当前的进度。
- 得分统计:在锦标赛模式中统计玩家和计算机的得分,并在最后判断胜负。
五、总结
通过这个详细的指南,我们不仅学习了如何用Python编写一个石头剪刀布游戏,还了解了如何处理用户输入、随机事件以及基本的程序逻辑。
当然,希望你喜欢这个简单的石头、剪刀、布游戏。它虽然简单,但包含了基本的游戏逻辑和用户交互。如果你对编程感兴趣,可以尝试自己修改和扩展这个游戏,比如添加新的游戏模式、改进用户界面或者增加网络对战功能。编程的世界充满无限可能,愿你在探索中找到乐趣!记得,无论你的代码多么复杂,始终保持代码的清晰和可维护性是非常重要的。祝你编程愉快!点我入群一起交流