玩过大模型驱动的文字游戏的人,一定遇到过这个场景:玩到第 20 轮,AI 忘了你身在何处;第 30 轮,刚才还生死与共的 NPC 形同陌路;再问它背包里有什么,它开始现场编造。聊得越自由,忘得越彻底。
这不是模型不行,是架构不行。市面上大多数 AI 文字游戏把一切都交给大模型——世界观、剧情、状态、记忆,全部塞进 prompt。上下文窗口就那么大,塞进的东西一多,遗忘是必然的。无论你换多强的模型,都只是在延缓失忆的到来。
我最近写的一个开源项目"地球Online"换了个思路:代码是世界的骨架,AI 是世界的皮肤。代码维护确定性状态(位置、时间、物品、人物关系),AI 只负责把这些状态渲染成沉浸式的文字。写逻辑管纪律,写诗交给模型——各干各的擅长的事。
核心设计一:状态硬约束,而不是"拜托 AI 记住"
玩家的一切状态由代码结构化保存,跨回合稳定延续。以人物关系为例,系统定义了 5 个等级:冷淡、认识、友好、信任、亲密,每个等级内部还有一个连续的进度值。AI 每一轮只能提交"变更申请",比如"好感度 +10",这个申请不会直接生效——代码会校验它是否符合规则,通过后才写回状态。也就是说,AI 没有资格直接篡改世界,它只能提出建议,世界是代码说了算。这才是"不会失忆"的根本保障:哪怕模型上下文里什么都忘了,磁盘上的状态文件不会忘。
核心设计二:强壮的 JSON 容错
AI 的输出天然不稳定:少个括号、多出一段注释、把字段名写错,都是家常便饭。如果直接把 AI 的回复展示给玩家,一次格式异常就会导致游戏卡死或丢回合。所以解析层做了四层容错:先尝试标准解析;失败则自动修复常见格式错误(比如去掉多余的 markdown 标记、补全截断的 JSON);再失败则带着错误信息请求模型重试;最后还有兜底降级,保证任何情况下游戏都能继续,绝不让玩家面前出现一坨报错。
核心设计三:清晰的回合数据流
每一轮游戏,数据沿着一条固定流水线流动:读取玩家状态,拼装 prompt(系统提示 + 当前状态 + 近期历史),调用大模型,解析输出,校验状态变更,写回状态并自动存档,最后把叙事文本返回给玩家。这条流水线让每个环节都可测试、可替换。想换模型?只改客户端封装。想加新玩法?只改状态结构和校验规则。叙事层的自由度完全不损害逻辑层的确定性。
玩法与体验
游戏支持 8 种世界观:现代都市、古代历史、修仙玄幻、末日生存、娱乐圈养成、荒野求生、校园恋爱、悬疑推理。开局创建角色时可以定义姓名、性别、外貌、家世、天赋和处世风格。每个回合既有编号选项,也支持完全自由的文字输入——你可以输入"我假装没看见,转身走向巷尾"这种预设之外的行动。任意时刻输入"退出"即自动存档,下次进入选"继续冒险",AI 会先回显上次的剧情再接着演,体验上接近传统单机 RPG 的读档。
技术栈与使用
项目用 Python 3.10+ 实现,MIT 协议开源,无任何商业化成分。普通玩家可以直接下载打包好的 exe 双击运行;开发者 git clone 之后安装依赖、运行入口文件即可,Windows 下还附带了 bat 启动脚本。叙事由 DeepSeek 提供,需要玩家自备 API Key——每个玩家用自己的 Key,作者不承担 API 费用,Key 也只存在本地配置文件里,项目不碰任何用户密钥。DeepSeek 有免费额度,付费价格也很低,玩一个回合的成本以厘计。
写在最后
这个项目目前还是原型,但"状态机 + 大模型"的分层思路并不局限于游戏。任何需要 AI 长期稳定扮演角色、维护一致事实的场景——陪伴应用、互动小说、虚拟员工——都面临同样的失忆问题,也都可以用同一套方案解决:让代码掌管世界,让模型只负责表达。文字游戏只是这个思路的第一个试验场。
项目已开源,地址在评论区置顶。欢迎在评论区交流思路,也欢迎提 issue 反馈 bug——这是一个仍在完善的原型,任何反馈都是帮助。