遊戲企劃:把故事拆成可實作的關卡卡
遊戲企劃
常見需求:要為一款遊戲整理故事與關卡流向,但不只是寫一篇世界觀長文,而是讓程式或關卡設計的人拿得到「這一關會發生什麼、玩家能選什麼、結束時留下什麼」。
生成式工具可以幫忙提出鉤子或對白草稿,但不能代替你決定遊戲的規則與節奏。產出的文字仍可能接近既有作品,也未必能直接做成可玩的關卡。下面用關卡卡把故事收成可檢查的資料,再用腳本核對欄位。
這次測試到哪裡
validate_scene.py 已在本機用範例 JSON 跑過:欄位齊全且總秒數在預算內會通過;把預算縮到 10 秒則正確失敗。沒有接任何遊戲引擎,也沒有請模型代寫完整劇本。
三層怎麼分工
| 層 | 做什麼 |
|---|---|
| 感測(收集) | 寫下這一關的鉤子、衝突、玩家選擇與收束,並估計需要多少秒或多少回合。 |
| 決策(檢查) | 用腳本確認沒有缺欄、沒有重複編號,也沒有超過時間預算。 |
| 動作(實作) | 把通過檢查的卡交給關卡實作,或再改一輪對白與選項。 |
關卡卡怎麼寫
先不要寫長篇小說。一關一張卡,只留之後真的會做成互動的部分:
hook:玩家為什麼要繼續。conflict:這一關的阻力。player_choice:至少一個真正會造成不同結果的選擇。payoff:選擇之後留下的道具、資訊或關係。estimated_seconds:預估遊玩時間,用來控節奏。
[
{
"id": "S01",
"hook": "玩家在廢棄車站醒來,廣播重複一句聽不清楚的話。",
"conflict": "月台門即將關閉,但鑰匙在對面的置物櫃。",
"player_choice": "衝去撿鑰匙,或先擋住車門。",
"payoff": "兩種選擇都會進入同一節車廂,但道具與對白不同。",
"estimated_seconds": 90
},
{
"id": "S02",
"hook": "車廂裡只有一個坐著的人影,不抬頭。",
"conflict": "問話會被記錄;沉默會錯過路線提示。",
"player_choice": "開口詢問,或只觀察座位下的紙條。",
"payoff": "紙條與對白提供同一條路線的不同可信度。",
"estimated_seconds": 75
}
]#!/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使用生成文字時要注意什麼
若你用工具起稿,請自己改到能對上遊戲系統,並檢查是否過於接近他人的角色、地名或關卡結構。著作權與合約要求以你的團隊、發行平台與所在地法律為準;不要把提示詞或輸出直接當成可以商用的保證。若合作契約要求標示使用情形,就依契約處理。
常見錯誤
- 先寫完整世界史,卻沒有任何玩家選擇,關卡做不下去。
- 兩張卡用同一個編號,或預估時間全部寫 0。
- 把生成的長對白直接貼進遊戲,沒有對過字數、配音與介面限制。
- 以為工具輸出的故事就一定是原創,或一定可以商用。