# Poker Task 3: EMD Distance Calculation on TURN 这是扑克Task 3的实现,专注于计算TURN阶段两手牌力分布的EMD (Earth Mover's Distance) 距离。 ## 功能特点 - **TURN阶段扑克分析**: 基于已知的公共牌和底牌,计算每手牌在所有可能RIVER牌下的牌力分布 - **EMD距离计算**: 使用scipy的wasserstein_distance函数计算两个牌力分布的EMD距离 - **专业扑克评估**: 集成poker_task1的专业扑克牌评估系统,支持所有标准扑克手牌类型 ## 安装和使用 ### 安装依赖 ```bash # 使用uv管理依赖(推荐) uv install # 或使用pip pip install scipy ``` ### 运行程序 ```bash # 默认示例运行 python main.py # 或使用uv uv run python main.py ``` ### 输入格式 程序接受以下格式的输入: ``` 玩家1底牌(两张) 玩家2底牌(两张) 公共牌(TURN阶段,4张牌) ``` 示例: ``` As Ks 7s 6s 8h 9d 9c Qh ``` ## 运行测试 ```bash # 运行所有测试 uv run python -m pytest tests/ -v # 或 python -m pytest tests/ -v ``` ## 项目结构 ``` poker_task3/ ├── poker_task3/ # 主要代码包 │ ├── card.py # 扑克牌类定义 │ ├── hand_evaluator.py # 手牌评估器 │ ├── hand_ranking.py # 手牌排名系统 │ ├── emd.py # EMD距离计算 │ ├── task3.py # Task 3主要实现 │ └── __init__.py ├── tests/ # 测试文件 │ └── test_task3.py # Task 3测试 ├── main.py # 程序入口 └── README.md # 项目文档 ``` ## 算法原理 1. **牌力评估**: 对于每手底牌,遍历所有可能的RIVER牌(剩余47张牌) 2. **分布构建**: 统计每种手牌类型(High Card到Royal Flush)的出现次数 3. **EMD计算**: 使用scipy.stats.wasserstein_distance计算两个分布的EMD距离 ## 测试覆盖 - 输入解析测试 - 牌力分布计算测试 - EMD距离计算测试 - 错误处理测试 - 不同牌力强度对比测试