想象你是一个新手司机,第一次开进一座陌生城市。你手里的导航要做两件事:第一,它用经纬网格告诉你“我正处在幸福路与建设路的交叉口”;第二,它把整座城市抽象成一张巨大的“路口—道路”网络,告诉你从当前位置到目的地有几条路、哪条最省时间。AI 讲故事,遇到的正是同样的问题——它经常不知道“自己讲到哪里了”,也不知道“接下来还有哪些地方可以去”。叙事设计模式中的故事网格与叙事图,恰好就是这两件法宝:故事网格是给剧情空间画经纬线,用时间轴和冲突强度给每个场景钉上坐标;叙事图是把剧情画成一张有向路网,节点是事件,边是因果转移,一条从开头走到结尾的路,就是一条完整的剧情线。这篇文章会用“城市导航”贯穿始终,带你搞懂这对黄金搭档的原理、构建流程、核心算法与工程落地。

岗位关联

掌握叙事设计模式,等于给自己的 AI 内容引擎装上“路径规划大脑”——这是 AIGC 游戏、互动影视、虚拟人叙事等方向搭建可复用叙事系统的核心能力。

目录
  1. 可视化演示
  2. 一、网格定位故事:故事网格基础
  3. 二、路径规划:叙事图的结构原理
  4. 三、施工蓝图:故事网格的构建流程
  5. 四、导航算法:叙事图驱动的生成与优化
  6. 五、智能变道:交互叙事中的动态分支
  7. 六、高速巡航:工程实践与性能优化
  8. 七、城市未来:工具链与落地场景
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

演示故事网格与叙事图设计模式:以网格与节点图组织剧情结构,规划玩家分支路径,构建多线叙事体验。

本节配有交互动效(进入视口后自动加载,约 3KB)。

故事网格 节点 边 grid 网格结构组织剧情单元

一、网格定位故事:故事网格基础

设想你来到一座陌生城市,打开导航输入“我在幸福路和建设路交叉口”,朋友立刻就能在脑海的地图上标出你的位置。这种坐标感对讲故事同样重要——没有坐标系,再多的情节也只是散落在荒野里的无名小路。故事网格(Story Grid)就是给故事建立坐标系的工具。

它由美国编辑 Shawn Coyne 提出,核心思想是:把一部长篇故事切成最小单位——场景(Scene),每个场景都要在“时间轴”和“冲突强度轴”上找到自己的坐标。时间轴表示这一幕发生在叙事的哪个阶段,冲突强度表示此刻读者被故事拉得有多紧。若干场景组成一个序列(Sequence),序列再一层层叠成整个故事。

对 AI 而言,故事网格的真正价值在于“标注”。如果训练数据里每个场景都带“起始价值、结束价值、冲突等级、主题标签”,AI 就像拿到了一叠可查询的地图图例。生成剧情时,AI 能主动计算下一幕该落在网格的哪个格子,避免节奏忽快忽慢。这就是用“场景价值净变化”量化每一场戏的理由:

就像 GPS 用经纬度报出海拔起伏,故事网格用时间与冲突两把尺子,把每个场景牢牢钉在地图上——AI 从此不再“迷路”。

ΔVi=Vend(i)−Vstart(i)\displaystyle \Delta V_i = V_{\text{end}}^{(i)} - V_{\text{start}}^{(i)}
公式说明:一个场景的能量用“结尾价值减去开头价值”来衡量,差值越大,这场戏对故事的影响越强。
  1. 场景起始价值第 i 个场景开场时主角处境的评分,正值表示状态良好,相当于车刚出发时油量充足。
    Vstart(i)\displaystyle V_{\text{start}}^{(i)}
  2. 场景结束价值第 i 个场景收尾时的评分,负值表示局面受损,相当于导航显示前方拥堵。
    Vend(i)\displaystyle V_{\text{end}}^{(i)}
  3. 净价值变化用结尾减开头,得到这一场景造成的净影响,绝对值越大说明情绪起伏越猛。
    ΔVi=Vend(i)−Vstart(i)\displaystyle \Delta V_i = V_{\text{end}}^{(i)} - V_{\text{start}}^{(i)}

二、路径规划:叙事图的结构原理

一座城市的道路不是一条直线,而是由无数路口和道路交织成的网络。导航软件不关心路名,只关心两个问题:从这个路口到那个路口能不能走?走哪条路最近?叙事图(Narrative Graph)就是给故事画这样的路网。

叙事图是一张有向图:节点是故事事件或状态(相当于路口),边是事件之间的因果转移(相当于道路),边上可以挂权值表示转移成本或概率。一条从开局节点到结局节点的有向路径,就是一个具体的故事展开方式。AI 生成剧情,本质上就是在路网上做图搜索,回答“故事接下来该去哪”。

叙事图有三种典型形态:线性链只有一条路直通结局;分支树不断分岔但很少合流;有环图允许回到旧节点,制造反复与轮回。给边设权重后,AI 就能用“最低成本路径”挑选最自然、制作开销最小的剧情线:

路网决定了“从城市这头到那头有哪些走法”,叙事图则让 AI 能回答“这段剧情最值得走哪条路”——这是后续所有生成算法的基础。

C(路径)=∑e∈pathce\displaystyle C(\text{路径}) = \sum_{e \in \text{path}} c_e
公式说明:一条剧情线的总成本,等于路径上每一条边的成本相加,数值越小说明这条故事线越顺滑。
  1. 路径定义从起始节点到结束节点的一条有向节点序列,例如“开局→冲突→高潮→结局”。
    path=(n0,n1,…,nk)\displaystyle \text{path} = (n_0, n_1, \dots, n_k)
  2. 边成本含义跨越一条转移所需付出的代价,可以理解为事件突兀程度或制作工时。
    ce\displaystyle c_e
  3. 总成本求和把路径上所有边成本逐一累加,得到整条剧情线的总代价。
    C=ce1+ce2+⋯+cek\displaystyle C = c_{e_1} + c_{e_2} + \dots + c_{e_k}

三、施工蓝图:故事网格的构建流程

城市不能先铺路再分区——规划师要先决定住宅区、商业区、工业区落在哪,再考虑道路怎么串联。故事网格的构建也遵循“先分区、后铺路”的顺序,共四步。

第一步素材分类:把灵感碎片按主题、场景、角色目标归组,就像统计人口流向。第二步价值转换:要求每个场景都必须实现某个二元价值的摆动(成功↔失败、爱↔恨、生↔死),不允许平庸过场。第三步冲突设计:让价值摆动的幅度逐层增大,张力像绕城高速一样向外扩张。第四步场景联结:用因果链把场景串成序列,得到可以交给 AI 的网格蓝图。

实践中最常用的是“网格表”,每一行是一个场景,列包含序号、时间点、空间、主角目标、冲突来源、起始价值、结束价值、主题标签。AI 训练时直接消费这张表,生成时也输出同样结构,结果可回填、可比对。而衡量一段序列是否太“平”或太“吵”,可用序列总张力:

分区图不合理,城市再繁华也会堵车;价值转换没设计好,剧情再花哨也让人昏昏欲睡——网格构建流程就是 AI 叙事工程的“总体规划”。

Vseq=∑i=1m∣ΔVi∣\displaystyle V_{\text{seq}} = \sum_{i=1}^{m} \left| \Delta V_i \right|
公式说明:把一个序列里每个场景的“价值变化绝对值”相加,总和越大说明这段剧情情绪起伏越剧烈。
  1. 序列长度一个序列里包含的连续场景个数,相当于一段高架路上有几个出入口。
    m=序列中的场景数量\displaystyle m = \text{序列中的场景数量}
  2. 单场景变化量每个场景净价值变化的绝对值,保留幅度信息,去掉方向。
    ∣ΔVi∣\displaystyle | \Delta V_i |
  3. 序列总张力把所有场景的幅度相加,衡量整段叙事带来的情绪总剂量。
    Vseq=∑i=1m∣ΔVi∣\displaystyle V_{\text{seq}} = \sum_{i=1}^{m} | \Delta V_i |

四、导航算法:叙事图驱动的生成与优化

导航系统不会一条路走到黑,它会在后台比较“红绿灯最少”“高速优先”“距离最短”等候选,再挑一条最合适的报给你。AI 在叙事图上选剧情线,用的正是同一套逻辑。

当叙事图构建好、起终点给定后,剧情生成问题就变成了路径搜索问题。最经典的三个算法:广度优先搜索(BFS)用来找“节点数最少”的剧情;Dijkstra 用来找“加权成本最低”的剧情;A* 加上启发式估值,在图中快速逼近最优解。生成前还要做剪枝(Pruning):凡是与玩家当前状态冲突的分支直接移除,成本超预算的路线也可以裁剪。

为了让结果不千篇一律,实践中常先求出 K 条候选路径,再按权重随机挑一条。整个过程的灵魂是 Dijkstra 的“松弛”操作——它不断询问:绕道另一个路口会不会更便宜?

导航的每一次“重新计算”都是一次松弛,AI 在无数路口间反复松弛,最终锁定一条通往好故事的最优路线。

dist[v]=min⁡(dist[v], dist[u]+cu,v)\displaystyle \text{dist}[v] = \min\left(\text{dist}[v],\ \text{dist}[u] + c_{u,v}\right)
公式说明:每发现一条更便宜的路到达节点 v,就用它覆盖旧记录;反复执行后,dist 数组里存的就是全局最优。
  1. 当前已知最优记录从起点到节点 v 目前发现的最低叙事成本。
    dist[v]\displaystyle \text{dist}[v]
  2. 候选绕行成本先走到节点 u,再走边 u→v 的总成本。
    dist[u]+cu,v\displaystyle \text{dist}[u] + c_{u,v}
  3. 取最小值若绕行更划算就更新 dist[v],这个更新动作就是“松弛”。
    min⁡(dist[v], dist[u]+cu,v)\displaystyle \min(\text{dist}[v],\ \text{dist}[u] + c_{u,v})

五、智能变道:交互叙事中的动态分支

开车途中司机突然说“不去南站了,改去机场”,导航立刻基于当前车道重新规划。交互叙事就是每时每刻允许乘客改变目的地——玩家在游戏中的任何选择,都可能让剧情线换一条路走。

交互叙事要求叙事图在运行时保持“半成品”状态。核心是三件事:条件转移边,边上挂着触发条件;状态追踪(Tracking),记录玩家历史;结局聚合,把大量分支收束到有限结局集合。条件边可以表达“玩家持有金色钥匙才能进入密室”;状态追踪则记录对话历史、好感度、背包,作为选边依据。

当玩家走到某个节点,AI 重新执行一次图搜索,把从当前节点到所有可能结局的路径更新一遍。多个玩家路径可能最终汇聚到同一个结局,这就是结局聚合。为了让分支选择更自然,AI 常用 softmax 把“边分数”换算成“选择概率”:

交互叙事像一位永不抱怨的跟车导航——你变道,它重算;你犹豫,它给出概率最高的三条路供你选择。

P(ei∣s)=exp⁡(θi⋅ϕ(s))∑j∈out(n)exp⁡(θj⋅ϕ(s))\displaystyle P(e_i \mid s) = \frac{\exp\big(\theta_i \cdot \phi(s)\big)}{\sum_{j \in \text{out}(n)} \exp\big(\theta_j \cdot \phi(s)\big)}
公式说明:把玩家状态变成特征,给每条候选边打分,再归一化成概率;分越高,这条剧情分支被选中的概率越大。
  1. 状态特征把玩家的历史状态(对话、道具、好感度)编码成一个向量,相当于导航读取你的实时位置。
    ϕ(s)\displaystyle \phi(s)
  2. 边打分用边专属权重对当前状态打分,分高代表这条边与现状更契合。
    θi⋅ϕ(s)\displaystyle \theta_i \cdot \phi(s)
  3. 指数归一化对全部出边的分数取指数后做比值,得到和为 1 的概率分布。
    exp⁡(θi⋅ϕ(s))∑jexp⁡(θj⋅ϕ(s))\displaystyle \frac{\exp(\theta_i \cdot \phi(s))}{\sum_{j} \exp(\theta_j \cdot \phi(s))}

六、高速巡航:工程实践与性能优化

晚高峰几百万人同时用导航,服务器不能因人变多就卡死。叙事图在生产环境也面临同样挑战:大型游戏的叙事图可能有数万节点,不能让每次生成都做全图搜索。

工程优化有四板斧。第一,图压缩:把中间没有分支的长链压缩成一条“超级边”,相当于把一段连续直路折叠成一个高架口。第二,路径缓存:高频剧情路径的计算结果放进缓存,用 LRU 淘汰,重复查询变成 O(1)。第三,并行生成:把无关分支分发给多个线程或节点预生成。第四,LOD 分层:远处只维持粗粒度叙事,等玩家靠近再细化细节。

复杂度是评估这一切的尺子。BFS/DFS 的复杂度是 O(|V|+|E|),Dijkstra 为 O((|V|+|E|) log |V|)。图压缩后 |V| 和 |E| 大幅下降,缓存让重复查询近乎免费,总体延迟可以下降一个数量级:

调度中心有压缩地图和快速缓存,全城导航才不会瘫——叙事引擎有优化,开放世界才跑得动。

TDijkstra=O((∣V∣+∣E∣)log⁡∣V∣)\displaystyle T_{\text{Dijkstra}} = O\big((|V| + |E|)\log |V|\big)
公式说明:节点和边数越多,算法耗时越长,但通过堆结构可以控制在“准线性”范围,图翻倍耗时只翻倍多一点。
  1. 节点数叙事图中的故事节点总数,相当于城市的十字路口数。
    ∣V∣\displaystyle |V|
  2. 边数节点间可能发生转移的总数,相当于路口的连通道路数。
    ∣E∣\displaystyle |E|
  3. 堆操作成本优先队列每次弹出与压入的对数时间,是 Dijkstra 的主要开销来源。
    log⁡∣V∣\displaystyle \log |V|
  4. 整体复杂度图规模翻倍时耗时近似翻倍,属于可接受的可扩展范围。
    O((∣V∣+∣E∣)log⁡∣V∣)\displaystyle O((|V|+|E|)\log |V|)

七、城市未来:工具链与落地场景

无人驾驶时代的城市需要高精地图和调度平台协同。叙事设计模式的终极形态也是这样一套“高精故事地图 + 强大生成路由平台”。

落地需要完整工具链:可视化叙事图编辑器(拖节点、连线、挂条件)、标准数据格式(JSON 或图数据库)、自动化测试(自动跑遍全部分支,检测死胡同与坏引用)、版本管理(叙事资产像代码一样可 diff、可回滚)。这些工具让编剧、策划、AI 工程师在同一张图上协作。

应用场景包括:开放世界动态支线生成、玩家 UGC 创作补充剧情、文本+语音+动画的多模态叙事同步播放,以及内容合规审查。工程上最关键的验收指标是“结局覆盖率”——它检验所有设计好的结局是否真的可达:

无人驾驶车离不开高精地图与可靠调度,AI 叙事作品同样需要这张“故事高精地图”以及永不熄火的“路径引擎”。

Coverage=#{g∈结局∣可达(g)}#{全部结局}\displaystyle \text{Coverage} = \frac{\#\{g \in \text{结局} \mid \text{可达}(g)\}}{\#\{\text{全部结局}\}}
公式说明:可达结局数除以全部结局数,比值接近 1 说明故事分支完整,没有断头路。
  1. 分子(可达结局数)从开局沿合法路径能到达的结局节点数量。
    R=#{g∈endings∣reachable(g)}\displaystyle R = \#\{g \in \text{endings} \mid \text{reachable}(g)\}
  2. 分母(全部结局数)作者在叙事图中设计的结局节点总数。
    A=#{endings}\displaystyle A = \#\{\text{endings}\}
  3. 覆盖率二者相除,量化“剧情路网”的完整性。
    Coverage=RA\displaystyle \text{Coverage} = \frac{R}{A}

AI 应用场景

开放世界动态支线任务生成

阶段:内容生成 / 运行时动态编排

解决的问题:传统开放世界支线靠策划手写,几百个任务后内容重复率高、更新成本大。AI 用故事网格给支线打坐标,用叙事图做任务路线规划,按玩家位置实时生成新支线。

具体案例:某开放世界 RPG 中,玩家完成主线第 3 章后进入新区域。AI 读取该区域的叙事图,生成 5 条候选支线,再根据玩家职业与好感度剪枝为 2 条,并确保这两条支线能在未来的剧情节点与主线无缝衔接,避免了“支线做完就忘记”的老问题。

互动影视的分支剧情管理与质检

阶段:离线图构建 + 在线状态路由

解决的问题:互动剧集动辄几十个结局,剧本结构容易失控,漏接分支会导致穿帮。故事网格表用于编剧标注每场戏的价值走向,叙事图用于自动化质检。

具体案例:某互动短剧有 12 个结局、400 个剧本片段。AI 把全部片段构造成叙事图,自动跑分支测试,找出无法到达的结局和互相矛盾的变量,把测试时间从一周缩短到 2 小时。

虚拟数字人对话中的状态编排

阶段:对话管理 / 状态追踪

解决的问题:虚拟数字人对话容易上下文漂移。用叙事图作为对话状态机,节点是对话主题,边是情绪与意图转移,用户的每句话都会触发条件边。

具体案例:银行大堂数字人接待客户时,AI 根据客户情绪边做路由:客户不满→立即转人工;感兴趣→详细介绍金融产品;长时间沉默→先触发关怀话术。整套流程由叙事图驱动,保证每次对话都在可控路径上前进。

Python 演示

python59 行
# -*- coding: utf-8 -*-"""叙事图最短路径演示: 把故事节点当成路口, 剧情走向当成路网"""import heapq  class NarrativeGraph:    def __init__(self):        self.nodes = {}        self.edges = {}     def add_node(self, nid, name, value=0.0):        self.nodes[nid] = {"name": name, "value": value}        self.edges.setdefault(nid, [])     def add_edge(self, u, v, cost=1.0):        self.edges[u].append({"to": v, "cost": cost})     def find_path(self, start, goal):        """Dijkstra 求最低叙事成本路径"""        heap = [(0.0, start, [start])]        best = {start: 0.0}        while heap:            cost, cur, path = heapq.heappop(heap)            if cur == goal:                return path, cost            if cost > best.get(cur, float("inf")):                continue            for e in self.edges.get(cur, []):                nxt = cost + e["cost"]                if nxt < best.get(e["to"], float("inf")):                    best[e["to"]] = nxt                    heapq.heappush(heap, (nxt, e["to"], path + [e["to"]]))        return [], float("inf")  def main():    g = NarrativeGraph()    for nid, name, val in [        ("start", "开局", 0.5),        ("inc", "冲突升级", 1.2),        ("choice", "中心抉择", 2.0),        ("peak", "高潮", 3.5),        ("low", "低谷", -1.0),        ("end", "结局", 1.8),    ]:        g.add_node(nid, name, val)    g.add_edge("start", "inc", 1.0)    g.add_edge("inc", "choice", 1.5)    g.add_edge("choice", "peak", 2.0)    g.add_edge("choice", "low", 1.0)    g.add_edge("peak", "end", 1.0)    g.add_edge("low", "end", 1.5)    path, cost = g.find_path("start", "end")    print("最优剧情路径:", " -> ".join(g.nodes[n]["name"] for n in path))    print("叙事成本:", cost)  if __name__ == "__main__":    main()
目的:用 Dijkstra 在叙事图上找出一条“开局→结局”的最低成本剧情路径,演示故事网格价值与叙事图搜索如何结合。
  1. self.nodes[nid] = {"name": name, "value": value}把节点信息登记进顶点表,名字用于显示,价值用于判断冲突强度。
  2. self.edges.setdefault(nid, [])为每个新节点准备邻接表,确保后续添加出边时不会 KeyError。
  3. heap = [(0.0, start, [start])]用优先队列存放候选路径,初始只有起点且成本为 0。
  4. cost, cur, path = heapq.heappop(heap)每次弹出当前成本最低的候选路径,模拟“导航播报当前最佳路线”。
  5. if cost > best.get(cur, float("inf")): continue如果这条路径比已知最优差就跳过,避免无效计算。
  6. for e in self.edges.get(cur, [])遍历当前节点的所有出边,检查“从这个路口能去哪些路口”。
  7. heapq.heappush(heap, (nxt, e["to"], path + [e["to"]]))发现更便宜的到达方式后将其重新入队等待扩展。
  8. path, cost = g.find_path("start", "end")调用图搜索得到最优剧情路线与总成本。

常见误区

误区我之前带团队做过剧情表格,列也很全,可这不就是项目管理表吗?故事网格只是把内容整理一下,跟 AI 没有关系。

正解故事网格的意义不在于“填表”,而在于它是给 AI 使用的一种知识表示。每个场景的起始价值、结束价值、冲突等级、主题标签,构成了一条带坐标的训练样本。AI 学完后不仅知道“故事讲了什么”,还知道“这段情节在故事空间里处于什么位置”。没有这种结构化表示,AI 生成剧情就像没有 GPS 的出租车在大雾天转悠——能跑,但不知道自己在哪。

为何常见:因为传统剧本工作中“表格”太像普通管理工具,大家自然低估了它对机器学习的作用。

误区玩家喜欢自由,那我设计一万个分支,每个选择都通向完全不同的故事,不就等于无限自由了吗?

正解分支越多,测试与生成成本呈指数级爆炸,而且大量分支因玩家根本走不到而浪费。真正的自由感来自“受控的多样性”:用概率模型保证玩家每次都能遇到新事件,用结局聚合让尽量多分支收敛到可维护的结局集合。三个精心设计的分岔路,比三百个无人问津的死胡同更有价值。

为何常见:人们直觉上把“选择数量”等同于“自由度”,忽略了工程维护与内容成本。

误区叙事图有十万个节点,AI 每次生成一个新任务都要遍历全图找路径,这样算力够吗?

正解工程上不会这样做。无分支长链会被压缩成超级边,高频路径结果会被缓存,无关分支会并行预生成,玩家远处只加载粗粒度 LOD。全图搜索是理论基线,生产系统用的是“剪枝+缓存+分层”组合,就像导航不会实时计算全城路况一样。

为何常见:教材里的图算法都讲全图搜索,初学者容易把“算法”与“生产实现”画等号。

误区都是给故事分类的嘛,网格就是图,图就是网格,只是叫法不一样。

正解网格和图是两个不同的隐喻层次。故事网格是分析坐标系,回答“这个场景在哪里、价值起伏多大”,就像经纬线地图;叙事图是生成路网,回答“从这个事件能到哪个事件、走哪条路成本最低”,就像导航路网。两者配合:网格用于标注和学习,图用于搜索和生成。

为何常见:两者经常出现在同一篇文章里,又都以可视化图形展示,极易混淆。

面试题

Q1. 故事网格中最小的分析单位是?

单选题 · easy

  • A.叙事序列
  • B.单个场景← 正确答案
  • C.剧情章节
  • D.多幕剧目

答案:B。故事网格以场景为最小单位,场景组成序列,序列再组成更大的故事层次。章节只是出版物的物理切分,不是故事网格的分析单位。

Q2. 故事网格最常用来定位场景的两个维度是?

单选题 · easy

  • A.人物关系与阵营
  • B.时间轴与冲突强度← 正确答案
  • C.地图尺寸与道具
  • D.对话数量与战斗

答案:B。故事网格用“时间轴”标出叙事阶段,用“冲突强度”标出张力和价值摆动,二者共同构成场景的坐标,类似 GPS 的经纬度。

Q3. 叙事图中“边”表示什么?

单选题 · mid

  • A.故事中的角色节点
  • B.节点间因果转移关系← 正确答案
  • C.每章标题与摘要
  • D.作者创作备注信息

答案:B。叙事图中节点是事件或状态,边是它们之间的因果转移。角色、标题、备注都不属于图的边定义。

Q4. Dijkstra 算法在叙事图上的主要作用是?

单选题 · mid

  • A.去除重复的剧情节点
  • B.寻找最低成本剧情路径← 正确答案
  • C.对所有节点做拓扑排序
  • D.对剧情内容做情感聚类

答案:B。Dijkstra 通过反复松弛找到从起点到终点的加权最短路径,在叙事图上就是“最低叙事成本”的剧情线,相当于导航给出最省时路线。

Q5. 叙事图分支爆炸最严重的危害是?

单选题 · hard

  • A.节点图例颜色过多
  • B.测试与生成成本指数增长← 正确答案
  • C.玩家更易迷失方向
  • D.语音与画面不匹配

答案:B。每增加一个分支,路径组合数翻倍,测试覆盖与生成计算都呈指数增长。玩家迷路是体验问题,工程上的核心风险是成本失控。

Q6. 关于场景价值变化 ΔV 的正确说法有哪些?

多选题 · mid

  • A.ΔV 为负数表示局面恶化← 正确答案
  • B.ΔV 绝对值表示冲突幅度← 正确答案
  • C.ΔV 为零说明场景没有价值变化← 正确答案
  • D.ΔV 无需考虑时间轴位置

答案:ABC。ΔV 为负说明结尾比开头更糟;绝对值越大冲突越强;为零则场景“原地踏步”。但 ΔV 必须放在时间轴上才能解释场景在故事中的意义,因此 D 错误。

Q7. 工程上优化叙事图搜索的手段包括?

多选题 · mid

  • A.压缩无分支长链← 正确答案
  • B.缓存高频路径结果← 正确答案
  • C.多分支并行预生成← 正确答案
  • D.增加大量无用节点

答案:ABC。压缩减少节点、缓存避免重复计算、并行预生成摊薄峰值负载。增加无用节点只会加剧分支爆炸,是错误做法。

Q8. 叙事图中的“死胡同”节点是指?

单选题 · easy

  • A.没有出边且不属于结局的节点← 正确答案
  • B.场景美感较低的节点
  • C.玩家从未选择的剧情边
  • D.编辑器自带的程序缺陷

答案:A。没有出边又非结局,意味着玩家走到这里就卡住,剧情无法继续。死胡同是自动化测试重点关注的对象。

Q9. 交互叙事中动态分支设计需要考虑哪些因素?

多选题 · hard

  • A.追踪玩家的历史状态← 正确答案
  • B.条件转移边的设定← 正确答案
  • C.多个结局的聚合管理← 正确答案
  • D.只读取当前一句台词

答案:ABC。动态分支必须追踪背包、好感度等状态,边要挂条件,最终还要聚合到有限结局。只看当前一句台词会导致上下文漂移。

Q10. Coverage = 可达结局数 / 全部结局数 衡量的是什么?

单选题 · mid

  • A.生成代码的行数
  • B.剧本分支是否断头路← 正确答案
  • C.游戏画面的帧率
  • D.玩家对角色好感

答案:B。覆盖率反映从开局能否到达所有设计结局,比值接近 1 说明分支结构完整,没有无法触达的结局或死胡同。