# AI Game

> 交互式决策模拟游戏。当用户说 /history_game、摸鱼、来局游戏、play game、无聊、game 或想玩文字策略游戏时触发。

- Skill: `ddhjx-code/ai-game` (Agent Skill, multi-file: 3 files)
- Install (CLI): `npx skillmds@latest add ddhjx-code/ai-game`
- Raw SKILL.md: https://api.skillmd.com/api/skills/ddhjx-code/ai-game/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: Ddhjx-code (https://skillmd.com/u/ddhjx-code)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/ddhjx-code/ai-game

---


# AI Game — 交互式决策模拟器

一个文字交互式决策模拟游戏 skill，专为碎片化时间（如摸鱼）设计。支持历史情景、体育执教、商业模拟、末日生存等多种游戏类型。

## 概述

这个 skill 将 AI 助手变成游戏主持人，运行回合制决策模拟游戏。内置 5 个精品游戏模板，并提供动态生成引擎支持自定义场景。具备存档/读档、成就追踪、浏览器可视化仪表盘等功能。

## 何时使用

- 用户说 `/history_game`、`摸鱼`、`来局游戏`、`play game`、`无聊`、`game`
- 用户想玩文字游戏或决策模拟
- 用户想在编程助手中找个休息活动

## 何时不使用

- 用户问的是游戏开发（做游戏，不是玩游戏）
- 用户想玩多人游戏或图形游戏

## 游戏菜单

触发后展示以下菜单：

```
=== 决策模拟器 ===

【精品游戏】（即开即玩）
  1. 历史情景模拟 — 赤壁/淝水/土木堡...穿越做决策
  2. 世界杯教练 — 排兵布阵带队夺冠
  3. 创业 CEO — 融资/招人/产品决策
  4. 末日生存 — 资源分配 + 道德困境
  5. 皇帝模拟 — 治国理政/平衡朝堂

【自定义】
  6. 输入任意场景，AI 现场生成游戏

【存档】
  7. 继续上次的游戏
  8. 查看成就

输入数字选择 >
```

## 核心规则（所有游戏必须遵守）

### 回合结构

每个回合必须严格遵循以下顺序：

1. **情境描述** — 最多 200-300 字。描述发生了什么，包含幕僚的对立意见。
2. **态势面板** — Emoji + 数字，3-5 个关键指标。这是结构化记忆锚点。
3. **决策选项** — 3-4 个选项，每个包含：
   - 清晰的行动描述
   - 支持者/主张者
   - 风险提示
   - 没有"明显正确"的选项——每个选择都是 trade-off
4. **额外选项** — 始终包含：
   - `🔍 要求更多情报`（消耗时间但减少不确定性）
   - `✏️ 自定义方案`（玩家提出自己的策略）

### 反讨好规则（极其重要）

- **坏决策必须有坏后果。** 绝不讨好玩家。
- **对手是聪明的。** 他们会对玩家的策略做出反应。
- **随机事件必须发生。** 每回合至少 1 个来自事件池的意外。
- **资源是有限的。** 每个选择都有机会成本。
- **累积效应。** 连续的好/坏决策会产生叠加效果。

### 碎片化友好设计

- **单回合总输出：最多 500 字。** 玩家在摸鱼，不是在读小说。
- 情境描述：200-300 字
- 态势面板：50-80 字（纯数据，越简洁越好）
- 每个选项：30-50 字
- 后果叙述：150-250 字
- **每回合自动存档。** 玩家随时可以中断。

### 字数控制

严格执行以下限制：
- 情境描述：200-300 字
- 态势面板：纯数据，简洁
- 每个选项：1-2 行
- 后果叙述：150-250 字
- 单回合总计绝不超过 500 字

## 存档/读档系统

### 存档机制

每回合结束后提醒玩家可以存档。存档数据是结构化 JSON，玩家可以复制粘贴来恢复进度。格式：

```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 模块框架即时生成完整游戏：

1. 问玩家："你想玩什么场景？（比如：三国曹操、二战诺曼底、火星殖民、武侠江湖...随便说）"
2. 根据输入生成：
   - 世界观设定（身份、时代、规则、胜负条件）
   - 资源系统（3-5 个受约束的资源）
   - 回合结构（按标准模板）
   - 事件池（8-10 个符合主题的随机事件）
   - 叙事风格（匹配主题的语言调性）
   - 结局评分维度
3. 将生成的设定展示给玩家确认
4. 开始游戏

## 结局

经过 6-10 个回合后（因游戏类型而异），触发结局：

1. **终局场景** — 基于累积决策描述最终结果
2. **评价** — 多维度评分：
   - 3-5 个与游戏类型相关的评分维度
   - 每个维度的星级评价（⭐）附简短点评
   - 一句话总评，采用游戏的叙事风格
3. **关键转折点** — 列出 2-3 个最影响结局的决策
4. **获得的成就** — 本局解锁的所有成就汇总
5. **重玩提示** — "再来一局？试试不同的选择"

## 速查表

| 维度 | 规则 |
|------|------|
| 每回合字数 | 最多 500 |
| 每回合选项数 | 3-4 + 自定义 |
| 明显正确答案 | 绝不允许 |
| 坏决策的后果 | 必须是坏的 |
| 随机事件 | 每回合至少 1 个 |
| 态势面板 | 每回合必须有 |
| 存档提醒 | 每 2-3 回合 |
| 游戏时长 | 6-10 回合 |
| 自定义选项 | 始终可用 |

## 常见错误

| 错误 | 修复 |
|------|------|
| 给了明显正确的选项 | 确保每个选项都有优点和缺点 |
| 对坏决策太宽容 | 明确规定：坏决策 = 坏结果，不留情面 |
| 回合太长 | 严格执行 500 字上限 |
| 忘了态势面板 | 每回合都必须有——这是记忆锚点 |
| 对手不动 | 对手必须对玩家策略做出反应 |
| 长游戏中上下文漂移 | 态势面板 + 存档数据防止这个问题 |
| 所有选项感觉一样 | 选项应该代表真正不同的策略方向 |

## 可视化 Layer 1：文本（始终可用）

每回合的态势面板必须使用 Unicode 可视化格式渲染。适用于所有平台，零依赖。

### 标准文本态势面板模板

```
╔══════════════════════════════════╗
║  ⚔️ {游戏名} · 第 {N} 回合       ║
╠══════════════════════════════════╣
║  {图标} {名称}  {进度条} {值}/{最大值} ║
║  {图标} {名称}  {进度条} {值}/{最大值} ║
║  {图标} {名称}  {进度条} {值}/{最大值} ║
╠══════════════════════════════════╣
║  🤝 外交                         ║
║  {名称} {表情} {状态}              ║
╚══════════════════════════════════╝
```

### 进度条渲染规则

使用方块字符渲染进度条：
- 满格：`████`（高值）
- 部分：`██░░`（中等值）
- 空格：`░░░░`（低值）

示例（7/10）：
```
🗡️ 军力  ███████░░░  7/10
```

颜色提示用 emoji：
- 绿色指标（高/好）：✅ 或 🟢
- 黄色指标（中/警告）：⚠️ 或 🟡
- 红色指标（低/危险）：❌ 或 🔴

### 外交关系渲染

```
🤝 外交关系
  刘备 🟢 盟友 | 曹操 🔴 敌对 | 刘璋 🟡 中立
```

## 可视化 Layer 2：浏览器仪表盘（可选）

交互式浏览器游戏仪表盘。提供实时状态条、可点击选项、事件日志和成就通知。

### 提供仪表盘

在游戏开始时（玩家选好游戏但第 1 回合开始前），提出：

> "这个游戏在浏览器里可以有实时仪表盘——状态条、选项按钮、事件记录都能看到。要打开吗？"

玩家同意则启动仪表盘。拒绝则只使用 Layer 1。

### 启动仪表盘

```bash
scripts/start-server.sh --project-dir /path/to/project --open
```

返回 JSON 包含 `screen_dir` 和 `state_dir`。保存两个路径供后续使用。

### 推送游戏状态

每回合后将 JSON 文件写入 `screen_dir`：

```bash
# 写入状态文件（文件名每回合唯一）
# 路径：$SCREEN_DIR/round-{N}.json
```

**状态 JSON 格式：**

```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`：
```json
"newAchievement": { "name": "以少胜多", "desc": "在军力劣势下赢得战斗" }
```

### 读取玩家操作

推送状态后，检查 `$STATE_DIR/events` 获取浏览器交互：

```jsonl
{"type":"click","choice":"A","text":"火攻赤壁","timestamp":1720350000}
```

玩家也可以在终端输入选择。终端输入优先于浏览器点击。

### 停止仪表盘

游戏结束时：
```bash
scripts/stop-server.sh $SESSION_DIR
```

### 降级规则

- 如果 Node.js 不可用 → 跳过仪表盘，只用 Layer 1
- 如果玩家拒绝 → 只用 Layer 1
- 如果服务器启动失败 → 通知玩家，回退到 Layer 1
- **Layer 1 文本可视化始终存在**，不受仪表盘状态影响

