Add 剪子包袱锤游戏 - 经典石头剪刀布游戏

This commit is contained in:
traetest
2026-04-13 02:18:51 +08:00
parent c9d35892ac
commit ee943c5bd2
3 changed files with 472 additions and 0 deletions
+220
View File
@@ -0,0 +1,220 @@
"""
剪子包袱锤游戏(石头剪刀布)
经典的石头剪刀布游戏,支持人机对战
"""
import random
import sys
from enum import Enum
class Move(Enum):
"""手势枚举"""
ROCK = "石头"
PAPER = "包袱"
SCISSORS = "剪子"
class RockPaperScissorsGame:
"""剪子包袱锤游戏类"""
def __init__(self):
"""初始化游戏"""
self.player_name = ""
self.player_wins = 0
self.computer_wins = 0
self.draws = 0
self.total_games = 0
# 手势克制关系
self.beats = {
Move.ROCK: Move.SCISSORS, # 石头赢剪子
Move.PAPER: Move.ROCK, # 包袱赢石头
Move.SCISSORS: Move.PAPER # 剪子赢包袱
}
def display_title(self):
"""显示游戏标题"""
print("\n" + "=" * 60)
print("✊ 剪子包袱锤 ✌️")
print("=" * 60)
print("\n游戏规则:")
print(" - 石头赢剪子")
print(" - 包袱赢石头")
print(" - 剪子赢包袱")
print(" - 相同手势为平局")
print("=" * 60)
def get_player_name(self):
"""获取玩家名字"""
self.player_name = input("\n请输入你的名字:").strip()
if not self.player_name:
self.player_name = "玩家"
print(f"\n你好,{self.player_name}!让我们开始游戏吧!\n")
def get_player_move(self):
"""
获取玩家手势
Returns:
玩家选择的手势
"""
while True:
print("\n请选择手势:")
print(" 1. 石头 (r/1)")
print(" 2. 包袱 (p/2)")
print(" 3. 剪子 (s/3)")
choice = input("\n你的选择:").strip().lower()
if choice in ['r', '1', '石头', 'rock']:
return Move.ROCK
elif choice in ['p', '2', '包袱', 'paper']:
return Move.PAPER
elif choice in ['s', '3', '剪子', 'scissors']:
return Move.SCISSORS
else:
print("❌ 请输入有效的选择(1/2/3 或 r/p/s 或 石头/包袱/剪子)!")
def get_computer_move(self):
"""
获取电脑手势
Returns:
电脑随机选择的手势
"""
return random.choice(list(Move))
def determine_winner(self, player_move, computer_move):
"""
判断胜负
Args:
player_move: 玩家手势
computer_move: 电脑手势
Returns:
'player' 玩家赢,'computer' 电脑赢,'draw' 平局
"""
if player_move == computer_move:
return 'draw'
elif self.beats[player_move] == computer_move:
return 'player'
else:
return 'computer'
def play_round(self):
"""玩一轮游戏"""
print("\n" + "-" * 60)
print(f"第 {self.total_games + 1} 局")
print("-" * 60)
# 获取玩家选择
player_move = self.get_player_move()
# 电脑随机选择
print("\n🤖 电脑正在思考...")
import time
time.sleep(0.5)
computer_move = self.get_computer_move()
# 显示双方选择
print(f"\n👤 {self.player_name}: {player_move.value}")
print(f"🤖 电脑:{computer_move.value}")
# 判断胜负
result = self.determine_winner(player_move, computer_move)
if result == 'player':
print(f"\n✅ {self.player_name} 赢了!{player_move.value} 赢 {computer_move.value}")
self.player_wins += 1
elif result == 'computer':
print(f"\n❌ 电脑赢了!{computer_move.value} 赢 {player_move.value}")
self.computer_wins += 1
else:
print(f"\n🤝 平局!双方都是 {player_move.value}")
self.draws += 1
self.total_games += 1
# 显示统计
print(f"\n📊 统计:{self.player_name} {self.player_wins} 胜 / 电脑 {self.computer_wins} 胜 / 平局 {self.draws} 场")
def check_continue(self):
"""
检查是否继续游戏
Returns:
True 表示继续,False 表示结束
"""
while True:
choice = input("\n是否继续游戏?(y/n): ").strip().lower()
if choice in ['y', 'yes', '是']:
return True
elif choice in ['n', 'no', '否']:
return False
else:
print("请输入 'y' 或 'n'!")
def show_final_stats(self):
"""显示最终统计"""
print("\n" + "=" * 60)
print(f"🎮 {self.player_name} 的最终统计")
print("=" * 60)
print(f" 总游戏局数:{self.total_games}")
print(f" {self.player_name} 胜利:{self.player_wins} 场")
print(f" 电脑胜利:{self.computer_wins} 场")
print(f" 平局:{self.draws} 场")
if self.total_games > 0:
win_rate = self.player_wins / self.total_games * 100
print(f" 胜率:{win_rate:.1f}%")
# 表现评价
if self.player_wins > self.computer_wins:
print(f"\n🏆 恭喜!{self.player_name} 获胜!")
elif self.player_wins < self.computer_wins:
print(f"\n💪 电脑获胜,{self.player_name} 再接再厉!")
else:
print(f"\n👍 势均力敌,打成平手!")
print("=" * 60)
def run(self):
"""运行游戏主流程"""
try:
# 显示标题
self.display_title()
# 获取玩家名字
self.get_player_name()
# 游戏主循环
while True:
# 玩一轮
self.play_round()
# 检查是否继续
if not self.check_continue():
break
# 显示最终统计
self.show_final_stats()
print("\n感谢游玩!再见!👋\n")
except KeyboardInterrupt:
print("\n\n游戏被中断!再见!👋\n")
if self.total_games > 0:
self.show_final_stats()
def main():
"""主函数"""
game = RockPaperScissorsGame()
game.run()
if __name__ == "__main__":
main()