2026年11月14日

遊戲企劃:把故事拆成可實作的關卡卡

遊戲企劃

常見需求:要為一款遊戲整理故事與關卡流向,但不只是寫一篇世界觀長文,而是讓程式或關卡設計的人拿得到「這一關會發生什麼、玩家能選什麼、結束時留下什麼」。

生成式工具可以幫忙提出鉤子或對白草稿,但不能代替你決定遊戲的規則與節奏。產出的文字仍可能接近既有作品,也未必能直接做成可玩的關卡。下面用關卡卡把故事收成可檢查的資料,再用腳本核對欄位。

這次測試到哪裡

validate_scene.py 已在本機用範例 JSON 跑過:欄位齊全且總秒數在預算內會通過;把預算縮到 10 秒則正確失敗。沒有接任何遊戲引擎,也沒有請模型代寫完整劇本。

三層怎麼分工

層做什麼
感測(收集)寫下這一關的鉤子、衝突、玩家選擇與收束,並估計需要多少秒或多少回合。
決策(檢查)用腳本確認沒有缺欄、沒有重複編號,也沒有超過時間預算。
動作(實作)把通過檢查的卡交給關卡實作,或再改一輪對白與選項。

關卡卡怎麼寫

先不要寫長篇小說。一關一張卡,只留之後真的會做成互動的部分:

sample_scenes.json
[
  {
    "id": "S01",
    "hook": "玩家在廢棄車站醒來,廣播重複一句聽不清楚的話。",
    "conflict": "月台門即將關閉,但鑰匙在對面的置物櫃。",
    "player_choice": "衝去撿鑰匙,或先擋住車門。",
    "payoff": "兩種選擇都會進入同一節車廂,但道具與對白不同。",
    "estimated_seconds": 90
  },
  {
    "id": "S02",
    "hook": "車廂裡只有一個坐著的人影,不抬頭。",
    "conflict": "問話會被記錄;沉默會錯過路線提示。",
    "player_choice": "開口詢問,或只觀察座位下的紙條。",
    "payoff": "紙條與對白提供同一條路線的不同可信度。",
    "estimated_seconds": 75
  }
]
validate_scene.py
#!/usr/bin/env python3
"""檢查關卡卡 JSON 是否齊全,並加總預估秒數。"""

from __future__ import annotations

import argparse
import json
import sys
from pathlib import Path

REQUIRED = ("id", "hook", "conflict", "player_choice", "payoff", "estimated_seconds")


def validate(path: Path, budget: int) -> int:
    data = json.loads(path.read_text(encoding="utf-8"))
    if not isinstance(data, list) or not data:
        print("檔案必須是非空的關卡卡陣列。", file=sys.stderr)
        return 1
    errors = 0
    total = 0
    seen_ids: set[str] = set()
    for index, card in enumerate(data, start=1):
        missing = [key for key in REQUIRED if key not in card or card[key] in ("", None)]
        if missing:
            print(f"第 {index} 張缺少欄位:{', '.join(missing)}")
            errors += 1
            continue
        if card["id"] in seen_ids:
            print(f"重複的編號:{card['id']}")
            errors += 1
        seen_ids.add(card["id"])
        try:
            seconds = int(card["estimated_seconds"])
        except (TypeError, ValueError):
            print(f"{card['id']} 的 estimated_seconds 不是整數")
            errors += 1
            continue
        if seconds <= 0:
            print(f"{card['id']} 的秒數必須大於 0")
            errors += 1
        total += seconds
        print(f"OK  {card['id']} 約 {seconds} 秒:{card['hook'][:24]}…")
    print(f"合計預估 {total} 秒(預算 {budget} 秒)")
    if total > budget:
        print("已超過預算,請刪減或拆關。")
        errors += 1
    return 1 if errors else 0


def main() -> int:
    parser = argparse.ArgumentParser(description="檢查遊戲關卡卡")
    parser.add_argument("file", type=Path)
    parser.add_argument("--budget", type=int, default=300, help="預估秒數上限,預設 300")
    args = parser.parse_args()
    return validate(args.file, args.budget)


if __name__ == "__main__":
    sys.exit(main())

執行

python validate_scene.py sample_scenes.json --budget 300

使用生成文字時要注意什麼

若你用工具起稿,請自己改到能對上遊戲系統,並檢查是否過於接近他人的角色、地名或關卡結構。著作權與合約要求以你的團隊、發行平台與所在地法律為準;不要把提示詞或輸出直接當成可以商用的保證。若合作契約要求標示使用情形,就依契約處理。

常見錯誤

下載