task1
This commit is contained in:
120
README.md
120
README.md
@@ -1,14 +1,6 @@
|
||||
# Poker Hand Evaluation Program
|
||||
# Poker Task1
|
||||
|
||||
一个用Python实现的扑克牌手牌评估程序,能够从7张牌中找出最佳的5张牌组合并返回手牌排名。
|
||||
|
||||
## 功能特性
|
||||
|
||||
- **完整的数据结构**:实现了Card、Deck、HandRanking等核心类
|
||||
- **字符串解析**:支持从字符串格式解析扑克牌(如 "AsKs AhAdAc6s7s")
|
||||
- **手牌评估**:支持所有标准扑克手牌类型的识别和排名
|
||||
- **最佳组合选择**:从7张牌中自动选择最佳的5张牌组合
|
||||
- **全面测试**:包含完整的单元测试套件
|
||||
实现从7张牌中找出最佳的5张牌组合并返回handranking。
|
||||
|
||||
## 支持的手牌类型
|
||||
|
||||
@@ -23,8 +15,6 @@
|
||||
9. **一对** (One Pair) - 一个对子
|
||||
10. **高牌** (High Card) - 没有组合的单张高牌
|
||||
|
||||
## 安装和使用
|
||||
|
||||
### 环境要求
|
||||
- Python 3.13+
|
||||
- uv 包管理器
|
||||
@@ -53,8 +43,6 @@ python main.py "JsJhJdQcQs2h3d"
|
||||
- 第一个字符是点数:`2`, `3`, `4`, `5`, `6`, `7`, `8`, `9`, `T`, `J`, `Q`, `K`, `A`
|
||||
- 第二个字符是花色:`s`(黑桃), `h`(红桃), `d`(方块), `c`(梅花)
|
||||
|
||||
牌之间可以用空格分隔,也可以连续书写。
|
||||
|
||||
### 运行测试
|
||||
|
||||
```bash
|
||||
@@ -65,113 +53,11 @@ python run_tests.py
|
||||
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
|
||||
- **包管理**:uv
|
||||
- **测试**:自定义测试框架(也支持pytest)
|
||||
- **开发环境**:VS Code
|
||||
|
||||
|
||||
Reference in New Issue
Block a user