Argos Evolve —一个开源的、LLM本地的2D游戏引擎(fork它来为自己的游戏开发)

大家好。 我想了很久要开发一个2D顶视角的游戏,但一直没动手。 我想了想这个过程:选择一个游戏引擎,学习它,装上Claude,推动改变,看到错误,修正错误,反复。 然后突然想到了:为什么不在引擎内部嵌入AI呢?

我想快速地开发,希望LLM能为我编写代码,快速自我纠正,并且尽量减少token使用量。 我意识到,可能更好的方法是让Claude或LLM像指挥家一样工作,让我只需要观察并提供反馈。 因此,我开始开发Argos,这个来自希腊神话的百眼巨人。

Argos的想法是:Argos可以快速看到代码的每个部分。 错误短小而有意义,直接传递给LLM。 对象、敌人、所有东西都有一个指纹,告诉LLM它们的位置、属性、更新等等。 极快的迭代。 不需要搜索文档,浪费token和时间来进行更改。 (查看屏幕截图,我修复了一个游戏问题。)

当我这样做时,我意识到大量待办事项迅速被创建,所以我添加了“Evolve”部分,它向用户展示当前不工作的项目。 这些项目直接作为LLM的提示给用户。 复制到剪贴板,粘贴到Claude。 提示的最后部分是“从Evolve列表中删除该项目一旦完成”。 速度是关键。

因此,我们有Argos Evolve

我还想了一个想法:因为AI已经嵌入引擎了,为什么不用它作为一个反派呢? 我创建了一个叫做“Overseer”的东西,它看到我感到厌倦时就生成事件,比如boss的出现。 一个绿色的LED灯闪烁时,Overseer正在思考什么坏事。 它目前使用Gemma e2b来生成东西,但您可以使用API来使用任何API。


一旦基本功能正常工作后,我意识到还有其他一些很酷的东西是有意义的需要锁定:

2D游戏的摄像机差异相对较小。 您可以锁定摄像机来进行Space Invaders,启用X轴来进行Mario,或者解锁缩放和X、Y轴来进行开放世界系统。

但是什么关于Tetris呢? 那是块落入的地方。 但这样做的也是一个存储系统,一个背包在开放世界游戏中需要这样做。 Done。

  • 最小地图? 检查。
  • 资源节点/采集? 检查。
  • 墙壁碰撞,地板砖,迷雾? 检查,检查,检查。
  • 得分,生命,XP/等级,护盾,增强,roguelike循环? 都是检查。
  • 多人游戏? 早期阶段,但它是故意集成的,以便于后期的头痛。

然后我厌倦了复制粘贴Evolve提示系统,所以我创建了世界终端。 按下Shift + ~,游戏暂停。 您可以为每个项目、敌人、资源等生成提示。 询问更改它,更新它,所有在游戏内。 世界终端通过API连接到LLM(我使用DeepSeek 4闪烁),并像CLI一样工作。

然后我开始添加“选择所有”功能,剪切和粘贴功能等,我意识到自己陷入了一个很大的坑。 这让我想到了发布这个……

我不能继续开发它了,但我想说,相反于让它在私有仓库中停留一整年,我可能不如把它传给大家。 也许有人会觉得这个想法很酷,并且想为它贡献。

注意事项? 它是原始的。 我尽力让基础强大,并且限制了它与引擎的分歧。 但我到了一个十字路口:推动基本类型,它会成为一个坚实的街机游戏生成器,或者从基本类型中分离出来,建立一个更大的东西。 无论谁选择它,决定它的方向都是他们的。

如果您决定尝试一下,请点击“Build” > “Horde Survival”,因为它使用了整个循环:(提示 → 组合游戏 → 直接播放 → LLM检查/修复)。 开始这里来看看它如何一起工作。

哦,和我一起选择了引擎的所有组件,它可以在几乎所有地方端口。 我很乐意回答任何问题。


其他极客的内容如下,我让Claude为您写了:

核心原则是硬分离一个编译的、确定性的C++运行时一个LLM协调层。 LLM从不写原始的帧循环C++代码。 相反,它从一个冻结的引擎基本类型词汇中组合游戏:运动模型、行为、地砖角色、获胜/失败条件、生成规则等等。 如果LLM建议的内容无效,引擎会拒绝它,而不是崩溃。 仿真在零token成本下运行;LLM仅在有意义的时刻被调用(死亡、波浪清除、您的反馈)。

这使得生成的游戏便宜、安全和可重放,并且意味着一个游戏是一个约143KB的文本蓝图可以分享而不需要发送原生的代码。

这个引擎可以做什么

摄像机/轴选择是基本类型的一小部分——摄像机、游戏模式、空间模型、滚动方向、运动预设——并且基本类型的组合可以覆盖2D的大部分:

  • 顶视角的生存者/射击游戏(Vampire Survivors-style)

  • 横向滚动游戏(Mario-style平台游戏)

  • 固定屏幕的街机游戏(Space Invaders、Frogger、Pac-Man-style)

  • 网格/谜题系统(存储器作为谜题、Tetris-style的下落块)

  • 迷宫、竞技场、防守点、等等

在每种情况下,“Build”菜单都会自然语言描述,LLM会组合它,并且在确定性的播放测试门控中验证游戏是否实际工作前就会发送。

有了LLM的引擎,你不再需要重新造轮子

值得说明的是,基本类型上面的token角度。 他们是预编码的、确定性的、已测试的C++代码。 LLM只会将它们插入;它从不重新实现(或重新调试)最小地图、存储器、碰撞处理等等。 与那些“AI写原始代码”的工具相比,它们每次重新生成所有这些东西,从头开始,耗费token并重新引入相同类型的错误。 在Argos中,模型花费token在构成您的游戏上——组成、调节、感觉。 当您需要的基本类型尚未存在时,这是唯一一个情况,它会被建立,并且它会加入库(Evolve队列)。

哪些模型?

您可以使用任意的。 生成通过提供抽象,因此您可以使用云API(DeepSeek、Anthropic、OpenAI、OpenRouter)或完全本地模型通过Ollama——无论哪种方式都可以使用相同的组合管道。 DeepSeek是测试过的最便宜的可靠的云选项。 本地生成也可以使用,但请诚实地告诉自己模型大小:强大的本地模型可以组合,但非常小的模型(例如2B)往往无法遵循结构化输出的验证门控需要,且生成的游戏可能会失败而不是发送有问题的游戏。 无论哪种方式,仿真本身在零模型调用成本下运行;LLM仅在生成时和在您玩时的有意义时刻被调用。

“为什么不只是使用HTML/JS游戏框架?”

公平的问题——如果您想要一个快速的浏览器游戏,请使用它们。 Argos存在于一个不同的理由:

  • LLM不会写游戏循环。 浏览器“AI生成游戏”的工具会让模型产生原始的JS代码,每次都会产生问题。 Argos限制LLM使用一个验证的基本类型词汇。 无效的输出会被拒绝,而不是运行。 编译的C++运行时是相同的;只有安全的、有界的数据会更改。

  • 它是确定性的和可重放的。 固定的tick本机仿真意味着相同的输入总是会产生相同的结果——这是重放、调试和服务器授权多人游戏的必备条件。 大多数web/Canvas AI游戏演示都是单人游戏且非确定性的本质。

  • 零成本的本地播放。 一旦生成游戏,就会在本机上运行,而不需要模型调用。 您不需要每帧都耗费token(或等待服务器)。

  • 本机性能和发布路径。 C++/SDL3,目标是桌面/主机而不是标签——无GC卡顿的几百个实体。

  • 您和模型共同扩展引擎。 暂停,点击任何单位/地块,问模型发生了什么,改变它,保存。 您遇到的能力差距会被记录并成为您可以建立的内容。 这不是“生成一个可丢弃的游戏”,而是“共同开发一个引擎”。

简短版本:HTML框架是适合生成可丢弃的浏览器游戏的。 Argos是LLM本地、确定性的、本机引擎,您可以在此基础上进行扩展。

“好吧,但Godot有GodotIQ了,Unreal有Claude插件——这不是一样的东西吗?” 这是相反的东西,区别正是这一点。 他们是AI协助,附加到一个人类中心的引擎:模型读取并写入引擎的本机文件(.tscn/.gd、蓝图、C#),人类审查输出,引擎编译(秒到分钟),如果它崩溃,人类会调试它。 LLM是一个聪明的同事,站在引擎外面,无论它的空间或代码智能有多好,它仍然可以产生出错、脆弱或非确定性的内容——因为它在生成原始代码。

Argos逆转了这种关系:引擎的本机接口就是LLM。 模型是指挥家,操作在引擎内部的构建过程,组合使用一个验证的基本类型词汇。 无效的输出无法通过构造被发送。 它会被拒绝,而不是在运行后被审查。 有效的输出会在约0.5秒内即刻热重载,而不停止仿真。 这不是您可以在Unity、Unreal或Godot上添加的东西——它是引擎为AI,而不是AI为引擎,一个从头开始的设计。

诚实的范围

基本类型是快速、LLM生成的街机游戏的绝佳选择。 如果您想要建立一个更深入的东西(一个殖民地模拟、一个策略游戏、一个研究树),您需要先添加一些重量级的系统基本类型。 但架构支持它,并且:如果您建立新的系统作为合适的组件,且它们的状态序列化(同样使保存/加载工作),您就可以保持确定性和多人游戏路径。 这不是街机游戏的死胡同;这是一个有着坚实基础的引擎。

这是适合您的

您想要尝试使用LLM驱动的游戏开发,喜欢引擎和一个AI共同扩展的想法,并且乐意为它贡献。 选择它,或者选择深入——两者都是合理的。

仓库:https://github.com/joel-gennari/argos

堆栈:C++20 · Lua 5.4 (sol2) · SDL3 · Dear ImGui · ENet · CMake/Ninja