Add 剪子包袱锤游戏 - 经典石头剪刀布游戏
This commit is contained in:
+244
@@ -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
|
||||||
|
```
|
||||||
|
|
||||||
|
祝你好运!✊✌️🖐️🍀
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
"""
|
||||||
|
剪子包袱锤游戏启动文件
|
||||||
|
"""
|
||||||
|
|
||||||
|
from rps_game import main
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
+220
@@ -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()
|
||||||
Reference in New Issue
Block a user