python-sc2自动化测试实战:run_multiple_games一键运行多场Bot对局并保存录像
【免费下载链接】python-sc2A StarCraft II bot api client library for Python 3项目地址: https://gitcode.com/gh_mirrors/pyt/python-sc2
做星际争霸 II(StarCraft II)的 Bot 自动化测试,python-sc2是最流行的 Python 3 客户端库。它让你用一个函数run_multiple_games批量跑完多场 Bot 对局、自动断言胜负结果,还能把关键对局保存为录像回放。本文手把手带你搭建完整的 Bot 自动化测试流程。
一、环境准备:安装 python-sc2
🛠️ 开始前需要两个条件:
- Python 3.8+环境
- 已安装支持 API 的 StarCraft II 客户端(需按 SC2 API 要求配置启动参数
-api并安装 API 组件)
安装 python-sc2 非常简单:
pip install python-sc2如果你要运行仓库里自带的示例 Bot,先把代码下载下来:
git clone https://gitcode.com/gh_mirrors/pyt/python-sc2二、GameMatch:一场比赛的配置对象
run_multiple_games接收一个比赛列表,每场比赛由 GameMatch 数据类描述,核心字段如下:
| 字段 | 说明 |
|---|---|
map_sc2 | 比赛地图,用maps.get("AcropolisLE")等获取 |
players | 玩家列表,Bot、Human或Computer三种类型 |
realtime | False为极速快进模式(推荐用于测试) |
game_time_limit | 游戏内时限(秒),超时自动判平局Tie |
random_seed | 随机种子,可固定开局保证结果可复现 |
disable_fog | 是否关闭战争迷雾 |
sc2_config | 每个玩家的 SC2 进程参数,如{"fullscreen": True} |
其中 needed_sc2_count 属性会自动计算需要启动几个 SC2 进程——打电脑只需 1 个,Bot 互相对打需要 2 个。
三、run_multiple_games 一键批量跑对局
批量入口是 run_multiple_games(同步版)和 a_run_multiple_games(异步版),只需三步:
① 构建比赛列表→② 调用批量运行→③ 遍历结果做断言。
import asyncio from sc2 import maps from sc2.data import Race from sc2.main import GameMatch, a_run_multiple_games from sc2.player import Bot from examples.protoss.warpgate_push import WarpGateBot from examples.zerg.zerg_rush import ZergRushBot matches = [ GameMatch( map_sc2=maps.get("AcropolisLE"), players=[Bot(Race.Protoss, WarpGateBot()), Bot(Race.Zerg, ZergRushBot())], realtime=False, game_time_limit=240, ) for _ in range(3) # 连打 3 场 ] results = asyncio.run(a_run_multiple_games(matches)) for match, result in zip(matches, results): print(match, result) # 每场返回 {玩家: Result} 字典批量运行有几个内置优势:
- ✅进程复用:内部通过 maintain_SCII_count 自动增减 SC2 进程,避免每场都冷启动
- ✅容错隔离:单场比赛异常只记录日志、不中断整批任务
- ✅自动清理:跑完后
KillSwitch统一收尾,避免残留进程
💡 官方注释特别指出:Bot vs Bot 场景下,
run_multiple_games比反复调用旧的run_game()更不容易崩溃(见 main.py 第 479 行 的迁移建议)。
四、保存录像:复盘每场关键对局
保存录像有两种常用姿势:
单场精跑:save_replay_as参数
用 run_game 时直接传录像路径,对局结束后自动落盘:
from sc2.main import run_game from sc2 import maps from sc2.data import Race from sc2.player import Bot result = run_game( maps.get("AcropolisLE"), [Bot(Race.Protoss, WarpGateBot()), Bot(Race.Zerg, ZergRushBot())], realtime=False, save_replay_as="MyFirstBotMatch.SC2Replay", )这就是 examples/bot_vs_bot.py 中示例的做法。
底层接口:client.save_replay
录像保存的底层实现在 Client.save_replay,它向 SC2 服务器请求录像数据并写入指定文件。注意当前版本的GameMatch不含录像字段,所以批量跑分 + 录像的推荐组合是:批量回归用run_multiple_games,需要录像的关键场次用带save_replay_as的run_game单独复跑。
回放录像:run_replay
保存的.SC2Replay文件可以用 run_replay 回放验证,写法参考 examples/watch_replay.py:
from sc2.main import run_replay run_replay(MyObserver(), "C:/Replays/MyFirstBotMatch.SC2Replay")⚠️ 录像路径必须是绝对路径;Linux 下录像需放在主目录的 SC2 回放文件夹中,仓库里 test/replays/ 目录下就有现成的职业选手对战录像可供练习。
五、官方测试脚本:批量回归怎么做
仓库自带的两个脚本是自动化回归测试的最佳范本:
| 脚本 | 做法 |
|---|---|
| test/run_example_bots_vs_computer.py | 18 个示例 Bot 逐个打电脑,限时 240 秒 |
| test/run_example_bots_vs_each_other.py | 用combinations两两配对,78 个 Bot 互打全覆盖 |
它们的关键技巧值得抄作业:
- 用
a_run_multiple_games_nokill(源码)跨场次复用 SC2 进程,速度更快(注释也提醒其较易卡死,适合 CI 快速验证) - 用
importlib动态导入examples/下所有 Bot,新增 Bot 自动纳入回归 - 统一断言结果——限时短促的对局双方应判
Result.Tie,任一字段不符立即报错
results = await a_run_multiple_games_nokill(matches) for result, game_match in zip(results, matches): assert all(v == Result.Tie for k, v in result.items())六、常见坑与实战技巧 🧭
| 问题 | 解决建议 |
|---|---|
| 对局无限打不完 | 设置game_time_limit,超时自动判Tie收尾 |
| Bot vs Bot 偶发卡死 | 优先用run_multiple_games;CI 中可换a_run_multiple_games_nokill并加超时 |
| 结果不稳定难复现 | 给GameMatch传固定random_seed |
| Linux 回放失败 | 录像必须是主目录下的绝对路径 |
想确认 Bot 的on_end是否触发 | 参考官方脚本,在 Bot 里打标记变量再断言 |
写在最后
python-sc2的批量测试链路非常清晰:GameMatch 定义比赛 → run_multiple_games 批量执行 → Result 断言 + 录像回放。照着 test/ 目录下的官方脚本改造,你半天就能搭出一套可跑在 CI 上的 StarCraft II Bot 回归测试体系。快去让你的 Bot 们打上一整天吧!
【免费下载链接】python-sc2A StarCraft II bot api client library for Python 3项目地址: https://gitcode.com/gh_mirrors/pyt/python-sc2
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考