看我如何使用Trae全程用AI开发了Dota游戏

admin 2026-10-07 04:39:25 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文记录作者使用TraeAI工具从零开发网页版Dota游戏的全过程,涵盖单机版搭建与联机版实现。AI自主完成架构决策,选择帧同步模型与Python零依赖服务器,并自主编写约1.2万行代码及测试。过程中暴露真实环境bug,AI自行定位修复并补充契约测试。作者总结AI能承担中级工程师大部分工作,但需人类明确需求并判断结果,同时指出AI代码可理解性差可能引入安全挑战。 综合评分: 85 文章分类: 实战经验,AI安全,安全开发


看我如何使用Trae全程用AI开发了Dota游戏

原创

安全小飞侠 安全小飞侠

安全小飞侠

2026年10月6日 21:29 天津

在小说阅读器读本章

去阅读

在公众号小说中沉浸阅读

从一句”做个网页版 Dota”开始,地图、英雄、技能、AI、渲染、联机——全是 AI 写的。这篇记录真实过程,共消耗2500积分,8个小时,全程0人工编码投入。

一、起因:我想做个网页版 Dota

我想做一个能在浏览器里玩的 Dota 类游戏。最初给 AI 的需求很简单:做一个网页版 MOBA,5v5,有英雄、技能、装备、兵线、防御塔、水晶,能和 AI 对战。

技术栈、架构、怎么实现,我都没说,让 Trae 自己定。

它选了最朴素的组合:原生 JavaScript + Canvas 2D,不引任何框架、不装 npm、不跑构建。理由是:越原始,越能看清 AI 到底能做到什么程度。

二、AI 从零搭起了整个单机游戏

Trae 没有让我补充更多细节,直接开始从0到1搭建。它把单机游戏拆成了一块块可验证的功能,逐个实现并跑测试:

  • 地图与地形

    :三路兵线、野区、河道、防御塔、枢纽水晶的生成。

  • 单位系统

    :英雄、小兵、野怪、塔、水晶的统一实体结构,全局递增 UID。

  • 战斗与技能

    :10 个英雄各 3 个技能(冲锋、范围伤害、减速、治疗、召唤等),伤害结算、冷却、蓝耗、弹道特效。

  • 英雄 AI

    :走线、补刀、出装、撤退、团战决策——让单机 5v5 能自己打起来。

  • 渲染与 UI

    :Canvas 绘制地形/单位/特效/小地图,HUD、商店、计分板、选将界面。

  • 经济与道具

    :补刀赏金、商店购买、装备效果叠加。

每加一块就跑测试。项目用 macOS 自带的 JavaScriptCore(jsc)跑单元测试,不依赖 Node。到单机版稳定时,测试套件已经有两百多项,覆盖地图、野区、水晶攻击、道具经济、移速体系这些核心模块。

这个阶段我的角色只有两个:提需求、看结果。 规则怎么定、数值怎么配、AI 怎么写,全是 AI 自己拍板的。我只在它做完后跑一下游戏,判断好不好玩、要不要调整。

这一步的关键经验是:不要让 AI 「一次性生成一个游戏」,要让它拆成可验证的小块,每块能跑通再往下走。 AI 自己也确实是这么做的——它会主动把大需求拆成小任务,逐个交付。

下面是单机版跑起来的真实画面:

三、然后我想加联机,AI 自己写了规格选了架构

单机能玩之后,我给 AI 发了下面这段需求(以下是原始 prompt 原文):

在现有单机游戏模式基础上,设计并实现一个全新的多人联网对战模式。该模式应支持 2–10 名真实玩家通过网络进行实时对战,当真实玩家人数不足时,系统需自动匹配 AI 队友进行补充,确保每局对战始终保持预设的玩家总数。具体功能包括:网络连接与房间创建系统、玩家匹配机制、AI 队友智能决策系统、实时同步对战数据功能、多人交互界面设计以及对战结果统计与展示模块。需确保网络对战的稳定性、低延迟性以及 AI 队友行为的合理性与挑战性,同时保证新增模式与现有游戏系统的兼容性和整体游戏体验的一致性。

这段需求只说了”要什么”,完全没说”怎么做”。帧同步还是状态同步?用什么服务器?怎么处理掉线?这些我都没说,让 AI 自己定。

Trae 没有直接写代码,而是先产出了一份完整的产品需求文档(PRD)和 15 个任务的实施计划。在这份规格里,它自己做了几个关键的架构决策:

1. 同步模型:确定性帧同步(lockstep)

联机游戏有两条路:

– 状态同步:服务器跑游戏,客户端只收画面。服务器压力大、延迟高。

– 帧同步:服务器不跑游戏,只转发玩家的操作指令;每个客户端自己跑同一份模拟。省服务器、省带宽,但要求两边模拟 100% 一致。

AI 选了帧同步,理由写在规格里:单机模拟已经是固定步长(SIM_STEP=1/60),代码注释里就写着”未来接服务器按序重放即可对账”——单机版本身就为帧同步留了口子。再加上运行环境只有 Python 3.6 标准库、没有 Node,服务器跑不动游戏模拟,帧同步几乎是唯一合理的选择。

2. 服务器:Python 零依赖

AI 决定用 Python 标准库手写一个 WebSocket 服务,连第三方 WebSocket 库都不用——自己实现 RFC6455 的帧编解码。服务器只做三件事:创建房间、转发指令、聚合战报。服务器从头到尾不知道游戏里发生了什么,只把消息原样转发。

3. 容错机制:3 tick 输入延迟 + 33ms 缺输入宽限

本地指令存 3 个 tick(约 50ms)再执行,既给了对端收齐指令的窗口,又让操作几乎不用等网络。万一有人 33ms 内没发来指令,不卡住等,先按空输入推进一帧,迟到的指令到了再顺延。模拟永不卡死。

4. 掉线处理:广播确定性 tick 转 AI

真人断线时,服务器指定一个 tick 向全场广播”这个槽位从这一帧起交给 AI”,所有客户端在同一个 tick 把英雄控制权切给本地 AI。不支持对局内重连(锁步时钟追不回来),但保证其余人不中断。


我对这份规格做的事情只有一件:确认了 4 个业务规则。

| 决策项 | 我的选择 | | — | — | | 部署范围 | 仅局域网/本机 | | 最少真人开局数 | 1 人(其余 AI 补) | | 分队方式 | 系统自动平衡(奇数时蓝方多 1) | | 入口 | 房间码 + 快速匹配都要 |

除此之外,技术方案、任务拆分、验收标准——全是 AI 自己定的。

四、15 个任务,AI 一个一个做完了

规格定下来后,AI 按任务顺序逐个实现。我把任务列表列在这里,你能看到一个完整联机模式是怎么搭起来的:

底座层(让单机模拟变得”可同步”)

– Task 1 确定性随机:把模拟里所有 Math.random() 替换成种子化伪随机(mulberry32),保证两台电脑算出同样的结果。渲染和音频的随机不碰。

– Task 2 对局配置化:把建局逻辑抽成 setupMatch({seed, slots}),10 个槽位可以由外部配置。

同步核心

– Task 3 帧同步缓冲器(lockstep.js):纯逻辑类,管理 tick 时钟、指令桶、缺输入宽限、迟到顺延。没有任何 DOM 和网络依赖,可以直接单元测试。

– Task 4 指令采集与回放:把键盘、鼠标、技能、道具等所有输入改造成统一指令格式,网络模式下不再直接调用游戏逻辑,而是进缓冲器、再回放。

网络与服务器

– Task 5 WebSocket 客户端(net.js):连接、心跳、RTT、重连、消息队列。

– Task 6 Python WebSocket 传输层(ws_lite.py):手写 RFC6455 握手和帧编解码,同端口同时提供静态站点。

– Task 7 房间/匹配/中继逻辑(rooms.py):6 位房间码、快速匹配队列、自动分队、AI 英雄分配、指令中继、掉线转 AI、战报聚合。

– Task 8 服务器入口(dota_server.py):一行命令启动。

界面与体验

– Task 10 多人交互界面:主菜单加”在线对战”入口、大厅、10 槽位名单、英雄选择、准备状态、ping 显示、对局内网络状态条。

– Task 11 结算面板:10 人 KDA/补刀/等级战报,真人金框,本机金徽”你”。

测试与验证

– Task 9 服务器单元测试:45 项。

– Task 12 客户端帧同步测试:jsc 里跑双视角 300 tick 同构、缺输入宽限、迟到顺延、掉线转 AI。

– Task 13 双客户端 E2E:真实服务器 + 两个裸 WebSocket 客户端,跑通建房→加入→选将→开局→300 tick 指令→结算全链路。

– Task 14 无头浏览器实测:真实浏览器开两个客户端打一局,抓延迟、卡顿、AI 行为、掉线、结算。

– Task 15 文档与全量回归。

每个任务完成时,AI 都会自己跑测试、写证据。我没有逐行 review 代码,主要看测试结果和最终能不能跑起来。

五、真实环境才暴露的 Bug:发送通道被清空了

这是整个项目里最有价值的一段经历。

所有单元测试全绿,模拟的双端同构测试也通过了。然后 AI 用真实浏览器开两个页面对战——崩了。

现象:游戏能开始,时间在走,但谁都收不到对方的指令。每帧都靠 33ms 宽限空转,卡顿数等于已运行帧数,等于根本没同步。

更诡异的是:手动调用底层 client.send() 发消息,对端能收到;但走游戏自己的 MP.send() 路径,消息石沉大海。

AI 排查后定位到根因:

开局时调用 MP.start(),这个函数内部有个 reset() 会把发送通道 _send 置空。但发送通道的挂载(attachSend)是在连接服务器时就挂上的——先于 start()。结果:连接时挂好的发送函数,开局时被 reset 清掉了,之后所有 MP.send 都在往空通道里扔。

单元测试没发现,因为测试里挂载发送函数是在 start() 之后做的,顺序刚好反过来。只有真实浏览器流程才会暴露这个顺序问题。

修复很简单:把 attachSend 移到 start() 之后。AI 同时补了一条契约测试(M0),断言”start 之后发送通道必须重新挂载”。

修完重测:局域网延迟 8–16ms,卡顿率降到 0.16%,整局零不同步。

这件事让我对 AI 的能力有了更实际的判断:它会写 bug,但它也能自己定位、自己修、自己补测试防止再犯。这个闭环的速度比我手动快。

六、AI 干了什么、没干什么

基于这次项目的真实情况,我把 AI 的角色说清楚:

AI 干的:

1. 从零搭建单机版:地图、单位、10 英雄技能、英雄 AI、Canvas 渲染、HUD/商店/计分板——整个单机游戏。

2. 写联机规格:PRD、15 个任务、每个任务的验收标准。

3. 做架构决策:帧同步、Python 零依赖服务器、容错参数、掉线方案。

4. 写全部代码:单机全量 + 联机核心(lockstep.js、netplay.js、net.js、server 三个文件、UI 改造)——约 1.2 万行 JS + 1000 行 Python。

5. 写全部测试:236 项 jsc 单元测试 + 45 项 Python 测试 + 双客户端 E2E 脚本。

6. 调试:_send 被清空的 bug、掉线转 AI 时 isPlayer 标志没清的 bug,都是 AI 自己定位修复的。

7. 浏览器自动化测试:用无头浏览器开两个客户端实战,处理了”后台标签 rAF 只有 4fps 导致锁步误判”这类坑(解法是用同标签 iframe 承载第二个客户端)。

我干的:

1. 提需求:两段需求——单机是一句简单口述(做个网页版 MOBA),联机是一段详细的功能描述(见第三节原文)。

2. 确认 4 个业务规则:局域网、1 人可开、自动分队、房码+快配。

3. 最终验收:玩一下游戏、判断手感和 AI 行为是否合理。

说实话,这个项目里我的技术投入很少。从单机到联机,规格、架构、实现、测试、调试基本都是 AI 完成的。我的价值在于:知道自己要什么、能判断结果对不对。

七、AI 队友表现如何

联机里真人不够的位置由 AI 补。实测一局 4 分钟(2 真人 + 8 AI):

  • AI 英雄到 4–6 级,会分路、补刀、买装备(攻击爪、鞋、奥术鞋、药膏、净化药水)。
  • 会放技能(观测到技能 CD 在转)、会打团、阵亡后复活回线。
  • 终局数据:丛林猎手 1 杀 0 死 1 助、补刀 7;风暴术士 2 杀 2 死 1 助、补刀 6。

不算高手,但作为队友/对手够用——不发呆、不送人头,真的在试图赢。

八、掉线怎么办

帧同步的硬伤:有人掉线,所有人都在等他的指令。

处理方式:服务器检测到断线,立即广播”这个槽位从第 X 帧起交给 AI”。每个客户端在同一个 tick 把英雄控制权切给本地 AI。

实测:关掉一个客户端,3 秒内另一个弹出”⚠ Baker 掉线,AI 已接管该英雄”,对局继续。

代价:不支持对局内重连,掉线的人只能重开新局。这是帧同步的固有取舍——保证其余人不中断。

九、结算

摧毁水晶后弹出结算面板:

胜方由服务器按各端上报多数票决出。即使只剩一个真人,战报也能正常汇聚。

十、怎么玩

下载代码:https://gitee.com/brianwrf/dota-lite

零依赖,一行命令启动:

cd dota-lite
python3 server/dota_server.py

浏览器打开 http://localhost:8123。单机直接选英雄开战;点”在线对战”可以建房(6 位房间码)或快速匹配,把房间码发给同局域网的朋友就能开黑。

十一、几点体会

AI时代人的核心价值是什么?

  • 正确理解需求(Objectives):我们要做成什么

  • 衡量好坏标准(Success Criteria):怎么才算做成了

这次项目最让我意外的,是 AI 自己拆需求、自己选架构、自己实现、自己测试、自己调 bug 的完整闭环能力。

我只给了两段需求和 4 个业务确认,它就把一个能单机玩、能联机打的网页 Dota 做出来了。代码质量、测试覆盖、bug 修复都在线。

但它不是万能的: – 它写的 _send bug,单元测试全过但真实环境必崩——说明 AI 也会写出”测试覆盖不到”的问题。 – 无头浏览器测试的坑(后台标签 rAF 降频),是它自己踩了才解决的,不是一开始就知道。

我的体会是:AI 现在能承担一个中级工程师的大部分工作,甚至从零搭一个完整游戏。但你得告诉它要做什么,并且能判断它做得对不对。 如果你既不知道自己要什么、也判断不了结果,那 AI 产出的东西对你来说就是一堆跑不起来的代码。

此外的一个体会是AI编写的代码相对人类编码来说通常比较“晦涩”,代码实现逻辑也比较复杂,可理解性相对较差,由此而产生的安全漏洞对于人类程序员来说理解和修复成本也会随之增加,最后又会回到依靠AI自身来实现漏洞修复,在这种情况下如何彻底解决AI引入的安全问题也会面临诸多新的挑战,欢迎有兴趣的同学可以一起加入我们找寻解决之道云+AI安全岗位推荐。


本文主体内容也是由AI自主生成并发布的。


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。

本文转载自:安全小飞侠 安全小飞侠 安全小飞侠《看我如何使用Trae全程用AI开发了Dota游戏》

评论:0   参与:  0