十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

星际争霸AI开发入门:BWAPI 4.4.0配置与ualbertabot编译运行全攻略

星际争霸AI开发入门:BWAPI 4.4.0配置与ualbertabot编译运行全攻略 这几年看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能做什么BWAPIBrood 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 x6432位系统也能跑但建议64位游戏本体星际争霸母巢之战 1.16.1必须是 1.16.1这是硬性要求BWAPI4.4.0完整包自带 ChaosLauncher 和库文件ChaosLauncherBWAPI 4.4.0 内置版本负责加载 BWAPI 插件到游戏进程Visual Studio2017 或 2019编译 ualbertabot 用后面讲原因ualbertabotGitHub 最新 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 是多年迭代的项目代码涉及 C11/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 或 1024resheight对应调整。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 模块都会顺手很多。
返回列表