diff --git a/RPS_README.md b/RPS_README.md new file mode 100644 index 0000000..8223b83 --- /dev/null +++ b/RPS_README.md @@ -0,0 +1,244 @@ +# ✊ 剪子包袱锤游戏(石头剪刀布) + +经典的石头剪刀布游戏,支持人机对战! + +## 🎮 游戏规则 + +### 基本规则 +- **石头** 赢 **剪子** - 石头可以砸坏剪子 +- **包袱** 赢 **石头** - 包袱可以包住石头 +- **剪子** 赢 **包袱** - 剪子可以剪破包袱 +- 相同手势为**平局** + +### 游戏流程 +1. 玩家选择手势(石头/包袱/剪子) +2. 电脑随机选择手势 +3. 比较双方手势,判断胜负 +4. 统计战绩,继续或结束游戏 + +## 🚀 快速开始 + +### 方法 1:运行启动文件 +```bash +python play_rps.py +``` + +### 方法 2:直接运行游戏 +```bash +python rps_game.py +``` + +## 🎯 游戏操作 + +### 输入方式(三种任选) + +| 手势 | 数字 | 字母 | 中文 | +|------|------|------|------| +| 石头 | 1 | r | 石头 | +| 包袱 | 2 | p | 包袱 | +| 剪子 | 3 | s | 剪子 | + +### 示例 +``` +请选择手势: + 1. 石头 (r/1) + 2. 包袱 (p/2) + 3. 剪子 (s/3) + +你的选择:r # 或者输入 1,或者输入 石头 +``` + +## 📖 游戏流程示例 + +``` +============================================================ +✊ 剪子包袱锤 ✌️ +============================================================ + +游戏规则: + - 石头赢剪子 + - 包袱赢石头 + - 剪子赢包袱 + - 相同手势为平局 +============================================================ + +请输入你的名字:小明 + +你好,小明!让我们开始游戏吧! + +------------------------------------------------------------ +第 1 局 +------------------------------------------------------------ + +请选择手势: + 1. 石头 (r/1) + 2. 包袱 (p/2) + 3. 剪子 (s/3) + +你的选择:石头 + +🤖 电脑正在思考... + +👤 小明:石头 +🤖 电脑:剪子 + +✅ 小明 赢了!石头 赢 剪子 + +📊 统计:小明 1 胜 / 电脑 0 胜 / 平局 0 场 + +是否继续游戏?(y/n): y +``` + +## 🎲 概率说明 + +### 电脑出拳概率 +电脑使用**真随机**选择器,每个手势的概率均为: +- 石头:33.33% +- 包袱:33.33% +- 剪子:33.33% + +### 理论胜率 +- 玩家胜率:33.33% +- 电脑胜率:33.33% +- 平局概率:33.33% + +## 🏆 技巧提示 + +### 心理学策略 +虽然电脑是随机的,但人类玩家有规律可循: + +1. **首局倾向** - 男性倾向出石头,女性倾向出剪子 +2. **连胜模式** - 赢家倾向于保持相同手势 +3. **连败模式** - 输家倾向于换手势 +4. **平局模式** - 平局后倾向于出能赢上次的手势 + +### 高级技巧 +- **观察对手习惯** - 记录对手偏好 +- **随机化策略** - 避免被对手预测 +- **心理战术** - 故意透露虚假信息 + +### 温馨提示 +⚠️ 这只是一个娱乐游戏,请勿当真! +⚠️ 电脑完全随机,没有 AI 学习功能! + +## 📊 统计功能 + +游戏提供详细的统计数据: +- 总游戏局数 +- 玩家胜利场次 +- 电脑胜利场次 +- 平局场次 +- 胜率百分比 +- 表现评价 + +## 🎨 游戏特色 + +✅ 简单易懂的规则 +✅ 多种输入方式(数字/字母/中文) +✅ 友好的用户界面 +✅ 实时统计显示 +✅ 胜率计算 +✅ 智能输入验证 +✅ 完整的游戏流程 +✅ 鼓励性评价系统 +✅ 支持随时退出(Ctrl+C) + +## 💡 扩展建议 + +未来可以添加的功能: +- [ ] 三局两胜制 +- [ ] 五局三胜制 +- [ ] 连胜统计 +- [ ] 历史记录 +- [ ] 排行榜系统 +- [ ] 多种难度(简单/中等/困难) +- [ ] 成就系统 +- [ ] 音效和动画 +- [ ] 双人对战模式 + +## 🔧 技术实现 + +### 核心技术 +- **enum 模块** - 手势枚举 +- **random 模块** - 真随机数生成 +- **输入验证** - 确保用户输入合法 +- **异常处理** - 优雅处理中断和错误 +- **统计计算** - 实时数据追踪 + +### 克制关系 +```python +beats = { + Move.ROCK: Move.SCISSORS, # 石头赢剪子 + Move.PAPER: Move.ROCK, # 包袱赢石头 + Move.SCISSORS: Move.PAPER # 剪子赢包袱 +} +``` + +### 代码结构 +``` +RockPaperScissorsGame +├── __init__() # 初始化游戏状态 +├── display_title() # 显示标题 +├── get_player_name() # 获取玩家名字 +├── get_player_move() # 获取玩家手势 +├── get_computer_move() # 获取电脑手势 +├── determine_winner() # 判断胜负 +├── play_round() # 玩一轮 +├── check_continue() # 检查是否继续 +├── show_final_stats() # 最终统计 +└── run() # 主流程 +``` + +## 📝 版本历史 + +### v1.0.0 +- ✅ 基础游戏功能 +- ✅ 多种输入方式 +- ✅ 统计功能 +- ✅ 用户界面优化 +- ✅ 输入验证 +- ✅ 异常处理 + +## 🎓 学习价值 + +通过这个游戏可以学习: +- Python 基础语法 +- 枚举类型使用 +- 随机数生成 +- 用户输入处理 +- 游戏循环设计 +- 状态管理 +- 数据追踪 +- 字典数据结构 + +## 🌍 文化背景 + +### 历史起源 +- 起源于中国汉朝(公元前 206 年 - 公元 220 年) +- 最初是酒令游戏 +- 后传播到日本、韩国等东亚国家 +- 现已成为全球知名的游戏 + +### 不同名称 +- **中国**:石头剪刀布 +- **日本**:じゃんけん (Jan-ken-pon) +- **韩国**:가위바위보 (Kawi Bawi Bo) +- **英语国家**:Rock Paper Scissors + +### 有趣事实 +- 2005 年,日本机器人用高速相机在 20 毫秒内识别手势并获胜 +- 2011 年,东京大学机器人保持 100% 胜率 +- 世界石头剪刀布协会每年举办世界锦标赛 + +## 📄 许可证 + +MIT License + +## 🎉 开始游戏 + +```bash +# 无需安装额外依赖 +python play_rps.py +``` + +祝你好运!✊✌️🖐️🍀 diff --git a/play_rps.py b/play_rps.py new file mode 100644 index 0000000..6c5679e --- /dev/null +++ b/play_rps.py @@ -0,0 +1,8 @@ +""" +剪子包袱锤游戏启动文件 +""" + +from rps_game import main + +if __name__ == "__main__": + main() diff --git a/rps_game.py b/rps_game.py new file mode 100644 index 0000000..3336fab --- /dev/null +++ b/rps_game.py @@ -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()