这几年看AI打《星际争霸》的视频,总觉得隔着层纱。直到我自己动手,把 BWAPI 4.4.0 和 ualbertabot 这套环境跑通,让电脑自己打了一局“人机对战”,才算真正明白那些 Bot 是怎么“想”的。
这篇笔记就是我的 BWAI 学习记录第 001 篇,核心是讲清楚在 Windows 下,从零配置 BWAPI 4.4.0,编译并运行 ualbertabot 的完整流程。适合刚接触星际争霸 AI 开发、想自己跑一个开源 Bot 看看效果的朋友。我会把版本选择的理由、安装顺序的讲究、编译时容易踩的坑,以及运行时怎么确认它“真的在思考”,全部拆开揉碎说清楚。
1. BWAI项目与ualbertabot:为什么这么选
刚开始接触这个方向,容易被一堆名词绕晕:BWAPI、ChaosLauncher、AIModule、Bot、ualbertabot……我先用自己的理解把这些概念捋一遍,再解释为什么我最终选了这套组合。
1.1 BWAPI 4.4.0能做什么
BWAPI(Brood War API)是一个专门为《星际争霸:母巢之战》设计的 C++ 框架,它把游戏内部的内存数据暴露给外部程序,让 AI 代码能读取单位状态、建造列表、地图信息,同时向游戏发送指令,比如“这个农民去采矿”“那个枪兵移动到这里”。
没有 BWAPI,你想让程序操控游戏,只能靠模拟鼠标键盘,不仅慢,而且根本不稳定。有了它,AI 和游戏之间就有了正规的通信管道。
我选择 BWAPI 4.4.0,是因为它是目前兼容性和资料平衡得比较好的一版。官方在 4.4.x 系列里把不少 API 都稳定下来了,社区里能找到的示例代码大多也基于这个版本。4.2.x 虽然老,但在新系统上偶尔有兼容问题;4.5.x 的测试版我也试过,功能更新多,但对应的 Bot 示例和教程相对少,出问题不好查。对学习和复现来说,4.4.0 是最稳妥的起点。
1.2 ualbertabot是什么,拿它来学什么
ualbertabot 是阿尔伯塔大学在星际争霸 AI 竞赛中使用的 Bot,代码在 GitHub 上开源。它并不是那种纯防守或纯快攻的“死板脚本”,而是带有一定策略选择的完整 Bot 框架:有经济运营逻辑、兵力调配逻辑、侦查逻辑和基础战术决策。
拿它来学习有几点好处:第一,代码结构清晰,分模块组织,适合阅读;第二,它完整实现了 BWAPI 的 AIModule 接口,你能看到一个 Bot 从初始化到每帧更新的完整生命周期;第三,它默认带有多个策略版本,你可以在配置里切换,观察不同风格对局的变化。
当然它也不是完美到可以直接拿去打比赛的代理想象,毕竟代码量摆在那里,很多逻辑是启发式的。但对第一次接触 BWAI 的人来说,它就是一本活教材。
1.3 环境清单:踩坑要先看版本
在开始之前,我先把整个环境的版本组合列出来,后面每一步都围绕这套组合展开:
| 组件 | 版本 / 型号 | 说明 |
|---|---|---|
| 操作系统 | Windows 10 / 11 x64 | 32位系统也能跑,但建议64位 |
| 游戏本体 | 星际争霸:母巢之战 1.16.1 | 必须是 1.16.1,这是硬性要求 |
| BWAPI | 4.4.0(完整包) | 自带 ChaosLauncher 和库文件 |
| ChaosLauncher | BWAPI 4.4.0 内置版本 | 负责加载 BWAPI 插件到游戏进程 |
| Visual Studio | 2017 或 2019 | 编译 ualbertabot 用,后面讲原因 |
| ualbertabot | GitHub 最新 master 分支 | 建议 Clone 而非下载 ZIP |
| 依赖库 | Boost、BWAPI 库 | 用于编译链接 |
这套组合我实际跑通过,稳定。特别要强调:游戏版本必须是 1.16.1,哪怕你是 1.16.0 或者 1.18 都不行。原因在于 BWAPI 的实现原理——它通过内存地址映射来读写游戏数据,不同版本的游戏,内存布局完全不同。BWAPI 4.4.0 的所有库和头文件,都是基于 1.16.1 编译和测试的。
2. 基础环境搭建:游戏、BWAPI、ChaosLauncher
这个阶段的目标只有一个:让游戏能通过 ChaosLauncher 启动,并且加载 BWAPI 插件。如果这一步不稳固,后面 Bot 写得再好也跑不起来。
2.1 星际争占1.16.1的安装与验证
游戏本体可以从 Battle.net 的旧版本存档站点找,也可以在各大怀旧游戏论坛找,但下载完一定要校验文件版本。
安装时我只有一个建议:千万别用中文路径。星际争霸是老游戏,它对 Unicode 路径的支持极差,深层的非 ASCII 路径经常导致读取资源失败、游戏内文字乱码或者干脆启动崩溃。我直接把游戏放在D:\StarCraft这种纯英文短路径下。
安装完成后,进游戏看一眼右下角版本号,必须是1.16.1。如果不是,需要用 1.16.1 升级补丁覆盖。这一步不要跳过,我后来才发现很多人卡在“Bot 没反应”,其实上面装的游戏版本根本不匹配。
验证版本还有一种方式:在游戏目录下右键StarCraft.exe,查看文件属性里的版本信息。正常 1.16.1 的 exe 文件版本应该显示 1.16.1.0 或者类似编号。如果显示的是 1.0 甚至没有版本信息,说明是更老的版本,必须打补丁。
这里还顺带提醒一句,如果系统缺少旧版 DirectDraw 相关组件,游戏窗口会黑屏或者只有声音。我的做法是下载一个DirectDraw兼容补丁(类似ddraw.dll的替代文件),放到游戏目录里就能解决大多数显示问题。这个补丁网上很好找,属于星际老玩家的常用工具。
2.2 BWAPI 4.4.0与ChaosLauncher安装
BWAPI 4.4.0 的发布包是一个压缩文件,解压后会看到一个标准的目录结构。这里我先解释一下它的组成部分,因为很多人解压之后不知道该用哪个文件。
ChaosLauncher/:启动器,负责把 BWAPI 插件注入游戏。bin/:BWAPI.dll、BWAPICore.dll 等运行时库。include/:BWAPI 头文件,编译 Bot 时要用。lib/:链接库,比如 BWAPI.lib。example_bot/:官方示例 Bot,可用来验证整个环境。
我的安装路径是D:\BWAPI_4.4.0。解压后,把ChaosLauncher目录单独拉出来,放在游戏目录外面也行,放在里面也行。我自己习惯放在游戏目录外,方便区分“游戏本体”和“开发工具”。
ChaosLauncher 第一次运行时会弹出一个警告框,提示找不到 StarCraft 目录。这时候点“Browse”选中游戏目录,再点“OK”保存。如果你是从 ZIP 解压的 ChaosLauncher,它默认是绿色软件,不写注册表,所以这个路径配置每次重装系统后都要重新做一次。
2.3 BWAPI插件加载流程与窗口化设置
ChaosLauncher 主界面是一个列表,列出了可加载的插件。我们需要勾选 BWAPI 相关的插件,一般是BWAPI 4.4.0这一项。接下来有几个关键设置:
第一步,确保“Start StarCraft”按钮旁边的下拉框选择了正确的游戏路径。有时候你更新了游戏目录,ChaosLauncher 还指向老路径,就会启动失败。
第二步,在Settings里勾选Windowed Mode。BWAPI 对全屏模式的支持比较差,跑到一半频繁切屏容易打崩,窗口模式是最稳的。老游戏默认是 640x480 分辨率,窗口会比较小,但后面可以通过修改注册表里 StarCraft 的显示参数来改变分辨率,这个在第四节讲。
第三步,检查游戏类型设置。在 ChaosLauncher 的Config里,把游戏启动参数设成-window和-noaudio可以减少很多莫名奇妙的兼容问题(音频驱动的老问题会导致启动崩溃,关掉最省心)。
都配置好之后,点击Start StarCraft,游戏应该会以窗口模式启动。启动后,如果 BWAPI 注入成功,游戏窗口标题栏通常会变成StarCraft - BWAPI 4.4.0或者类似字样,并且游戏内左上角可能显示 BWAPI 版本信息。
如果你能看到这些,恭喜,BWAPI 插件已经注入成功,可以进入下一步了。
3. ualbertabot编译与实战运行
环境通了,接下来就是让 ualbertabot 跑起来。这一步是大多数人最容易卡住的地方,我尽量把每一个操作步骤和背后的原因都写清楚。
3.1 获取源码与工程结构
ualbertabot 的源码在 GitHub 上,项目名就叫 ualbertabot。我建议用git clone而不是下载 ZIP,因为 clone 可以方便地拉取后续更新,也方便自己回退版本。如果网络不稳定,ZIP 下载也行,只是后续想更新代码就得重新下载。
克隆到本地后,目录结构大概是这样的:
ualbertabot/ ├── bot/ │ └── UAlbertaBot/ │ ├── source/ │ ├── VS2017/ │ └── VS2019/ ├── BWAPIOpponent/ ├── shared/ ├── src/ └── README.md核心代码在src目录下,主要包含这些模块:
UAlbertaBotModule:实现 BWAPI AIModule 接口的入口。StrategyManager:策略选择和切换。BuildingPlacer:建筑摆放逻辑。WorkerManager:农民经济分配。CombatManager:战斗指挥。
这里要特别说明的是,ualbertabot 是多年迭代的项目,代码涉及 C++11/14 的新特性,所以对编译器的标准支持有要求。它单独提供了 VS2017 和 VS2019 的工程文件,说明作者也是用 Visual Studio 在 Windows 上开发的。
3.2 Visual Studio配置:工具集与依赖
VS版本选择:我自己用的是 Visual Studio 2019 Community,工程文件直接打开VS2019/下的解决方案文件即可。如果你机器上只有 VS2022,也可以打开,但需要在 VS 安装器里确保安装了“MSVC v141/v142 生成工具”,否则打开时会提示升级工程,升级后可能有未知问题。为了省事,我建议 VS2019 一步到位。
平台与配置:打开工程后,先把解决方案配置设为Release,平台设为x86。这一步很关键,因为 BWAPI 的库是 32 位的,你编译成 64 位程序根本链接不上。同样,Debug模式也不是不行,但运行时如果缺少对应的调试运行时库,会额外出幺蛾子,Release 是最省心选择。
依赖项Include/Lib配置:ualbertabot 源码里引用了 BWAPI 的头文件和库文件。在“项目属性 → C/C++ → 常规 → 附加包含目录”中,填入 BWAPI 的include目录;在“链接器 → 常规 → 附加库目录”中,填入 BWAPI 的lib目录。这两个路径都指向你刚才解压 BWAPI 4.4.0 的位置。
如果你装了 Boost 库,通常工程默认引用了 Boost 的某些头文件。实际上 ualbertabot 对 Boost 的依赖很轻,一般不需要额外链接 Boost 库文件,只是个别头文件引用。我用 VS2019 自带的 vcpkg 并没有特意安装 Boost 也能编译过。如果编译时报找不到 boost 头文件的错误,再用 NuGet 或 vcpkg 补上即可。
所有配置做完后,直接“生成解决方案”。第一次编译会比较慢,但正常情况下应该能顺利产出UALBERTA_BOT.dll(或者类似名字的 DLL 文件)。这个 DLL 就是我们的 Bot 本体。
3.3 编译、放置dll并跑通第一个对局
生成好的 DLL 文件,要放到 BWAPI 能够识别的位置。BWAPI 在加载 Bot 时,会按顺序查找几个目录,默认优先查找游戏目录下的bwapi-data\AI\文件夹。
如果你解压过 BWAPI 的完整包,会发现它自带了bwapi-data目录模板,里面有个AI子目录。把编译好的 DLL 放进去,重命名为AI.dll是最稳妥的方式,因为 BWAPI 默认加载的文件名就是AI.dll。当然你也可以在 BWAPI 的配置文件里指定其他文件名和路径,但第一条路最省事。
我实际放好的路径是:
D:\StarCraft\bwapi-data\AI\AI.dll接下来,回到 ChaosLauncher,确认 BWAPI 插件勾选,点击启动游戏。游戏进入主界面后,选择“Single Player → Expansion”,创建一个“Use Map Settings”的对局。这里要注意,ualbertabot 早期版本也可能对地图有要求,如果地图太大或者太特殊,Bot 可能不会动。我测试时用的是官方自带的多人对战地图,Bot 能正常出来建设基地。
进入游戏后,你看到的画面是一个正常的星际对战开局,但所有操作都是由 AI.dll 这个 Bot 控制的。第一次跑起来时,你可以观察几个特征来判断它是否正常工作:
- 农民是否自动采矿。
- 基地是否自动建造补给站(Overlord 或 Supply Depot)。
- 是否根据策略开始造兵营或孵化池。
如果这些动作都出现了,恭喜,ualbertabot 已经成功在 BWAPI 4.4.0 上跑起来了。
3.4 如何让Bot和自己对战调试
如果你不光想让两个 Bot 互打,还想自己操作人族陆军跟它对推,也可以做到。在创建房间时,把“Player”槽位设置为你控制的种族,另外的房间槽位设为“Computer”,然后在 BWAPI 的配置里设置该槽位加载 Bot。
具体做法是:在游戏目录下的bwapi-data\bwapi.ini里,找到[ai]段的ai_dll参数,指定 Bot 的 DLL 路径,然后在[players]段中把某个槽位的race设为Zerg或Protoss,把player_id设为-1表示由 AI 控制。这个稍微有点绕,我直接给个简化版配置示例:
[ai] ai_dll = bwapi-data\AI\AI.dll [players] ; 0号槽位是玩家自己,1号槽位是Bot 1 = Zerg, -1设置好之后,进游戏选“Single Player”或者通过 ChaosLauncher 的局域网模式建房间,1号槽位就会由 ualbertabot 接管,你就可以跟它正面对线了。我实际测下来,初级水平的玩家未必能轻松打赢它,但它的操作细节肯定看得出来是“程序化”的。
4. 常见问题与排查技巧实录
这一节是我最想写的部分。配置环境这种事情,教程大部分是一样的,但大家踩的坑千奇百怪。我把实际操作中遇到过的、以及朋友问过最多的几类问题整理出来,按排查路径给出来。
4.1 游戏闪退、黑屏与版本不对
游戏闪退最常见的原因是版本不匹配。BWAPI 4.4.0 只认 1.16.1,如果你的游戏是 1.16.0,或者被汉化补丁改过,注入插件时很容易直接崩溃。排查方法是:先不勾选 BWAPI 插件,单独启动游戏,确认游戏本身能正常打开。如果能打开,再勾选插件,如果这时候闪退,99% 是版本不匹配。
这里多讲一个很多人忽略的地方:汉化补丁。星际争霸的老汉化补丁改的不只是文本文件,还可能改动 exe 的资源段,导致 BWAPI 的内存补丁定位失效。我见过好几个案例,游戏原版能跑,汉化版一注入就崩。所以做 BWAI 开发,建议保持游戏原版英文,不受影响。
黑屏的情况一般不是插件问题,而是老游戏在新显卡上的 DirectDraw 兼容问题。在游戏目录放一个ddraw.dll兼容层文件,或者把StarCraft.exe的兼容模式设为 Windows XP SP3,基本都能解决。如果还是不显示画面,检查显卡驱动面板里是不是强制开了“垂直同步”或“抗锯齿”,老游戏跟这两项经常冲突。
4.2 编译失败、链接报错
VS 编译 Bot 最常见的报错有两类。
第一类是找不到头文件,比如BWAPI.h not found。这不是 BWAPI 没装好,而是“附加包含目录”没指对。重点:不是指到 BWAPI 根目录,而是要指到include这一层,因为代码里写的是#include <BWAPI.h>。同理,链接器里的“附加库目录”要指到包含BWAPI.lib的lib目录。
第二类是链接错误 LNK2019 / LNK2001,比如unresolved external symbol ...。通常是因为平台没选 x86。你想想,BWAPI 的 lib 文件是为 32 位编译的,你用 64 位链接肯定找不到符号。把解决方案平台切到x86再重新生成基本能解决。
另外,如果用的是 VS2022,打开 VS2019 工程时它会提示“需要升级工具集”。如果你选择升级,可能会遇到_MSC_VER相关报错。我的建议是:在“项目属性 → 常规 → 平台工具集”里,手动选回Visual Studio 2019 (v142),前提是 VS2022 安装器里装了 v142 工具集。如果没装,就老老实实用 VS2019。
4.3 bot不行动、日志排查
环境全对、Bot 也加载了,但进对局后发现农民站在原地发呆,一个字都不动。这种情况先别急着怀疑代码逻辑,大概率是 Bot 根本没被加载。
排查方法:查看 BWAPI 生成的日志文件,位置在bwapi-data\logs\目录下,通常有starcraft.log和bwapi.log。打开日志,如果里面出现了Failed to load AI Module或Cannot find ...,说明 DLL 加载失败了。检查三件事:DLL 路径是否正确、文件名是否为AI.dll、DLL 是否依赖了缺失的运行库(比如 Debug 版 MSVCP 运行库)。
还有一种情况:Bot 确实加载了,但它没有执行逻辑。这时候查看 ualbertabot 自己的日志输出。它在运行时会向 stdout 或文件输出一些调试信息,比如Strategy chosen: ...。如果日志停在初始化阶段,可能是地图太大导致某些数据初始化异常,换张官方地图再试。
我一开始就犯过一次低级错误:把UALBERTA_BOT.dll放进去之后忘了重命名为AI.dll,导致 BWAPI 加载的是旧文件,Bot 迟迟不动作。这个坑特别隐蔽,因为日志里不一定会明确提示,你以为代码有问题,反复重新编译了好几次才发现是文件名问题。
4.4 我试过的几个实用配置
这里分享几个我实测下来能提升体验的小配置。
窗口分辨率调整:星际 640x480 的窗口实在太小。在游戏注册表项里可以手动调分辨率,路径是HKEY_CURRENT_USER\Software\Blizzard Entertainment\StarCraft\Video,把reswidth设为 800 或 1024,resheight对应调整。BWAPI 4.4 对高分辨率的支持已经不错,只要别超过 1920x1080 基本稳定。
音效开关:在bwapi.ini里,有个[sound]或[audio]段,可以设置enable_sound = off。如果对局中 Bot 操作频繁,大量音效播放反而拖慢 CPU 处理(老游戏引擎没有多核优化),关掉能提升一点流畅度。
线程优先级:如果在同一台机器上同时跑两个 Bot 对打,可以在 Windows 任务管理器里把 StarCraft 进程的优先级设为“实时”或“高”。我的实测是,两个 Bot 对局时 CPU 占用并不高,但单核性能吃紧,优先级对响应速度有一点帮忙。
用 Debug 版 BWAPI 排查:如果怀疑 API 调用有问题,可以把 ChaosLauncher 里加载的插件换成 BWAPI 4.4.0 自带的BWAPI.dll的 Debug 版本。Debug 版会做更多的参数校验,日志输出也更详细,虽然慢一点,但定位问题非常有效。记得排查完后换回 Release 版。
4.5 日志与调试的正确姿势
最后补一点调试技巧。BWAPI 环境下的 Bot 调试跟普通程序不太一样,你不能随便打断点,因为断点一停,游戏画面就卡住了,AI 和游戏的状态就可能不同步。我常用的调试方式有两种:
第一种是在 Bot 代码里加日志输出。在 ualbertabot 源码中,BWAPI::Broodwar->printf()会把文本直接打到游戏屏幕上,适合快速看关键状态。而std::ofstream写文件日志则适合记录详细过程,比如每个决策点的输入数据。
第二种是用 BWAPI 自带的一套可视化接口,可以在地图上绘制文本、线条和圆圈。ualbertabot 本身也用了不少Broodwar->drawText()之类的调用,你在源码里搜一下就能看到它的调试图形。把Config::Debug::DrawEnabled改成true,再编译运行,就能在游戏画面里看到 Bot 的“思考过程”,比如它打算把兵拉到哪个位置、农民想去哪个矿点。
这些可视化对理解 Bot 逻辑很有帮助。我第一次打开它的 Debug 绘制时,看到满屏的线和文字,一瞬间就明白了它的决策分几步走。看代码前先看它的调试输出,相当于别人把笔记直接摊在你面前。
5. 下一步还能怎么玩
跑通 ualbertabot 只是入了个门,它背后可以扩展的方向其实不少,我列几个自己正在琢磨的,给大家当参考。
第一,可以试着修改StrategyManager里的策略参数,比如改变开局建造顺序、快攻的时机、封锁对手基地的方式。你改动一个数值,再跑几局,观察胜率和资源曲线的变化,这种方式比背源码理解得快得多。
第二,可以把 ualbertabot 和其他开源 Bot 放在同一个环境里对打,拿它当“陪练”。BWAPI 的社区有不少其他开源 Bot,结构不同,风格差异也大。让它们互打,你会发现 ualbertabot 面对不同的对手会有不同的表现,这比单纯看回放有意思多了。
第三,可以结合 BWAPI 的回放录制功能,把对局过程录制下来,赛后分析。看回放时配合 BWAPI 日志,能复盘每一个决策点,找出 Bot 的薄弱环节。
我个人在实际操作中最深的一点体会是:环境配置这类事,看着琐碎,但每一步都暗含前面的经验逻辑。版本不匹配、路径不对、位数不一致,这些问题如果不去理解背后的原因,下次换个 Bot 还是会卡在同一个地方。花时间搞懂一个“装环境”的过程,反而能把 BWAPI 的加载机制、编译依赖和调试思路串起来,后面做任何自己的 AI 模块都会顺手很多。