python-sc2自动化测试实战:run_multiple_games一键运行多场Bot对局并保存录像
2026/8/22 15:02:42 网站建设 项目流程

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

🛠️ 开始前需要两个条件:

  1. Python 3.8+环境
  2. 已安装支持 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玩家列表,BotHumanComputer三种类型
realtimeFalse为极速快进模式(推荐用于测试)
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_asrun_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.py18 个示例 Bot 逐个打电脑,限时 240 秒
test/run_example_bots_vs_each_other.pycombinations两两配对,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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询