BoardArena 是一个棋类/桌游 Bot 对战实验仓库。目前包含七个子项目:
lqq/:路墙棋,支持本地网页对战和 2 人 Bot 裁判接口。nimmt/:简化版 6 nimmt!,支持 2 到 6 人 Bot 对战、批量评测和日志查询。skull/:Skull,支持多人 Bot 对战、批量评测和日志查询。chess/:国际象棋,支持 Gym 风格环境、本地网页人人/人机对战和 2 人 Bot 裁判接口。Othello/:黑白棋,支持 Gym 风格环境、本地网页人人/人机对战和 2 人 Bot 裁判接口。go_9x9/:九路围棋,支持 Gym 风格环境、本地网页人人/人机对战和 2 人 Bot 裁判接口。uno/:二人 UNO,支持 Gym 风格环境、本地网页人人/人机对战和 2 人 Bot 裁判接口。path-clash-quoridor-alphazero/:Path Clash AlphaZero 强模型检查点,以及针对相近 Quoridor 规则变体的热启动说明。
BoardArena/
├── lqq/
│ ├── env/
│ ├── baseline/
│ ├── doc/
│ ├── lqq_multi.py
├── nimmt/
│ ├── env/
│ ├── baseline/
│ ├── doc/
│ └── nimmt_multi.py
├── skull/
│ ├── env/
│ ├── baseline/
│ ├── doc/
│ ├── skull_multi.py
│ └── skull_cfr.py
├── chess/
│ ├── env/
│ ├── baseline/
│ └── doc/
├── Othello/
│ ├── env/
│ ├── baseline/
│ └── doc/
├── go_9x9/
│ ├── env/
│ ├── baseline/
│ └── doc/
├── uno/
│ ├── env/
│ ├── baseline/
│ └── doc/
├── path-clash-quoridor-alphazero/
│ ├── models/
│ └── WARM_START.md
└── README.md
当前已确认最强的 Path Clash AlphaZero BF16 权重位于
path-clash-quoridor-alphazero/models/iter-0085-bf16.pt。它适用于相同网络与
规则编码,或可作为相近 Quoridor 规则变体的显式部分初始化来源。
不要将旧规则 replay 或 optimizer 状态直接带入新规则版本。完整的兼容性判断、
部分权重迁移、重新 self-play 和门控评测流程见
path-clash-quoridor-alphazero/WARM_START.md,
权重来源和 SHA-256 见
models/CHECKPOINT.md。
打开网页对战:
start .\lqq\env\index.html生成示例 Bot:
python .\lqq\lqq_multi.py sample-bot --output .\lqq\bot.py运行单局 Bot 对战:
python .\lqq\lqq_multi.py battle --bot .\lqq\bot.py --players 2 --games 1 --seed 1 --keep-logs运行批量对战:
python .\lqq\lqq_multi.py battle --bot .\lqq\bot.py --players 2 --games 1000 --seed 1更多规则和接口见:
lqq/doc/README.mdlqq/doc/GAME_RULE.mdlqq/doc/BOT_API.md
生成示例 Bot:
python .\nimmt\nimmt_multi.py sample-bot --output .\nimmt\bot_random.py运行单局 Bot 对战:
python .\nimmt\nimmt_multi.py battle --bot .\nimmt\bot_random.py --players 4 --games 1 --seed 1 --keep-logs运行批量对战:
python .\nimmt\nimmt_multi.py battle --bot .\nimmt\bot_random.py --players 6 --games 1000 --seed 1更多说明见:
nimmt/doc/README.mdnimmt/doc/GAME_RULE.mdnimmt/doc/BOT_API.md
运行单局 Bot 对战:
python .\skull\skull_multi.py battle --bot .\skull\bot.py --players 2 --games 1 --seed 1 --keep-logs运行批量对战:
python .\skull\skull_multi.py battle --bot .\skull\bot.py --players 6 --games 100 --seed 1更多说明见:
skull/doc/README.mdskull/doc/GAME_RULE.mdskull/doc/BOT_API.md
安装依赖:
python -m pip install -r .\chess\requirements.txt打开浏览器对战:
python .\chess\env\chess_web.py不要直接用 Live Server 打开 chess\env\index.html,该页面依赖 chess_web.py 提供的本地 JSON API。
如果默认端口被占用,服务会自动尝试后续端口,也可以传入 --port 8021。
人机模式右侧可选择 /gpt5p5/bot_easy 或 /gpt5p5/bot_hard,并可调整动画速度。
运行单局 Bot 对战:
python .\chess\env\chess_env.py battle --bot .\chess\baseline\gpt5p5\bot_hard.py --games 1 --seed 1 --keep-logs运行批量对战:
python .\chess\env\chess_env.py battle --bot .\chess\baseline\gpt5p5\bot_easy.py --games 100 --seed 1更多说明见:
chess/doc/README.mdchess/doc/GAME_RULE.mdchess/doc/BOT_API.md
打开浏览器对战:
python .\Othello\env\othello_web.py不要直接用 Live Server 打开 Othello\env\index.html,该页面依赖 othello_web.py 提供的本地 JSON API。
如果默认端口被占用,服务会自动尝试后续端口,也可以传入 --port 8031。
人机模式右侧可选择 /gpt5p5/bot_easy 或 /gpt5p5/bot_hard。
运行单局 Bot 对战:
python .\Othello\env\othello_env.py battle --bot .\Othello\baseline\gpt5p5\bot_easy.py --games 1 --seed 1 --keep-logs运行批量对战:
python .\Othello\env\othello_env.py battle --bot .\Othello\baseline\gpt5p5\bot_easy.py --games 100 --seed 1运行 hard bot 时建议设置 2 秒单步限制:
python .\Othello\env\othello_env.py battle --bot .\Othello\baseline\gpt5p5\bot_hard.py --games 10 --seed 1 --decision-timeout 2更多说明见:
Othello/doc/README.mdOthello/doc/GAME_RULE.mdOthello/doc/BOT_API.md
打开浏览器对战:
python .\go_9x9\env\go_web.py不要直接用 Live Server 打开 go_9x9\env\index.html,该页面依赖 go_web.py 提供的本地 JSON API。
如果默认端口被占用,服务会自动尝试后续端口,也可以传入 --port 8041。
人机模式右侧可选择 /gpt5p5/bot_easy 或 /gpt5p5/bot_hard。
运行单局 Bot 对战:
python .\go_9x9\env\go_env.py battle --bot .\go_9x9\baseline\gpt5p5\bot_easy.py --games 1 --seed 1 --keep-logs运行批量对战:
python .\go_9x9\env\go_env.py battle --bot .\go_9x9\baseline\gpt5p5\bot_easy.py --games 100 --seed 1运行 hard bot 时建议设置 2 秒单步限制:
python .\go_9x9\env\go_env.py battle --bot .\go_9x9\baseline\gpt5p5\bot_hard.py --games 10 --seed 1 --decision-timeout 2更多说明见:
go_9x9/doc/README.mdgo_9x9/doc/GAME_RULE.mdgo_9x9/doc/BOT_API.md
打开浏览器对战:
python .\uno\env\uno_web.py不要直接用 Live Server 打开 uno\env\index.html,该页面依赖 uno_web.py 提供的本地 JSON API。
如果默认端口被占用,服务会自动尝试后续端口,也可以传入 --port 8061。
人机模式右侧可选择 /gpt/bot_easy 或 /gpt/bot_hard。
运行单局 Bot 对战:
python .\uno\env\uno_env.py battle --bot .\uno\baseline\gpt\bot_hard.py --games 1 --seed 1 --keep-logs运行批量对战:
python .\uno\env\uno_env.py battle --bot .\uno\baseline\gpt\bot_easy.py --games 100 --seed 1UNO 的 bot_hard.py 使用 determinized MCTS。运行 hard bot 时建议设置 2 秒单步限制:
python .\uno\env\uno_env.py battle --bot .\uno\baseline\gpt\bot_hard.py --games 100 --seed 1 --decision-timeout 2更多说明见:
uno/doc/README.mduno/doc/GAME_RULE.mduno/doc/BOT_API.md
各游戏 Bot 的 ELO 评分汇总。Othello 采用 Edax 锚点法(绝对 ELO),其余游戏采用组内 round-robin 相对 ELO(初始值 1500)。
Double round-robin,每对 2 局(先后手各一),decision_timeout = 1.5s。数据来源:lqq/arena/elo_results_v4.json。
| 排名 | Bot | ELO | W | L | D |
|---|---|---|---|---|---|
| 1 | gemini-cli/bot_v2.1 | 1582 | 8 | 2 | 0 |
| 2 | gemini-cli/bot_v2 | 1545 | 7 | 3 | 0 |
| 3 | claude-opus4p7/bot_hard_mcts | 1530 | 6 | 4 | 0 |
| 4 | claude-new/bot_v2 | 1500 | 5 | 5 | 0 |
| 5 | gpt-hard/bot | 1476 | 4 | 6 | 0 |
| 6 | gemini-cli/bot_v3 | 1367 | 0 | 10 | 0 |
每对 100 局,decision_timeout = 3.0s。数据来源:gomoku/tourney_results.json。
| 排名 | Bot | ELO | W | L | D |
|---|---|---|---|---|---|
| 1 | claude_opus4p7/bot_hard | 1661 | 185 | 15 | 0 |
| 2 | deepseek_v4/bot_hard | 1529 | 115 | 85 | 0 |
| 3 | claude_opus4p7/bot_easy | 1311 | 0 | 200 | 0 |
锚点:Edax(1300 / 1500 / 1700 / 1900 / 2100 / 2300 / 2500),每对 4 局,格式 W-L-D。数据来源:Othello/elo_results.json。
| Bot | ELO | vs 1300 | vs 1500 | vs 1700 | vs 1900 | vs 2100 | vs 2300 | vs 2500 |
|---|---|---|---|---|---|---|---|---|
| gpt5p5/bot_hard | 2819 | 4-0-0 | 4-0-0 | 4-0-0 | 4-0-0 | 4-0-0 | 4-0-0 | 4-0-0 |
| claude_opus4p7/bot_hard | 2819 | 4-0-0 | 4-0-0 | 4-0-0 | 4-0-0 | 4-0-0 | 4-0-0 | 4-0-0 |
运行方式见
Othello/run_elo.py。
每对 100 局(2 人对战),decision_timeout = 3.0s。数据来源:nimmt/tourney_results.json。
| 排名 | Bot | ELO | W | L | D |
|---|---|---|---|---|---|
| 1 | bot_greedy | 1562 | 193 | 95 | 12 |
| 2 | bot_easy | 1555 | 190 | 103 | 7 |
| 3 | bot_hard | 1465 | 118 | 174 | 8 |
| 4 | bot_random | 1418 | 82 | 211 | 7 |
每对 100 局,decision_timeout = 3.0s。数据来源:skull/tourney_results.json。
| 排名 | Bot | ELO | W | L | D |
|---|---|---|---|---|---|
| 1 | bot_simple | 1688 | 200 | 0 | 0 |
| 2 | bot_easy | 1406 | 0 | 100 | 100 |
| 2 | bot_hard | 1406 | 0 | 100 | 100 |
bot_easy与bot_hard的 100 局对战全部平局。
每对 100 局,decision_timeout = 3.0s。数据来源:uno/tourney_results.json。
| 排名 | Bot | ELO | W | L | D |
|---|---|---|---|---|---|
| 1 | gpt/bot_hard | 1509 | 53 | 47 | 0 |
| 2 | gpt/bot_easy | 1491 | 47 | 53 | 0 |
每个游戏目录下都有自己的 doc/BOT_API.md。通用约定是:
- Bot 文件通常命名为
bot.py。 - Bot 需要提供
choose_action(state)函数,或提供带choose_action方法的Bot类。 choose_action(state)必须返回state["legal_actions"]中的一个字符串动作。- Bot 抛异常或返回非法动作时,裁判会结束本局并判该 Bot 负。
- 对战命令支持
--decision-timeout 秒限制单步决策耗时;超时会以timeout状态结束并判该 Bot 负。
本仓库远程地址:
git@github.com:Sparky579/BoardArena.git