Files
poker_task1/README.md
2025-09-23 09:59:55 +08:00

178 lines
4.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Poker Hand Evaluation Program
一个用Python实现的扑克牌手牌评估程序能够从7张牌中找出最佳的5张牌组合并返回手牌排名。
## 功能特性
- **完整的数据结构**实现了Card、Deck、HandRanking等核心类
- **字符串解析**:支持从字符串格式解析扑克牌(如 "AsKs AhAdAc6s7s"
- **手牌评估**:支持所有标准扑克手牌类型的识别和排名
- **最佳组合选择**从7张牌中自动选择最佳的5张牌组合
- **全面测试**:包含完整的单元测试套件
## 支持的手牌类型
1. **皇家同花顺** (Royal Flush) - A♠K♠Q♠J♠T♠
2. **同花顺** (Straight Flush) - 连续的五张同花色牌
3. **四条** (Four of a Kind) - 四张相同点数的牌
4. **满堂红** (Full House) - 三条加一对
5. **同花** (Flush) - 五张同花色的牌
6. **顺子** (Straight) - 五张连续点数的牌包括A-2-3-4-5轮子
7. **三条** (Three of a Kind) - 三张相同点数的牌
8. **两对** (Two Pair) - 两个对子
9. **一对** (One Pair) - 一个对子
10. **高牌** (High Card) - 没有组合的单张高牌
## 安装和使用
### 环境要求
- Python 3.13+
- uv 包管理器
### 运行程序
```bash
# 基本用法
python main.py "AsKs AhAdAc6s7s"
# 输出: Quad(A)
# 其他示例
python main.py "AhKhQhJhTh2c3c"
# 输出: Royal Flush
python main.py "2h3h4h5h6h7s8s"
# 输出: Straight Flush(6 high)
python main.py "JsJhJdQcQs2h3d"
# 输出: Full House(J over Q)
```
### 输入格式
输入字符串应包含恰好7张牌每张牌用2个字符表示
- 第一个字符是点数:`2`, `3`, `4`, `5`, `6`, `7`, `8`, `9`, `T`, `J`, `Q`, `K`, `A`
- 第二个字符是花色:`s`(黑桃), `h`(红桃), `d`(方块), `c`(梅花)
牌之间可以用空格分隔,也可以连续书写。
### 运行测试
```bash
# 运行自定义测试套件
python run_tests.py
# 如果安装了pytest也可以运行
pytest tests/ -v
```
## 项目结构
```
poker_emd_task/
├── poker/ # 核心模块
│ ├── __init__.py # 模块初始化
│ ├── card.py # Card、Rank、Suit类
│ ├── deck.py # Deck类
│ ├── hand_ranking.py # HandRanking、HandType类
│ └── hand_evaluator.py # HandEvaluator类核心算法
├── tests/ # 测试文件
│ ├── test_card.py
│ ├── test_deck.py
│ ├── test_hand_ranking.py
│ ├── test_hand_evaluator.py
│ └── test_integration.py
├── main.py # 主程序入口
├── run_tests.py # 简化的测试运行器
├── pyproject.toml # 项目配置
└── README.md # 项目说明
```
## 设计特点
### 核心数据结构
- **Card类**:表示单张扑克牌,包含点数和花色
- **Rank枚举**:定义牌的点数,支持比较操作
- **Suit枚举**:定义牌的花色
- **HandType枚举**:定义所有手牌类型及其强度
- **HandRanking类**:表示手牌评估结果,包含类型和关键牌
- **Deck类**表示一副标准52张牌
- **HandEvaluator类**:核心算法,评估手牌并选择最佳组合
### 算法实现
1. **穷举法**从7张牌中穷举所有可能的5张牌组合21种
2. **模式识别**对每个5张牌组合识别手牌类型
3. **排名比较**:选择强度最高的手牌组合
4. **特殊处理**正确处理A-2-3-4-5轮子顺子等特殊情况
### 错误处理
- 输入验证检查牌数是否为7张
- 格式验证:验证每张牌的格式是否正确
- 范围验证:确保点数和花色在有效范围内
- 友好错误信息:提供清晰的错误提示
## 示例用法
```python
from poker.hand_evaluator import HandEvaluator
from poker.card import Card, Rank, Suit
# 方式1从字符串评估
ranking = HandEvaluator.evaluate_from_input("AsKs AhAdAc6s7s")
print(ranking) # Quad(A)
# 方式2从Card对象评估
cards = [
Card(Rank.ACE, Suit.SPADES),
Card(Rank.KING, Suit.SPADES),
# ... 更多牌
]
ranking = HandEvaluator.evaluate_hand(cards)
print(ranking)
```
## 测试覆盖
项目包含全面的测试套件,覆盖:
- 所有核心类的功能测试
- 各种手牌类型的识别测试
- 边界条件和错误情况测试
- 集成测试和端到端测试
运行测试确保所有功能正常工作:
```bash
python run_tests.py
```
预期输出:
```
Running poker hand evaluation tests...
Testing Card functionality...
✓ Card tests passed
Testing hand parsing...
✓ Hand parsing tests passed
Testing hand evaluation...
✓ Hand evaluation tests passed
Testing wheel straight...
✓ Wheel straight test passed
Testing deck functionality...
✓ Deck tests passed
Testing error handling...
✓ Error handling tests passed
Test Results: 6 passed, 0 failed
All tests passed! 🎉
```
## 技术栈
- **语言**Python 3.13
- **包管理**uv / poetry
- **测试**自定义测试框架也支持pytest
- **开发环境**VS Code