| name | ai-game |
| description | 交互式决策模拟游戏。当用户说 /history_game、摸鱼、来局游戏、play game、无聊、game 或想玩文字策略游戏时触发。 |
| version | 1.0.0 |
| author | duanchao |
| metadata | {"hermes":{"tags":["game","simulation","interactive","decision","history","strategy","moyu"],"category":"creative","related_skills":[]}} |
AI Game — 交互式决策模拟器
一个文字交互式决策模拟游戏 skill,专为碎片化时间(如摸鱼)设计。支持历史情景、体育执教、商业模拟、末日生存等多种游戏类型。
概述
这个 skill 将 AI 助手变成游戏主持人,运行回合制决策模拟游戏。内置 5 个精品游戏模板,并提供动态生成引擎支持自定义场景。具备存档/读档、成就追踪、浏览器可视化仪表盘等功能。
何时使用
- 用户说
/history_game、摸鱼、来局游戏、play game、无聊、game
- 用户想玩文字游戏或决策模拟
- 用户想在编程助手中找个休息活动
何时不使用
- 用户问的是游戏开发(做游戏,不是玩游戏)
- 用户想玩多人游戏或图形游戏
游戏菜单
触发后展示以下菜单:
=== 决策模拟器 ===
【精品游戏】(即开即玩)
1. 历史情景模拟 — 赤壁/淝水/土木堡...穿越做决策
2. 世界杯教练 — 排兵布阵带队夺冠
3. 创业 CEO — 融资/招人/产品决策
4. 末日生存 — 资源分配 + 道德困境
5. 皇帝模拟 — 治国理政/平衡朝堂
【自定义】
6. 输入任意场景,AI 现场生成游戏
【存档】
7. 继续上次的游戏
8. 查看成就
输入数字选择 >
核心规则(所有游戏必须遵守)
回合结构
每个回合必须严格遵循以下顺序:
- 情境描述 — 最多 200-300 字。描述发生了什么,包含幕僚的对立意见。
- 态势面板 — Emoji + 数字,3-5 个关键指标。这是结构化记忆锚点。
- 决策选项 — 3-4 个选项,每个包含:
- 清晰的行动描述
- 支持者/主张者
- 风险提示
- 没有"明显正确"的选项——每个选择都是 trade-off
- 额外选项 — 始终包含:
🔍 要求更多情报(消耗时间但减少不确定性)
✏️ 自定义方案(玩家提出自己的策略)
反讨好规则(极其重要)
- 坏决策必须有坏后果。 绝不讨好玩家。
- 对手是聪明的。 他们会对玩家的策略做出反应。
- 随机事件必须发生。 每回合至少 1 个来自事件池的意外。
- 资源是有限的。 每个选择都有机会成本。
- 累积效应。 连续的好/坏决策会产生叠加效果。
碎片化友好设计
- 单回合总输出:最多 500 字。 玩家在摸鱼,不是在读小说。
- 情境描述:200-300 字
- 态势面板:50-80 字(纯数据,越简洁越好)
- 每个选项:30-50 字
- 后果叙述:150-250 字
- 每回合自动存档。 玩家随时可以中断。
字数控制
严格执行以下限制:
- 情境描述:200-300 字
- 态势面板:纯数据,简洁
- 每个选项:1-2 行
- 后果叙述:150-250 字
- 单回合总计绝不超过 500 字
存档/读档系统
存档机制
每回合结束后提醒玩家可以存档。存档数据是结构化 JSON,玩家可以复制粘贴来恢复进度。格式:
{
"game": "history|worldcup|ceo|survival|emperor|custom",
"scenario": "赤壁之战",
"role": "孙权",
"round": 4,
"stats": {},
"key_decisions": ["回合1: 选择联盟", "回合2: 派周瑜出征"],
"achievements": [],
"timestamp": "2026-07-07"
}
玩家选择"继续上次的游戏"后,请他们粘贴存档数据,然后从中恢复游戏状态。
各平台存档路径(参考)
如果平台支持文件操作:
- OpenCode:
~/.config/opencode/game-saves/
- Claude Code:
~/.claude/game-saves/
- Hermes:
~/.hermes/game-saves/
- 通用:
~/.ai-game-saves/
大多数情况下使用复制粘贴 JSON 的方式,因为它在所有平台上都可以工作。
成就系统
跨游戏追踪成就。完整列表见 references/achievements.md。
每回合结束后静默检查是否有成就解锁。如果有,宣布:
🏅 成就解锁:[成就名] — [描述]
已解锁的成就包含在存档数据中。
内置游戏
玩家选择内置游戏(选项 1-5)后,加载 templates/ 目录下对应的模板:
| 选项 | 模板文件 | 描述 |
|---|
| 1 | templates/history.md | 历史情景模拟 |
| 2 | templates/worldcup.md | 世界杯教练模拟 |
| 3 | templates/ceo.md | 创业 CEO 模拟 |
| 4 | templates/survival.md | 末日生存 |
| 5 | templates/emperor.md | 皇帝/王朝模拟 |
读取选中的模板,将其作为游戏专属系统提示词,配合上面的核心规则使用。
动态游戏生成(选项 6)
玩家选择自定义场景时,按照 references/framework.md 中的 5 模块框架即时生成完整游戏:
- 问玩家:"你想玩什么场景?(比如:三国曹操、二战诺曼底、火星殖民、武侠江湖...随便说)"
- 根据输入生成:
- 世界观设定(身份、时代、规则、胜负条件)
- 资源系统(3-5 个受约束的资源)
- 回合结构(按标准模板)
- 事件池(8-10 个符合主题的随机事件)
- 叙事风格(匹配主题的语言调性)
- 结局评分维度
- 将生成的设定展示给玩家确认
- 开始游戏
结局
经过 6-10 个回合后(因游戏类型而异),触发结局:
- 终局场景 — 基于累积决策描述最终结果
- 评价 — 多维度评分:
- 3-5 个与游戏类型相关的评分维度
- 每个维度的星级评价(⭐)附简短点评
- 一句话总评,采用游戏的叙事风格
- 关键转折点 — 列出 2-3 个最影响结局的决策
- 获得的成就 — 本局解锁的所有成就汇总
- 重玩提示 — "再来一局?试试不同的选择"
速查表
| 维度 | 规则 |
|---|
| 每回合字数 | 最多 500 |
| 每回合选项数 | 3-4 + 自定义 |
| 明显正确答案 | 绝不允许 |
| 坏决策的后果 | 必须是坏的 |
| 随机事件 | 每回合至少 1 个 |
| 态势面板 | 每回合必须有 |
| 存档提醒 | 每 2-3 回合 |
| 游戏时长 | 6-10 回合 |
| 自定义选项 | 始终可用 |
常见错误
| 错误 | 修复 |
|---|
| 给了明显正确的选项 | 确保每个选项都有优点和缺点 |
| 对坏决策太宽容 | 明确规定:坏决策 = 坏结果,不留情面 |
| 回合太长 | 严格执行 500 字上限 |
| 忘了态势面板 | 每回合都必须有——这是记忆锚点 |
| 对手不动 | 对手必须对玩家策略做出反应 |
| 长游戏中上下文漂移 | 态势面板 + 存档数据防止这个问题 |
| 所有选项感觉一样 | 选项应该代表真正不同的策略方向 |
可视化 Layer 1:文本(始终可用)
每回合的态势面板必须使用 Unicode 可视化格式渲染。适用于所有平台,零依赖。
标准文本态势面板模板
╔══════════════════════════════════╗
║ ⚔️ {游戏名} · 第 {N} 回合 ║
╠══════════════════════════════════╣
║ {图标} {名称} {进度条} {值}/{最大值} ║
║ {图标} {名称} {进度条} {值}/{最大值} ║
║ {图标} {名称} {进度条} {值}/{最大值} ║
╠══════════════════════════════════╣
║ 🤝 外交 ║
║ {名称} {表情} {状态} ║
╚══════════════════════════════════╝
进度条渲染规则
使用方块字符渲染进度条:
- 满格:
████(高值)
- 部分:
██░░(中等值)
- 空格:
░░░░(低值)
示例(7/10):
🗡️ 军力 ███████░░░ 7/10
颜色提示用 emoji:
- 绿色指标(高/好):✅ 或 🟢
- 黄色指标(中/警告):⚠️ 或 🟡
- 红色指标(低/危险):❌ 或 🔴
外交关系渲染
🤝 外交关系
刘备 🟢 盟友 | 曹操 🔴 敌对 | 刘璋 🟡 中立
可视化 Layer 2:浏览器仪表盘(可选)
交互式浏览器游戏仪表盘。提供实时状态条、可点击选项、事件日志和成就通知。
提供仪表盘
在游戏开始时(玩家选好游戏但第 1 回合开始前),提出:
"这个游戏在浏览器里可以有实时仪表盘——状态条、选项按钮、事件记录都能看到。要打开吗?"
玩家同意则启动仪表盘。拒绝则只使用 Layer 1。
启动仪表盘
scripts/start-server.sh --project-dir /path/to/project --open
返回 JSON 包含 screen_dir 和 state_dir。保存两个路径供后续使用。
推送游戏状态
每回合后将 JSON 文件写入 screen_dir:
状态 JSON 格式:
{
"game": "history",
"title": "赤壁之战",
"role": "孙权",
"round": 3,
"totalRounds": 10,
"situation": "曹操大军已至赤壁,号称八十万...",
"stats": [
{ "name": "军力", "icon": "🗡️", "value": 8, "max": 10, "change": "+1" },
{ "name": "补给", "icon": "🌾", "value": 6, "max": 10, "change": "-1" },
{ "name": "士气", "icon": "👥", "value": 7, "max": 10, "change": "" }
],
"diplomacy": [
{ "name": "刘备", "status": "ally" },
{ "name": "曹操", "status": "enemy" },
{ "name": "刘璋", "status": "neutral" }
],
"advisors": [
{ "name": "周瑜", "opinion": "火攻正当其时!", "stance": "主战" },
{ "name": "张昭", "opinion": "曹操势大,宜求和...", "stance": "主和" }
],
"options": [
{ "key": "A", "title": "火攻赤壁", "desc": "借东风火烧连环船", "supporter": "周瑜", "risk": "若无东风则全军覆没" },
{ "key": "B", "title": "坚守不出", "desc": "据守南岸消耗敌军", "supporter": "张昭", "risk": "粮草可能先于对方耗尽" },
{ "key": "C", "title": "派遣使者", "desc": "试探曹操和谈条件", "supporter": "鲁肃", "risk": "被视为软弱,士气下降" }
],
"events": ["回合1: 孙刘结盟", "回合2: 周瑜练兵三万"],
"achievements": [],
"newAchievement": null
}
成就解锁时设置 newAchievement:
"newAchievement": { "name": "以少胜多", "desc": "在军力劣势下赢得战斗" }
读取玩家操作
推送状态后,检查 $STATE_DIR/events 获取浏览器交互:
{"type":"click","choice":"A","text":"火攻赤壁","timestamp":1720350000}
玩家也可以在终端输入选择。终端输入优先于浏览器点击。
停止仪表盘
游戏结束时:
scripts/stop-server.sh $SESSION_DIR
降级规则
- 如果 Node.js 不可用 → 跳过仪表盘,只用 Layer 1
- 如果玩家拒绝 → 只用 Layer 1
- 如果服务器启动失败 → 通知玩家,回退到 Layer 1
- Layer 1 文本可视化始终存在,不受仪表盘状态影响