我用 Spring Boot + xterm.js 写了个终端风格互动叙事游戏引擎:游戏即文件,上传一个 JSON 就能玩

一个用 Java 写的文字类终端游戏引擎,把互动叙事(场景 / 选项 / 关键词输入 / 线索 / 结局统计)搬进复古终端界面。
📌 本项目由 AI 生成 · 0 手工编程:整个 Echo Terminal(引擎代码 + 前端 + 文档 + 示例游戏)均由 AI 大模型生成,作者没有手写一行业务代码。作者负责的是:定义需求、提出玩法、逐版迭代调试与验收把关。这是一次"用 AI 从零造一个能玩的互动叙事游戏引擎"的真实实践记录。

一句话介绍

Echo Terminal · 回声终端 是一个文字类终端风格的游戏引擎。它以复古终端为载体,用文字、符号与即时反馈承载互动叙事游戏:场景、选项、关键词输入、线索与结局统计,都在一个打字机般的终端界面中完成。

核心亮点是 游戏即文件 ------上传一个符合规范的 .json 游戏文件即可安装即玩;任何人都能照着格式规范编写自己的互动叙事游戏,塞进去就能玩。

为什么想做这个

  1. 把"叙事游戏"做成一等公民的配置。 场景、动作、条件、效果四层模型,故事作者只需要写 JSON,不用碰一行 Java。
  2. 终端界面是互动叙事的完美载体。 xterm.js 打字机式的逐字输出、命令行般的氛围,天然契合"选择 / 输入 / 反馈"的叙事节奏。
  3. 想做一个"谁都能往里塞故事"的开放平台。 科幻、恐怖、推理、奇幻......换一个 JSON 就是一个新游戏。

特性

  • 🖥️ 终端式游玩体验:基于 xterm.js 的复古终端界面,支持编号选项与自然语言关键词输入;
  • 📦 安装即玩 :游戏库首页「上传安装」一个游戏文件即可游玩;同 id 覆盖已安装版本,删除外部副本自动回退内置版;
  • 🎮 内置故事 + 示例游戏:开箱即用的完整游戏(科幻、恐怖、推理题材);
  • 🧩 结构化叙事模型:场景 / 动作 / 条件 / 效果四层模型,支持 flag、物品、信任值、计数器;
  • 📜 结局与线索统计:自动追踪结局达成、线索收集与信任值变化;
  • ⚙️ 严格校验:安装时对格式、引用、嵌套深度做全面校验,拼写错误即时报错;
  • 🌐 轻量部署:单进程 Spring Boot 应用,内置全部静态资源,无外部依赖。

技术栈

层 技术
后端 Java 21 · Spring Boot 3.3.5 · Spring MVC · Thymeleaf
前端 xterm.js(终端模拟)+ jQuery,原生 CSS
数据 游戏为 JSON 文件,无数据库;会话状态存于 HttpSession
构建 Maven Wrapper(无需预装 Maven)

游戏即文件:四层叙事模型

游戏就是一个 UTF-8 编码的 JSON 文件 (≤ 5MB),核心是描述 场景 / 动作 / 条件 / 效果:

json 复制代码
{
  "format": 1,
  "id": "my-story",
  "title": "我的故事",
  "genre": "类型 · 标签",
  "version": "1.0",
  "author": "作者名",
  "description": "一句话简介,显示在游戏库卡片上。",
  "startScene": "boot",
  "endings": ["结局一", "结局二"],
  "clues": ["clue_a"],
  "scenes": { "...": "..." }
}

引擎内置全局指令,所有故事通用、无需定义:帮助、背包、重新开始、关于。

要做一个新故事?写一个符合规范的 JSON,通过网页上传、API 或放入 games/ 目录即可安装。

内置与示例游戏

游戏 类型
曙光-7 深空研究站 科幻 · 悬疑
雨夜山庄杀人事件 破案 · 推理
雾镇卫生院 恐怖 · 探险 · 解谜
九龙城寨·无面佛 中式恐怖 · 悬疑
霍格沃茨:石像鬼之夜 奇幻 · 恐怖 · 探险

快速开始

环境要求:JDK 21+(含 Maven Wrapper,无需预装 Maven)。

bash 复制代码
# 启动(首次会自动下载 Maven 依赖)
./mvnw spring-boot:run

# Windows
mvnw.cmd spring-boot:run

启动后打开浏览器访问:

项目结构

php 复制代码
echo-terminal/
├── pom.xml                          # Maven 配置(Spring Boot 3.3.5, Java 21)
├── mvnw / mvnw.cmd                  # Maven Wrapper
├── games/                           # 外部安装的游戏目录(运行时加载)
├── samples/
│   ├── GAMEFILE.md                  # ★ 游戏文件格式规范(编写必读)
│   └── *.json                       # 示例游戏
└── src/main/
    ├── java/com/example/echo/
    │   ├── EchoApplication.java     # 应用入口
    │   ├── game/                    # 游戏运行时引擎(会话、回复、渲染)
    │   ├── story/                   # 故事模型与解析(场景/动作/条件/效果)
    │   └── web/                     # 页面与 REST API
    └── resources/
        ├── stories/                 # 内置故事
        ├── static/                  # 前端资源(xterm.js、样式、脚本)
        └── templates/               # 游戏库 / 游玩页面(Thymeleaf)

HTTP API

方法 路径 说明
GET / 游戏库首页
GET /play?story=<id> 游玩页面
GET /api/stories 游戏列表(含场景数、结局数、是否内置等)
POST /api/stories/install 上传安装游戏(multipart 字段 file,仅 .json)
DELETE /api/stories/{id} 删除外部安装的游戏(内置不可删)
GET /api/stories/{id}/download 下载游戏文件
POST /api/game/start 开始一局游戏,body:{"storyId":"<id>"}
POST /api/game/input 提交玩家输入,body:{"text":"..."}

项目是怎么来的(AI 生成 · 0 手工编程)

这里得坦白说明:这个引擎不是"人肉敲代码"写出来的,而是完全由 AI 生成的项目。

  • 0 手工编程:引擎的 Java 代码、xterm.js 终端界面、Thymeleaf 页面、JSON 游戏文件与格式规范,全部由 AI 大模型生成,作者没有手写一行业务代码;
  • 作者的"编程"工作是定义与把关:提需求("我要一个终端风格的互动叙事游戏引擎")、规划四层叙事模型、逐版迭代调试、验收游戏文件校验逻辑;
  • 这不是玩具 :项目包含科幻 / 恐怖 / 推理 / 奇幻多种题材的完整游戏,支持游戏即文件、上传安装、严格校验与内置 / 外部游戏覆盖回退,说明 AI 已经能协作产出"可运行、可扩展、有工程规范"的完整游戏引擎。

把这件事写出来,是想分享一个真实结论:AI 编程的边界,远比你想象的大------只要需求拆得够细、迭代跟得够紧,一个"零手写代码"的项目也可以长得很大。上面的全部内容就是最好的证据:从引擎到游戏,都是 AI 写的。

写在最后

这个项目的乐趣在于:它既是引擎,又是作品集 。你可以直接玩,也可以照着 samples/GAMEFILE.md 规范写一个属于自己题材的互动叙事游戏,甚至把引擎当成练手 Spring Boot + Thymeleaf + xterm.js 的完整示例。

欢迎 Star、提 Issue、贡献游戏文件,或者直接把它改成你的下一个想法。

项目地址:gitee.com/itsunhao/ec... (Echo Terminal) 许可证:MIT License

相关推荐
jose1 小时前
URL 里多写了一个端口,为什么请求还能调通?
java·后端
孙浩君1 小时前
我用 Spring Boot 写了个「终端风格模拟经营游戏引擎」:引擎 + JSON 游戏文件,开箱即玩
java
y1su1 小时前
Leetcode 动态规划 模板
java·数据结构·算法·leetcode·动态规划
Wang's Blog1 小时前
Java 项目实战: 交友项目 - JWT 概述:为什么要用 Token 换掉 Session
java·ui·交友
SL_staff2 小时前
低代码选型避坑指南:为什么‘能拖拽’不等于‘能交付’?——基于JVS八大引擎的四维交付能力评估框架
java·低代码·spring cloud
李福春2 小时前
技术思考问题6:技术演讲该晒成功架构,还是交代失败与取舍?
java·开发语言·架构·computer use·深圳同盟·腾讯云架构师技术同盟·反演思维
用户7771298509123 小时前
equals和==的区别
java