---
type: explanation
title: 向应用市场交付一个游戏
summary: 应用市场游戏开发是什么、涉及哪些部件（SDK、清单、回放契约、那个可选的引擎套件），以及它们如何从代码拼成一个任何人都能嵌入的、已发布的、可回放的游戏。
---

一个应用市场游戏是一个你构建一次、而 **任何人** 都能嵌入的游戏：你发布一个公开的 GitHub 仓库，平台索引它，而用户按它的游戏 id 触及它、无需你参与。这是和一个 [自定义游戏](/docs/custom-game-development/overview) 相反的那一端，后者只有你能用、而且你自己托管它。这一节是那条应用市场路径的详细、自己动手构建并发布的指南。

如果你只想要一个给你自己站点密钥用的游戏，那你要的是 [自定义游戏开发](/docs/custom-game-development/overview)。当你想把一个游戏分发给每一个 Caputchin 用户时，来这里。

## 整条流水线

```mermaid
flowchart TD
  A["写这个游戏（game-sdk）"] --> B["描述它（caputchin.json 清单）"]
  B --> C["让它可回放：run(seed, trace) 产出一个裁定"]
  C -.->|可选套件| K["engine-kit：从一个 reducer 产出 run"]
  C --> D["发布：给仓库打标签 caputchin-game"]
  D --> E["索引器固定这个包并跑回放自检"]
  E --> F["被列出且可嵌入，若自检通过则可回放"]
```

每个方框对应这一节里的一个页面：

| 部件 | 它是什么 | 页面 |
|---|---|---|
| 游戏 | 一个对着游戏 SDK 构建、跑在组件沙箱化 iframe 里的自包含 JS 包。 | [构建一个应用市场游戏](/docs/marketplace-game-development/build-a-marketplace-game)、[SDK 参考](/docs/marketplace-game-development/game-sdk-reference) |
| 清单 | 仓库根部一个描述游戏、它的预设和它的包的 `caputchin.json`。 | [caputchin.json 清单](/docs/marketplace-game-development/the-caputchin-json-manifest) |
| 回放契约 | 一个服务器重跑以得出权威决定的确定性 `run(seed, trace) -> verdict`。 | [回放契约](/docs/marketplace-game-development/replay-contract) |
| 引擎套件 | 一个 **可选** 的撰写套件，它从一个普通的 reducer 产出一个合规的 `run`。 | [engine-kit](/docs/marketplace-game-development/engine-kit) |
| 发布 | 给仓库打标签，索引器发现并固定它，可选地用 CI 自动化。 | [发布到应用市场](/docs/marketplace-game-development/publish-to-the-marketplace) |

## 可回放对不可回放 [#replayable-vs-not-replayable]

这条路径上最重要的那一个点子：一个应用市场游戏只有当它在服务端 **可回放** 时才能给验证设关卡。当索引器摄入你的游戏时，它跑一次 **回放自检**：它把你的 headless `run` 工件加载进一个密封隔离体，并确认它产出一个有效的 [裁定](/docs/marketplace-game-development/replay-contract)。

- **自检通过** → 这个游戏 **可回放**：一个真实玩家的回合在服务器上被重跑以得出决定，所以这个游戏能给一个站点密钥设关卡。
- **自检失败** → 这个游戏显示 **不可回放**。它仍被列出且仍可嵌入，但只作为 UX（不是一个安全关卡），直到你发布一个通过的版本。已经在一个更早的可回放版本上的站点保持跑那个确切的快照。

这就是为什么确定性不是可选的打磨：它是一个能守护一个站点密钥的游戏和一个仅仅是装饰的游戏之间的那条线。

## 一个应用市场游戏和一个自定义游戏有何不同

| | 应用市场游戏 | [自定义游戏](/docs/custom-game-development/overview) |
|---|---|---|
| 谁能嵌入它 | 任何人，按游戏 id | 只有你 |
| 托管 | 从你的 GitHub / npm 平台固定 | 你托管这个包（`game-src`） |
| 自定义模式 | 在 `caputchin.json` 里声明 | 在仪表盘上声明 |
| 回放工件 | 从清单的 `run` 索引 | 在仪表盘上上传 |
| 发现 | 可浏览的应用市场 | 无 |

## 从哪里开始

如果你从没构建过一个 Caputchin 游戏，就从头到尾读 [构建一个应用市场游戏](/docs/marketplace-game-development/build-a-marketplace-game)，然后是 [回放契约](/docs/marketplace-game-development/replay-contract)。当你准备好交付时，照 [发布到应用市场](/docs/marketplace-game-development/publish-to-the-marketplace) 做。那个 [引擎套件](/docs/marketplace-game-development/engine-kit) 是可选的，可以完全跳过。

## 另见

- [构建一个应用市场游戏](/docs/marketplace-game-development/build-a-marketplace-game)：那篇构建教程。
- [回放契约](/docs/marketplace-game-development/replay-contract)：什么让一个游戏可回放。
- [发布到应用市场](/docs/marketplace-game-development/publish-to-the-marketplace)：打标签、索引、自动化。
- [自定义游戏开发](/docs/custom-game-development/overview)：那个自托管、仅你自己密钥的替代方案。
