
我最近手痒想做个休闲小游戏摆弄一下。打开Unity看到安装包的体积和License界面还没开始玩就已经累了。后来索性换了个思路不装引擎不用任何框架直接让AI来写。结果就是你现在看到的标题——一个纯靠AI对话生成的蚂蚁搬家小游戏单文件HTML保存后双击就能在浏览器里跑起来。从最开始只有一只蚂蚁在地图上瞎逛到能搬食物、能计分、带音效带动画前后折腾不到三个小时。这篇文章就用这个真实案例聊聊不用游戏引擎、纯AI做小游戏到底行不行如果你也想让AI帮你写个小游戏最关键的提示词该怎么组织AI写完的代码到处是bug又该怎么让它自己修我会把整个过程拆开讲清楚你照着做也能复现一个能玩的小游戏。1. 为什么纯AI方案敢把游戏引擎扔一边1.1 蚂蚁搬家这个小需求其实被高估了说句实在话看到蚂蚁搬家这四个字很多人第一反应是至少得做个地图、搞个寻路AI、再来一套资源加载管线。但你把需求拆开看这个小游戏的核心对象就这么几个一只蚂蚁、一个巢穴、一堆食物、一个计分UI核心循环也就四步更新蚂蚁位置、检查是否碰到食物、检查是否回到巢穴、渲染画面。这一幕是不是很眼熟这基本就是任何一个游戏引擎教程里第一个Demo的内容。所以对这类极简休闲玩法来说传统游戏引擎的很多能力根本用不上物理碰撞靠的是圆形距离判定不是Box2D场景管理靠一个数组遍历不需要场景树动画靠Canvas画几帧像素图不需要骨骼系统。我让AI用单文件HTML实现没有引入Unity、Cocos或者Phaser之类的引擎因为需求复杂度撑不起引擎的体量。杀鸡用牛刀不是不行只是你会被牛刀的重量拖住装编辑器、建工程、配路径、调导出参数。而纯AI生成单文件的方案从零到双击可玩能用一杯咖啡的时间跑完。1.2 不用引擎的真实代价与优势当然不用引擎也不是没有代价。最明显的是没有可视化编辑器没有组件拖拽没有现成的动画编辑器。但在这个蚂蚁搬家场景里这些代价实际感知非常弱。为什么因为蚂蚁的动作本质上是几个状态机加几个速度向量食物和巢穴就是几组坐标整个画面用一个Canvas就能画完。我不需要场景编辑器因为所谓场景在代码里就是十来行初始化数据。我把两种方案的差异做成了一张表方便你感受差距对比维度传统引擎方案纯AI单文件方案环境准备安装引擎、激活License、创建项目打开AI对话窗口即可依赖体积少说几十MB算上导出包更夸张0依赖一个HTML文件搞定上手成本要理解场景、组件、生命周期会打字、能描述需求就行分步调试编译、打包、调试器来回切改代码、刷新浏览器分发方式打包webgl、上传平台、等审核保存文件直接双击或者拖进浏览器适合场景复杂玩法、多平台发布玩法原型、休闲小游戏、技术演示这段话不是否定游戏引擎。你要做一个带有复杂关卡编辑器、需要多人在线同步、要上架到好几个平台的项目老老实实上引擎是正路。但如果你的目标是快速验证一个创意或者像我一样只是想做个能逗自己开心的小游戏纯AI单文件方案是真的快。引擎解决的是规模化生产的效率而AI单文件解决的是从想法到原型的效率两者压根不在一个赛道。2. 让AI给你打工需求描述才是最关键的技能2.1 我给AI的第一版提示词纯AI做游戏最大的门槛不是AI不够聪明而是你想不清楚自己要什么。我第一次让AI生成游戏时直接说了一句帮我写一个蚂蚁搬家的小游戏结果出来的东西基本不能玩蚂蚁满屏乱窜根本不知道要去搬食物食物还自动消失。踩了几次坑之后我学会了把需求文档化。下面是我实际用的第一版提示词你可以直接抄我想做一个蚂蚁搬家小游戏用单文件HTML实现不要引入任何外部库保存后能用浏览器直接打开运行。 玩法要求 1. 一只蚂蚁从巢穴出发在场景里随机游荡。 2. 场景中有若干个食物用彩色的圆点表示。 3. 蚂蚁靠近食物后会自动捡起食物然后一路运回巢穴。 4. 把食物运回巢穴后得分加10然后蚂蚁继续出发寻找下一个食物。 5. 画面左上角有实时得分显示。 6. 蚂蚁在搬运食物的时候颜色或外形要有明显变化方便玩家看出它带了东西。 视觉风格像素风草地绿色背景巢穴画在画面右下角。 音效可以用Web Audio生成简单的拾取音效和送回巢穴音效不要用外部音频文件。 代码组织逻辑放在script标签里即可变量命名要清晰。这一段描述有没有发现什么规律它包含四类信息运行约束、玩法规则、视觉风格、音效偏好。每一类都是AI生成时会用到的决策依据。运行约束规定了技术栈边界避免AI给你整一个需要npm install的React项目玩法规则让AI知道游戏的核心循环视觉风格给了它具体的配色语义音效约束则保证最终文件依然能保持单文件零依赖。2.2 为什么具体指令比自由发挥靠谱有人可能觉得AI不是能理解自然语言吗我随便说一句它不该懂吗当前AI的优势恰恰在于上下文理解和细节补全但它默认会补全它自己认为合理的方案。你如果只说蚂蚁搬家它可能补全成蚂蚁从A点搬东西到B点的抽象模拟可能补全成带地形障碍的策略游戏甚至可能直接给你做一个信息素模拟系统——这些都不是你想要的。我这里有个亲测有效的对比。模糊指令让蚂蚁找食物和清晰指令蚂蚁靠近食物后会自动捡起食物然后运回巢穴运回后得分加10之间的区别是前者AI只会做一个接近检测后者AI会知道食物存在两种状态——地面上待拾取和在蚂蚁身上搬运中并且搬运完成会触发计分。你给的细节越多AI生成的逻辑分支就越完整。但要注意不是让你把实现细节也说死。我写提示词时特意没用用p5.js实现或者使用Cocos的物理组件这样的话因为AI很难在受限条件下保证和你的偏好一致而且一旦它陷入模拟某个框架的API代码体积和出错概率都会飙升。需求文档负责约束做什么让AI自己决定怎么做这才是当前AI编程的正确打开方式。3. 核心代码解析蚂蚁是怎么动起来的3.1 游戏主循环与帧率控制AI拿到提示词后第一版代码很快就出来了。我的习惯是先不急着运行先看主循环怎么写。因为这个游戏能不能稳定跑起来主循环是命门。AI给我的代码大致长这样let lastTime 0; function gameLoop(timestamp) { const dt Math.min((timestamp - lastTime) / 1000, 0.05); lastTime timestamp; update(dt); render(); requestAnimationFrame(gameLoop); } requestAnimationFrame(gameLoop);可能有人要问为什么用requestAnimationFrame而不是setInterval因为浏览器会把这个回调与屏幕刷新率对齐显示更平滑而且页面切到后台时它会自动暂停不浪费资源。为什么dt要限幅为0.05因为当你从另一个标签页切回来时timestamp瞬间跳变如果不限幅dt会变成几秒钟蚂蚁会瞬移一大截这明显不是我们想看到的。这两行代码看起来不起眼但省掉了大量后续bug排查时间。我特意让AI在update(dt)里统一传一个时间增量而不是每帧用当前时间戳去做运算就是为了让所有移动逻辑基于统一的每秒速度来计算而不是每帧速度。比如蚂蚁的移动速度定义成每秒80像素帧率高时每帧移动一点点帧率低时每帧移动多一点整体效果保持一致。这个小习惯在帧率波动的浏览器环境里非常管用。3.2 蚂蚁状态机寻食、搬运、回巢这个游戏的灵魂是蚂蚁的状态切换。AI第一版写的是一个大if-else把findFood、moveToFood、returnHome三个阶段的逻辑全塞在一起结果代码看着头疼改起来更头疼。我要求它改成状态机结构每个状态函数只管一件事。简化后的核心逻辑是这样function updateAnt(ant, dt, foods) { if (ant.state seek) { // 随机转向模拟蚂蚁在地图上探索 if (Math.random() 0.02) { const angle Math.random() * Math.PI * 2; ant.vx Math.cos(angle) * ant.speed; ant.vy Math.sin(angle) * ant.speed; } // 视野内发现待拾取食物切换状态 for (const f of foods) { if (!f.picked dist(ant, f) 60) { ant.targetFood f; ant.state fetch; break; } } } else if (ant.state fetch) { moveToward(ant, ant.targetFood, dt); if (dist(ant, ant.targetFood) 8) { ant.targetFood.picked true; ant.state return; } } else if (ant.state return) { moveToward(ant, ant.home, dt); if (dist(ant, ant.home) 20) { addScore(10); ant.state seek; ant.targetFood null; } } }这段代码好懂在哪它把蚂蚁的一生分成了三个清晰阶段探索、取货、回巢。seek阶段蚂蚁采用随机转向的逻辑每帧有2%概率改变方向这样可以让它的行动看起来有探索感而不是直挺挺地直奔食物。fetch阶段就简单粗暴朝目标食物移动碰到就捡起并把食物标记为picked。return阶段朝巢穴移动到家就加分状态重置。这里有一个关键细节值得展开很多新手看到seek阶段只做了随机游走会觉得这哪是找食物实际上正是这种随机性让蚂蚁的行为看起来像真实的蚂蚁。视野内一旦出现食物它会立刻转向过去。这个发现距离我用的是60像素你可以把它理解成蚂蚁的视野半径。视角太小蚂蚁找不到食物视角太大蚂蚁会变得太聪明少了那种摸索的感觉。3.3 碰撞检测与抢食物问题碰撞检测是这个游戏里最常见的bug温床。我让AI用圆形距离判断来做也就是计算两个物体中心点的直线距离如果小于两者半径之和就认为碰撞了function dist(a, b) { return Math.hypot(a.x - b.x, a.y - b.y); }就这么一个简单函数背后藏了一个大坑多只蚂蚁同时发现同一个未拾取食物时AI的第一版会让所有蚂蚁都去追它结果第一只蚂蚁把食物捡走后其他蚂蚁还在朝那个已经失效的坐标狂奔到了地方发现啥也没有它们就会卡在fetch状态里永远空转。修复思路也很直接给食物加一个picked标志并且state切换时重新检测目标是否仍然有效。上面那段代码里if (!f.picked dist(ant, f) 60)就是修复后的版本。你或许会觉得这是小事但恰恰是这种AI生成逻辑、人来把关状态一致性的配合方式才是纯AI开发的正确姿势。AI负责把逻辑写出来你负责校验状态转换有没有漏洞。4. 实测实录从一堆Bug到一个能玩的游戏4.1 蚂蚁原地抽搐的修复第一版能跑之后我最大的感受是能跑距离能玩还很远。刚打开页面的时候蚂蚁确实在动但它不是在走路是在原地发抖。打开控制台也没看到报错我就把速度向量打了出来发现ants的vx、vy值全变成了NaN。问题原因很快锁定了蚂蚁在向某个目标移动时AI用了Vt (tx - x) / length来计算方向向量。当蚂蚁刚好站在和目标几乎重合的位置时length长度接近0除以0就得到了Infinity再乘个速度就变NaN。这种bug写代码的人一眼就能看出来但AI生成时它并不一定会在每个角落都加上保护。修复方法是在归一化之前加一个最小阈值判断function moveToward(entity, target, dt) { const dx target.x - entity.x; const dy target.y - entity.y; const len Math.hypot(dx, dy); if (len 0.001) return; // 太近了直接忽略防止NaN entity.x (dx / len) * entity.speed * dt; entity.y (dy / len) * entity.speed * dt; }这个bug给我提了个醒AI生成的代码无论看起来多完整你都得在心里过一遍边界条件。尤其是几何运算、坐标转换这种容易出现除零的地方要有意识地找AI要防御性代码。我后来直接在提示词里加了一句所有向量归一化前判断模长是否接近0再生成的结果就干净多了。4.2 Canvas尺寸问题和像素模糊第二个磨人的问题出现得也很快。我的显示器是2K屏浏览器窗口默认也没最大化结果打开游戏时画面被拉伸得乱七八糟蚂蚁和食物位置全都对不上。研究了一会儿发现问题是AI生成的Canvas用了固定宽高比如800x600而CSS又把Canvas拉伸到整个浏览器窗口坐标对不齐是必然的。正确的适配方案是监听窗口变化每次resize都重新设置Canvas的物理尺寸和逻辑坐标function resizeCanvas() { const container document.getElementById(game-container); const dpr window.devicePixelRatio || 1; canvas.width container.clientWidth * dpr; canvas.height container.clientHeight * dpr; canvas.style.width container.clientWidth px; canvas.style.height container.clientHeight px; ctx.setTransform(1, 0, 0, 1, 0, 0); // 重置变换 ctx.scale(dpr, dpr); // 适配高清屏 } window.addEventListener(resize, resizeCanvas);这里最关键的是setTransform重置再scale因为如果你每次resize都直接调用scale矩阵会累积变换画面就会奇异地越放越大。devicePixelRatio这个参数你也不该忽略否则在高分屏上画面会发虚。很多初学者会觉得Canvas不就是宽高调一下吗实际上要真正清楚物理像素和CSS像素是两回事。4.3 FPS骤降的元凶游戏能跑起来、画面也清晰之后我又遇到了性能问题。正常运行到第20秒左右帧率明显下降蚂蚁的动作开始一卡一卡的。我用Chrome的Performance面板记录了一下发现罪魁祸首竟然是AI在每帧循环里都调用了console.log打印蚂蚁数量。一帧打印一次日志看起来没啥但console.log在浏览器里是要走DevTools通道的高频调用会严重阻塞主线程。把这一行删掉之后性能立刻恢复正常。还有一个常见问题是AI喜欢在update里频繁new一些临时对象比如每帧创建数组、每帧创建坐标对象这些都会给垃圾回收器制造压力导致周期性卡顿。优化方式就是尽量在初始化时分配好对象后面只改属性值不重新创建。我实测下来的数据给大家做个参考20只蚂蚁同时搬运、50个食物、每只蚂蚁带一个简单的粒子拖尾在Chrome里稳定跑在60帧CPU占用不算高。这个规模对休闲小游戏来说完全够用。如果还想加更多单位就得考虑对象池和离屏Canvas这类优化手段了但对蚂蚁搬家这个玩法来说属于过度设计。5. 复现与扩展你也可以做一个纯AI小游戏5.1 三步复现的完整清单我知道很多人看完整篇文章最想知道的是我该怎么自己复现一遍。直接给你一套流程第一步打开任意一个支持代码生成的AI工具无论是Cursor、Claude Code还是通义灵码背后原理都一样你需要的是一个能持续对话、能修改代码文件的环境。第二步把我在2.1节给的那段提示词完整贴进去生成初始版本保存为html文件用浏览器打开。第三步准备好经历至少三轮迭代第一轮修运行报错和画面错乱第二轮修游戏手感比如蚂蚁速度、食物刷新频率第三轮加特效和音效。我的经验是不要指望一次生成就能直接发朋友圈但也不要害怕迭代。AI的优势在于不管你提多么外行的修改意见它都能翻译成代码改动。比如我跟它说食物太少了多放几个它会理解成把初始化食物的数量从5改成15我说搬运的时候蚂蚁颜色要变成红色它会理解成在state切换时修改绘制颜色。这种口语化需求到代码改动的翻译能力才是AI编程工具真正节约时间的地方。5.2 继续玩下去的方向现在这个蚂蚁搬家小游戏已经能玩了但如果我想继续往深处拓展下一步会按下面的节奏来加内容首先是引入天敌。加一两只蜘蛛在场景中巡逻蚂蚁搬食物回巢的路上如果碰到蜘蛛就会被吓回巢穴并丢失食物这样游戏就有了紧张感也自然多了一个躲避的行为逻辑。其次是引入信息素系统。真实蚂蚁是靠留下信息素来引导同类的我可以让蚂蚁搬运时在地图上留下一条淡黄色的路径其他蚂蚁会优先沿着信息素浓度高的方向搜索这样一来游戏画面会越来越有蚂蚁王国的感觉。第三是分关卡食物数量从5个逐渐递增到30个巢穴位置也可以随关卡移动最后再加一个倒计时作为挑战条件。这些扩展开销并不大因为底层的状态机框架已经搭好了。加蜘蛛只需要新增一个entity对象和一个collision检测分支加信息素系统只需要在地图数组上做浓度衰减和采样。而这些工作AI都能接手你要做的就是把玩法想法描述清楚。5.3 避坑速查表最后放一张避坑速查表是我这次实践里所有遇到过的坑和对应解法复制到你的笔记软件里能用很久症状可能原因修复方法蚂蚁原地抖动向量归一化时模长接近0导致NaN归一化前判断模长小于阈值直接跳过食物被反复计分缺少picked标志搬运后未失效给食物加状态标记回巢后重置或移除画面拉伸、坐标乱Canvas固定尺寸未随窗口自适应监听resize配合devicePixelRatio重设画布帧率突然骤降每帧打印日志或创建临时对象移除console.log对象复用多只蚂蚁抢同一食物缺少对食物激活状态的统一检查取食物时只响应未被标记picked的对象双击打开是空白页浏览器限制了部分API或路径问题确认文件是UTF-8编码用Chrome打开并看Console做纯AI小游戏这段时间我个人最大的体会是这件事的真正价值不是AI替我把代码写完了而是AI替我把从想法到原型的链路压缩到了分钟级。以前我可能为了一个简单的玩法演示要从安装引擎开始一步步走到能跑中途很容易泄气现在我可以在一顿饭的时间里验证五六个创意把宝贵的精力留给那些真正值得打磨的点子。工具在变但把需求想清楚、把逻辑边界划明白这件事永远是做游戏的底层能力。如果你也手痒别想太多挑一个特别小特别完整的玩法从一段清晰的提示词开始剩下的交给迭代就好。