本文是「放置游戏策划实战」系列第 5 篇,也是系统策划线的开篇。 前四篇我们一直在聊"数字怎么算"------数值飞轮的收敛、独立乘区的乘法结构、蒙特卡洛模拟检测卡点。今天换个维度:玩家在玩什么?为什么想继续玩?
放置游戏有一个所有品类里最特殊的挑战:玩家大部分时间什么都不做------挂机等着就行。 如果你的系统设计不能让"等待"本身也有目标感,留存就会塌。
这篇文章拆穿放置类系统策划的核心命题:三层核心循环必须同时在场,以及三个心理学工具(Bartle 分类、心流理论、损失厌恶)怎么给每个循环装上"钩子"。
目录
- 一、三层核心循环的结构:越往下周期越长
- [二、Bartle 玩家分类:每个系统服务不同的人](#二、Bartle 玩家分类:每个系统服务不同的人)
- 三、心流通道:挑战始终略高于技能
- 四、损失厌恶:离线收益倒计时是最强的拉回钩子
- 五、多系统耦合:别做成各自为政的孤岛
- [六、自检方法:盯着你的界面想 30 秒](#六、自检方法:盯着你的界面想 30 秒)
- 七、完整可运行脚本
- 八、总结与下期预告
一、三层核心循环的结构:越往下周期越长
问题
一个玩家打开你的放置游戏,30 秒后他在干什么?3 小时后呢?3 天后呢?
如果这三个时间点的答案都是"不知道"或"差不多",你的系统设计就有问题。好的放置游戏必须让三层目标同时在场:

三层循环详解
| 层 | 循环名称 | 周期 | 玩家在做什么 | 目标感来源 | 钩子机制 |
|---|---|---|---|---|---|
| 内层 | 短循环 | 几十秒~几分钟 | 挂机自动产出、收菜 | 即时反馈:"数字在涨了" | 心流:即时正反馈 |
| 中层 | 中循环 | 几小时~几天 | 升级、推图、打 Boss | 进度感:"下一关/下一阶" | Bartle 成就型:进度条+解锁 |
| 外层 | 长循环 | 数天~数周 | 飞升 / 转生 | 永久变强:"多周目意义" | 损失厌恶:离线收益倒计时 |
为什么缺一层都不行?
- 没有短循环 → 玩家打开游戏看到静止的界面 → "什么都没发生" → 关掉。即时反馈缺失是新手流失的第一杀手。
- 没有中循环 → 玩家知道"数字在涨"但不知道涨了有什么用 → 没有推进方向 → 无聊流失。
- 没有长循环 → 玩家推到当前内容尽头 → "没得做了" → 彻底弃坑。飞升/转生就是为这一层设计的。
关键洞察 :这三层不是"按顺序触发"的------它们是同时在场的。玩家在同一时刻既在等短循环产出(看数字跳动),也在朝中循环目标努力(攒资源推下一关),还在规划长循环策略(什么时候该飞升)。缺少任何一层,另外两层也会崩塌。
二、Bartle 玩家分类:每个系统服务不同的人
问题
你的游戏里有主线、装备、技能、成就、活动、公会......这么多系统,它们都在服务谁?如果一个系统只服务一类人,另一类人会觉得它完全没用;如果所有系统都服务同一类人,那其他类型的玩家会直接走人。
Richard Bartle 的四分类模型是解决这个问题的经典工具:

四象限解析
| 象限 | 类型 | 特征 | 你的游戏哪些系统在服务他们 |
|---|---|---|---|
| 行动 × 世界 | 成就型 Achiever | 追求等级/排名/完成度,喜欢"有进度"的感觉 | 主线推图、成就系统、装备养成、飞升转生 |
| 思考 × 世界 | 探索型 Explorer | 喜欢发现隐藏内容、理解机制、收集 | 世界地图探索、隐藏彩蛋、装备词条随机性、数值公式本身 |
| 思考 × 其他玩家 | 社交型 Socializer | 在意人际关系和社区归属感 | 公会/组队、排行榜分享、活动参与、聊天互动 |
| 行动 × 其他玩家 | 杀手型 Killer | 喜欢竞争、碾压、证明自己比他人强 | 竞技场/PvP、抢夺排名、世界 Boss 首杀 |
实操建议
检查你的游戏:四个象限都有至少一个系统在服务吗?
- 大多数独立开发的放置游戏天然偏重成就型(主线/装备/飞升),这是对的------成就型是放置类的主力用户群。
- 但如果完全没有探索型元素(隐藏关卡、彩蛋、稀有词条组合),硬核玩家会嫌"太浅"而离开。
- 社交型 和杀手型可以轻量引入:排行榜不需要做完整公会系统,一个简单的"全服战力排行"就能同时满足社交展示欲(社交型)和竞争欲(杀手型)。
- 最危险的错误:把所有系统的奖励都堆在一个象限里。比如成就、装备、活动全部只给"战力加成"------这等于只喂成就型,其他三类玩家觉得"跟我没关系"。
三、心流通道:挑战始终略高于技能
问题
Mihaly Csikszentmihalyi 的心流理论(Flow Theory)指出:当一个人面临的挑战难度恰好略高于他当前的技能水平时,他会进入一种高度专注的沉浸状态------这就是"心流"。太简单会无聊,太难会焦虑。
放置游戏怎么应用这个理论?毕竟玩家大部分时间是"不操作"的。
心流通道可视化

图表解读
这张图的核心信息:
- 绿色对角带 = 心流区 ------当
挑战 level ≈ 技能 level时,玩家进入沉浸状态。这是你希望玩家长期停留的区域。 - 蓝色轨迹 = 玩家的实际成长路径 ------随着玩家技能提升(通过挂机积累资源、学习机制),游戏的挑战也同步提升(更高难度的关卡、更强的怪物)。好游戏的设计就是让这条轨迹始终保持在绿色通道内。
- 上方 = 焦虑区------挑战远超技能。对应 P4 蒙特卡洛模拟的"卡点"场景:多数玩家卡在第 10~18 关,挑战突然跳升(Boss 墙),技能跟不上 → 焦虑 → 流失。
- 下方 = 无聊区------技能远超挑战。对应 P2 讲的"通胀"场景:产出远超需求,玩家随便就能过 → 无聊 → 弃游。
在放置游戏中落地心流
| 场景 | 心流做法 | 反例(破坏心流) |
|---|---|---|
| 推图 | 关卡难度平滑递进(公比 1.06~1.10),每关都能感觉到"再努力一点就过了" | Boss 墙突然翻倍(焦虑) |
| 养成 | 每次升级都有可见的收益(独立乘区保证边际占比恒定,见 P3) | 加法模型后期无感(无聊) |
| 飞升 | 重置后带着永久加成回来,前几关明显更快(质变感,见 P2) | 弱飞升白重开(无聊+挫败) |
一句话记住 :心流的本质是"刚刚好够不到但差得不远"。放置游戏靠的是调整关卡曲线和成长速度来维持这个"差得不远"的状态------而这正是 P2/P3/P4 里那些数值工具在做的事。
四、损失厌恶:离线收益倒计时是最强的拉回钩子
问题
Kahneman 和 Tversky 的前景理论 (Prospect Theory)发现了一个反直觉的人类行为:人对损失的敏感度大约是对同等收益的两倍。换句话说,"失去 100 元金币"带来的痛苦,远大于"获得 100 元金币"带来的快乐。
放置游戏怎么利用这一点?
实验:离线收益倒计时的留存效果
我模拟了两批各 4000 名玩家的 14 天留存:
- 对照组:纯靠推关节奏驱动留存(和 P4 一致)
- 实验组:增加"离线收益倒计时"机制------未领取的离线收益将在 24h 后开始衰减,且每次登录时弹窗提示"您有 XX 收益即将过期"

结果
| 时间节点 | 对照组(无倒计时) | 实验组(有倒计时) | 差距 |
|---|---|---|---|
| 第 1 天 | 100% | 100% | --- |
| 第 7 天 | 32.3% | 49.2% | +16.9pp |
| 第 14 天 | 10.7% | 24.6% | +13.9pp |
为什么效果这么强?
因为离线收益倒计时触发的心理不是"我想领奖励"------而是**"我不想损失已经属于我的东西"**。这两者的驱动力完全不同:
| 心理机制 | 内部独白 | 驱动强度 |
|---|---|---|
| 正向激励(领奖励) | "上线领一下也不错" | 中 |
| 负向规避(防损失) | "不上线就亏了!快去!" | 强(约 2×) |
实操建议(三种实现方式)
- 硬倒计时:离线收益超过 N 小时(如 8h)的部分开始线性衰减到 0。UI 上显示红色倒计时条:"剩余 2h23m"
- 软提醒:不衰减,但每天一次推送通知"您的离线收益已累积 X,点击立即领取"。利用"损失感来自遗忘"的心理。
- 双保险:硬倒计时上限(8h 封顶)+ 软提醒(每日推送)。TapTap 上表现最好的放置游戏基本都用这套。
注意:倒计时不能做得太激进(比如 2 小时就清零),否则会变成"上班打卡式"体验,反而劝退休闲玩家。8~24 小时区间是经过验证的安全值。
五、多系统耦合:别做成各自为政的孤岛
这个问题 P1 总纲里提过,这里结合 Bartle 和三层循环再做一次深化。
错误示范:孤岛式设计
上线 → 点一下装备(完了)
→ 点一下技能(完了)
→ 看一眼成就(没变化)
→ 下线
每个系统都是"上线点一下就没"的孤岛。三层循环中只有短循环勉强存在(收菜),中循环和长循环完全缺席。
正确示范:互相提供目标的闭环
上线 → 收菜(短循环 ✓:数字在涨)
→ 用菜(资源)升级装备 → 战力提升
→ 战力够了 → 去推下一关(中循环 ✓:有进展)
→ 新关卡解锁新副本 → 副本掉落喂养成就
→ 成就达成给永久加成 → 加成反哺主线战力
→ 卡住时 → 决定飞升(长循环 ✓:有意义的多周目)
每个系统的产出必须是另一个系统的输入。 这样才能形成"做完 A 就想做 B"的动力链条。
用 Bartle 矩阵检验耦合度
画一张简单的表格:
| 系统 | 主要产出 | 输入到哪个系统 | 服务哪个 Bartle 类型 |
|---|---|---|---|
| 主线推图 | 解锁新内容/新关卡 | 装备槽位 / 副本入口 | 成就型 |
| 装备养成 | 战力加成 | 推图能力 / 副本门槛 | 成就型 + 探索型(词条随机) |
| 技能系统 | 战力 + 特殊能力 | 推图效率 / Boss 战术 | 成就型 |
| 成就系统 | 永久加成 / 外观 | 主线战力 / 社交资本 | 成就型 + 社交型(展示) |
| 活动/周常 | 限时高价值资源 | 所有养成系统 | 社交型(排行)+ 杀手型(竞速) |
| 飞升/转生 | 永久乘区加成 | 全局战力重算 | 成就型(长期目标) |
如果某一行的"输入到哪个系统"是空的或者只有自己→自己,那就是个孤岛,需要补链路。
六、自检方法:盯着你的界面想 30 秒
这是我在 P1 里提过的自检法,现在结合三层循环和 Bartle 做一个增强版清单:
自检清单(逐项勾选)
短循环(即时反馈):
- 打开游戏 5 秒内能看到数字变化吗?(产出动画/飘字/计数器跳动)
- 收菜的交互是否足够爽快?(一键收取 + 音效 + 动效)
中循环(进度感):
- 玩家是否明确知道"下一步该做什么"?(任务指引/目标箭头/推荐关卡)
- 当前卡住的玩家是否有"虽然没过但也没白玩"的感受?(失败也掉部分资源)
长循环(多周目):
- 飞升/转生的入口是否清晰可见?
- 飞升后的第一分钟是否立刻感受到"变强了"?
Bartle 覆盖:
- 成就型:有明确的进度条/百分比/排名吗?
- 探索型:有没有隐藏内容/彩蛋/需要主动发现的机制?
- 社交型:有没有哪怕一个"可以让别人看到我"的功能(排行/头像框/称号)?
- 杀手型:有没有哪怕一个"我可以比别人更强"的竞技要素?
损失厌恶:
- 离线收益是否有上限或衰减机制?
- 是否有任何形式的"即将过期"提示?
如果以上 15 项里有 5 项以上打 ❌,说明你的核心循环存在结构性缺陷。优先修短循环和中循环------这两层的缺失会导致最快的新手流失。
七、完整可运行脚本
保存为 core_loops.py,一键生成全部 4 张图表:
python
# -*- coding: utf-8 -*-
"""三层核心循环实验器 ------ 结构 / Bartle矩阵 / 心流 / 损失厌恶"""
import numpy as np
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
from matplotlib import font_manager as fm
from matplotlib.patches import FancyBboxPatch
import os, platform
# ── 跨平台中文字体 ──
_sys = platform.system()
if _sys == "Darwin":
FONT = "/System/Library/Fonts/STHeiti Medium.ttc"
elif _sys == "Windows":
FONT = "C:/Windows/Fonts/msyh.ttc"
else:
FONT = "/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc"
fm.fontManager.addfont(FONT)
F = fm.FontProperties(fname=FONT)
plt.rcParams["font.family"] = F.get_name()
plt.rcParams["axes.unicode_minus"] = False
OUT = "./csdn_images/p5"
os.makedirs(OUT, exist_ok=True)
rng = np.random.default_rng(20240711)
IND, CYN, AMB, GRN, RED, GRE = "#4F46E5", "#06B6D4", "#F59E0B", "#16A34A", "#DC2626", "#94A3B8"
def fp(s, b=False):
return fm.FontProperties(fname=FONT, size=s,
weight="bold" if b else "normal")
# ── 1. 三层循环 ──
def loops():
fig, a = plt.subplots(figsize=(9, 5.2), dpi=110)
a.axis("off"); a.set_xlim(0, 10); a.set_ylim(0, 6)
bands = [
(3.2, 4.8, IND, "短循环", "几十秒~几分钟", "挂机产出/收菜",
"即时反馈:数字在涨", "钩子→心流"),
(5.0, 3.6, CYN, "中循环", "几小时~几天", "升级/推图/Boss",
"进度感:下一关/下一阶", "钩子→Bartle成就型"),
(7.0, 2.4, AMB, "长循环", "数天~数周", "飞升/转生",
"永久变强:多周目意义", "钩子→损失厌恶(离线倒计时)"),
]
for w, y, c, nm, per, act, fel, hk in bands:
x0 = 5 - w / 2
a.add_patch(FancyBboxPatch(
(x0, y), w, .95,
boxstyle="round,pad=.04,rounding_size=.12",
fc=c + "22", ec=c, lw=2.2))
a.text(5, y + .68, nm, fontsize=14,
weight="bold", color=c, ha="center")
a.text(5, y + .40, f"{per}|{act}", fontsize=10.5,
ha="center")
a.text(5, y + .13, fel, fontsize=9.5,
color="#475569", ha="center")
a.text(5, y - .28, hk, fontsize=9.5,
color=c, ha="center", weight="bold")
a.annotate("", xy=(5, 4.8 + .95), xytext=(5, 3.6),
arrowprops=dict(arrowstyle="-|>", color="#CBD5E1", lw=1.5))
a.annotate("", xy=(5, 3.6 + .95), xytext=(5, 2.4),
arrowprops=dict(arrowstyle="-|>", color="#CBD5E1", lw=1.5))
a.text(5, 5.5, "三层循环必须同时在场:越往下周期越长、目标越宏观",
fontsize=12, weight="bold", ha="center")
fig.tight_layout()
fig.savefig(f"{OUT}/p5_01_三层循环.png", dpi=110)
plt.close(fig)
# ── 2. Bartle 矩阵 ──
def bartle():
fig, a = plt.subplots(figsize=(8.4, 6.2), dpi=110)
a.set_xlim(0, 10); a.set_ylim(0, 10)
qs = [
((0, 5), (5, 10), IND, "成就型 Achiever\n行动·游戏世界"),
((5, 5), (10, 10), CYN, "社交型 Socializer\n思考·其他玩家"),
((0, 0), (5, 5), AMB, "探索型 Explorer\n思考·游戏世界"),
((5, 0), (10, 5), RED, "杀手型 Killer\n行动·其他玩家"),
]
for (x0, y0), (x1, y1), c, lab in qs:
a.add_patch(plt.Rectangle(
(x0, y0), x1 - x0, y1 - y0,
fc=c + "14", ec=c, lw=2))
a.text((x0 + x1) / 2, y1 - .6, lab, fontsize=11,
weight="bold", color=c, ha="center", va="top")
items = [
(2.0, 7.5, "主线推图/成就\n飞升转生", IND),
(2.3, 5.6, "装备/技能养成", IND),
(7.6, 7.6, "公会/活动\n排行榜/组队", CYN),
(2.6, 2.4, "世界探索\n隐藏内容/彩蛋", AMB),
(7.5, 2.5, "竞技场/PvP\n抢夺排名", RED),
]
for cx, cy, t, c in items:
a.add_patch(plt.Circle((cx, cy), 1.05, fc="white", ec=c, lw=2))
a.text(cx, cy, t, fontsize=8.5, color=c,
ha="center", va="center", weight="bold")
a.set_title("系统×玩家类型:每个系统服务不同的人",
fontsize=12.5, weight="bold")
a.axis("off"); fig.tight_layout()
fig.savefig(f"{OUT}/p5_02_Bartle矩阵.png", dpi=110)
plt.close(fig)
# ── 3. 心流通道 ──
def flow():
xs = np.linspace(0, 10, 100)
fig, a = plt.subplots(figsize=(8, 5.4), dpi=110)
a.fill_between(xs, xs - 1.2, xs + 1.2,
color=GRN + "22", label="心流区")
a.plot(xs, xs, color=GRN, lw=2.5, label="理想成长线")
t = np.linspace(0, 9, 40)
sk = t + .3 * np.sin(t * .8)
ch = sk + .4 + .2 * np.sin(t * .8 + 1)
a.plot(sk, ch, color=IND, lw=2.4, marker="o", ms=3,
label="玩家实际轨迹")
a.set_xlabel("玩家技能level")
a.set_ylabel("游戏挑战level")
a.set_title("心流通道:好游戏让挑战始终≈技能",
fontsize=13, weight="bold")
a.legend(fontsize=9); a.grid(alpha=.25)
fig.tight_layout()
fig.savefig(f"{OUT}/p5_03_心流通道.png", dpi=110)
plt.close(fig)
# ── 4. 损失厌恶留存对比 ──
def loss_aversion():
D, n = 14, 4000
ar = rng.uniform(.45, .85, n)
ac, at = np.ones(n, bool), np.ones(n, bool)
rc, rt = [], []
for d in range(1, D + 1):
adv = rng.random(n) < ar
churn_c = np.where(adv, .05, .35)
churn_t = np.where(adv, .05, .35 * .55)
ac &= rng.random(n) > churn_c
at &= rng.random(n) > churn_t
rc.append(ac.mean()); rt.append(at.mean())
fig, a = plt.subplots(figsize=(8, 4.4), dpi=110)
a.plot(range(1, D + 1), np.array(rc) * 100, color=RED,
lw=2.4, marker="o", ms=4, label="对照组")
a.plot(range(1, D + 1), np.array(rt) * 100, color=GRN,
lw=2.4, marker="s", ms=4, label="实验组(倒计时)")
a.set_xlabel("天数"); a.set_ylabel("留存率(%)")
a.set_title("损失厌恶:离线收益倒计时拉回流失",
fontsize=13, weight="bold")
a.legend(fontsize=9); a.grid(alpha=.3)
fig.tight_layout()
fig.savefig(f"{OUT}/p5_04_损失厌恶留存.png", dpi=110)
plt.close(fig)
if __name__ == "__main__":
loops(); bartle(); flow(); loss_aversion()
print("✅ 全部图表已保存至", OUT)
八、总结与下期预告
今天我们从系统策划的角度拆穿了放置类的核心循环:
| 维度 | 结论 | 口诀 |
|---|---|---|
| 三层循环 | 短(秒级)/中(小时级)/长(周级)必须同时在场 | 缺一层,留不住人 |
| Bartle 四象限 | 每个系统要明确服务于哪类玩家;四类都要覆盖 | 别把所有奖励都喂同一类人 |
| 心流通道 | 挑战始终略高于技能,轨迹留在对角带内 | 不难也不易,刚刚好够不到 |
| 损失厌恶 | 离线收益倒计时能把 14 天留存从 10.7% 拉到 24.6% | "怕亏损"比"想领奖"强两倍 |
| 多系统耦合 | 每个系统的产出是另一个系统的输入 | 孤岛必死,闭环永生 |
系统策划和数值策划是一体两面:P2~P4 教你怎么"算对数字",这篇教你怎么"让数字变成体验"。前者是骨架,后者是血肉------缺了谁都不行。
下一篇(P6)我会回到数值线,深拆飞升/转生系统专题------转生曲线到底该怎么画?飞升后的过渡期怎么设计才不会让玩家觉得"被剥夺了一切"?如果你正在纠结自己游戏的三层循环哪层有问题,欢迎评论区描述你的界面截图,我来帮你诊断。