之前在浏览 Show HN 的时候,我刷到一个很有意思的项目:An idle desktop incremental game driven by coding-agent。直译过来就是“一款由 coding-agent 驱动的桌面放置类增量游戏”。放置游戏大家应该都不陌生,coding-agent 在最近两年也是热度很高的方向,但把它们结合起来,让 AI 智能体在游戏里真正执行编程任务、把产出转化为游戏资源,玩家通过升级 agent 来加速整个循环,这个组合确实比较少见。
这篇文章不打算对原项目做逐行源码分析,因为我也拿不到它的完整实现。更合适的切入方式,是基于这个玩法创意重新设计一套最小可复现架构,并给出完整的 TypeScript + Tauri 示例代码。你可以把它当成一个“由 coding-agent 驱动的放置游戏”开发教程,也可以当成一个桌面端集成 LLM Agent 的工程案例来读。
读完之后,你会掌握几个核心点:放置游戏的资源与升级模型怎么设计、coding-agent 在游戏引擎里如何抽象和接入、怎么用 Mock 模式先跑通玩法、再切换到真实模型接口,最后如何用 Tauri 封装成桌面应用。
1. 背景:放置游戏与 coding-agent 的组合
1.1 放置游戏的核心循环
放置游戏,英文通常叫 idle game 或 incremental game,核心特征是“玩家即使不操作,游戏也会自动产出资源”。最有名的例子是 Cookie Clicker,玩家点击饼干获取饼干,再用饼干购买自动生产饼干的设施;随着设施越来越多,饼干产量指数增长,再解锁更多玩法。
这类游戏的底层循环其实非常固定:
- 资源自动产出。
- 玩家消耗资源购买升级。
- 升级提高资源产出效率。
- 解锁新内容,进入下一阶段。
这个循环的关键是“自动产出”。传统放置游戏里,产出资源的是一个个虚拟工人或虚拟设施,它们只是一个数值计算器,每秒钟给你加多少金币、多少经验,背后没有真实世界的事情发生。
1.2 coding-agent 能做什么
coding-agent 是指能够自主完成编程任务的 AI 软件代理。它通常由一个或多个大语言模型驱动,配合工具调用能力,可以读取项目代码、新建文件、修改代码、执行命令、运行测试,然后根据运行结果自我修正,直到任务完成。
目前常见的 coding-agent 形态包括:
- 命令行式 Agent,例如 OpenAI Codex CLI、OpenHands 等。
- IDE 插件式 Agent,例如 Cline、GitHub Copilot Workspace 等。
- 云端任务式 Agent,把任务提交给后台,Agent 在沙箱环境里自动完成。
它们的共同点是:把一个自然语言任务描述作为输入,Agent 自主执行并返回结果。这些任务可以很具体,比如“给登录模块补充单元测试”“修复 Issue #42 的内存泄漏”“重构订单模块的重复代码”。
1.3 这个项目创意解决什么问题
如果把 coding-agent 放进放置游戏里,游戏循环就变成了这样:
- Agent 自动接任务、执行任务。
- 任务完成后返回结果,比如新增代码行数、修复 bug 数量、生成文档页数。
- 游戏把结果换算成资源,比如 credits、代码行数、commit 次数。
- 玩家用资源升级 Agent 的速度、能力和并行槽位。
这个设计的妙处在于,传统放置游戏的“虚拟工人”是没有真实产出的,而这个项目的 Agent 是在“真实干活”。它每次执行任务的结果都不同,可能是写代码、改 bug,也可能是写文档。玩家管理的不是一个数值模拟器,而是一个真正在工作的 AI 软件团队。
从技术角度看,这个项目也适合作为 coding-agent 的可视化 Demo:Agent 的能力边界、任务耗时、输出质量,都能通过游戏界面直观展示出来。
2. 整体架构设计
2.1 模块划分
我把这个游戏拆成四个核心模块,这也是最简单的分层方式:
| 模块 | 职责 | 技术选型示例 |
|---|---|---|
| UI 层 | 展示资源、任务、升级按钮和任务日志 | React + TypeScript |
| 游戏引擎层 | 管理状态、任务分发、奖励结算、升级逻辑 | 纯 TypeScript 类 |
| Agent 适配层 | 定义统一接口,提供模拟 Agent 和真实 Agent | TypeScript 接口 + 实现类 |
| 桌面壳 | 打包成桌面应用,提供本地窗口和权限控制 | Tauri 2 |
UI 层和游戏引擎层分离很重要。引擎不应该关心你用的是 React、Vue 还是命令行,它只负责状态更新。Agent 适配层也必须用接口定义,否则后面想切换模型提供商时,改动会非常大。
2.2 游戏循环:从任务到资源
整个游戏的主循环可以用一张流程图说明:
+---------------------+ 生成任务 +---------------------+ | 任务系统 | ----------> | coding-agent | | 配置难度 / 奖励 | | Mock 或真实模型 | +---------------------+ +---------------------+ ^ | | 奖励结算对应资源 | 返回结果 | v +---------------------+ +---------------------+ | 游戏状态 / 资源 | <---------- | 结果解析与校验 | | 升级 / 日志 | +---------------------+ +---------------------+引擎每经过一个 tick,就会检查是否有空闲的 Agent 并行槽。如果有,就从任务队列里取出一个任务,交给 Agent 执行。Agent 返回结果后,引擎解析结果、校验字段,再根据任务难度和 Agent 等级发放资源。
这个循环和经典放置游戏的“生产-升级-再生产”模型一致,只是把生产函数从“每秒 +N 金币”变成了“Agent 完成任务 + 不定量资源”。
2.3 为什么用桌面端承载 agent 玩法
这个项目选择桌面端是合理的,原因有三个:
第一,真实的 coding-agent 需要读写本地文件、执行命令,桌面应用天然有文件系统和进程权限,比纯网页端更容易做安全边界控制。
第二,Agent 执行任务是一个异步、耗时的过程,桌面应用可以长时间驻留后台,比较符合放置游戏的“挂机”体验。
第三,Tauri 这类桌面框架可以把前端资源打包成体积很小的应用,同时用 Rust 提供高性能的后端能力,未来如果想在 Rust 侧直接执行 Agent 生成的代码,也有很好的扩展空间。
3. 环境准备与项目初始化
3.1 需要准备的环境
本文示例以常见环境为准,版本可以根据你的项目实际情况调整:
- Node.js 18 以上,npm 或 pnpm 均可。
- Rust 工具链(仅 Tauri 桌面打包需要,CLI 演示不需要)。
- 可选:OpenAI 兼容接口的 API Key,或者本地 Ollama 服务。
- 可选:VS Code 或其他 TypeScript IDE。
如果你暂时没有 API Key,也不要紧,代码里内置了 MockAgent,可以模拟 Agent 的执行结果,先用它跑通整个游戏循环。
3.2 初始化 Tauri + React 项目
最简单的初始化方式是用 create-tauri-app 官方