编程初学者通常会从简单的项目开始,以建立基础并增强信心。石头剪刀布游戏是一个很好的起点,因为它涉及到基本的逻辑判断、用户输入处理和随机数生成。本文将详细介绍如何使用Python编写一个石头剪刀布游戏,并提供完整的代码和解释。
目录
一、游戏介绍
石头剪刀布是一种两人游戏,玩家通过选择石头、剪刀或布来相互竞争。在这个Python实现的版本中,玩家将与计算机对战,计算机会随机选择一个手势,然后根据石头剪刀布的规则判断胜负。
二、基本代码解析与实现
以下是实现石头剪刀布游戏的Python代码,我们将逐步解析每个部分。
import subprocess
import sys
import random
def install(package):
subprocess.check_call([sys.executable, "-m", "pip", "install", package])
def check_numpy():
try:
import numpy
except 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_input
print("无效的选择,请输入 '1'、'2' 或 '3'。")
def determine_winner(player_choice, computer_choice):
if player_choice == computer_choice:
return "平局!", 0
elif (player_choice == "石头" and computer_choice == "剪刀") or \
(player_choice == "剪刀" and computer_choice == "布") or \
(player_choice == "布" and computer_choice == "石头"):
return "你赢了!", 1
else:
return "你输了!", -1
def rock_paper_scissors():
print("欢迎来到石头、剪刀、布游戏!")
choices = ["石头", "剪刀", "布"]
score = 0
rounds = 0
display_choices()
while True:
player_input = get_player_choice()
if player_input == '0':
print("感谢你玩这个游戏!再见!")
print(f"你的总得分是:{score}")
break
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)
score += round_score
rounds += 1
print(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 numpy
except 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_input
print("无效的选择,请输入 '1' 到 '3'。")
这个函数通过无限循环获取玩家的输入,并检查输入是否有效。如果输入是0
、1
、2
或3
,则返回输入值;否则,提示玩家重新输入。
3.6判断胜负的函数
def determine_winner(player_choice, computer_choice):
rules = {
"石头": ["剪刀"],
"剪刀": ["布"],
"布": ["石头"]
}
if player_choice == computer_choice:
return "平局!", 0
elif computer_choice in rules[player_choice]:
return "你赢了!", 1
else:
return "你输了!", -1
这个函数根据游戏规则判断玩家和计算机的胜负,并返回结果和分数变化。
3.7显示进度条的函数
def show_progress_bar(total_rounds, current_round):
progress = (current_round / total_rounds) * 100
# 进度条样式
bar_length = 30
block = 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 = 0
computer_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("感谢你玩这个游戏!再见!")
break
choices = ["石头", "剪刀", "布"]
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 += 1
elif round_score == -1:
computer_score += 1
print(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("感谢你玩这个游戏!再见!")
return
choices = ["石头", "剪刀", "布"]
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("感谢你玩这个游戏!再见!")
break
elif 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 time
def install(package):
subprocess.check_call([sys.executable, "-m", "pip", "install", package])
def check_numpy():
try:
import numpy
except 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_input
print("无效的选择,请输入 '1' 到 '3'。")
def determine_winner(player_choice, computer_choice):
rules = {
"石头": ["剪刀"],
"剪刀": ["布"],
"布": ["石头"]
}
if player_choice == computer_choice:
return "平局!", 0
elif computer_choice in rules[player_choice]:
return "你赢了!", 1
else:
return "你输了!", -1
def show_progress_bar(total_rounds, current_round):
progress = (current_round / total_rounds) * 100
# 进度条样式
bar_length = 30
block = 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 = 0
computer_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("感谢你玩这个游戏!再见!")
break
choices = ["石头", "剪刀", "布"]
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 += 1
elif round_score == -1:
computer_score += 1
print(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("感谢你玩这个游戏!再见!")
return
choices = ["石头", "剪刀", "布"]
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("感谢你玩这个游戏!再见!")
break
elif 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编写一个石头剪刀布游戏,还了解了如何处理用户输入、随机事件以及基本的程序逻辑。
当然,希望你喜欢这个简单的石头、剪刀、布游戏。它虽然简单,但包含了基本的游戏逻辑和用户交互。如果你对编程感兴趣,可以尝试自己修改和扩展这个游戏,比如添加新的游戏模式、改进用户界面或者增加网络对战功能。编程的世界充满无限可能,愿你在探索中找到乐趣!记得,无论你的代码多么复杂,始终保持代码的清晰和可维护性是非常重要的。祝你编程愉快!点我入群一起交流