这个 App 在干什么
我做了一个叫「像素征途」的 iOS App,核心玩法很简单:你走过的地方会变成你的像素格领地。打开 App 出门走,地图上就会一格一格被你的颜色填满。走得越多,版图越大。
和普通计步工具不同,我不强调卡路里和步数。这东西的驱动力是「我今天又占了一片新地盘」。有点像小时候拿彩笔在地图上涂色的感觉。
目前 App Store 评分 5 分,有用户评价"和世界迷雾一样好玩,解锁成就,开垦荒地探索未知区域"。说实话用户量还很小,但留下来的人黏性还行。
区域征服的阈值怎么定的
地图被我切成 8×8 的网格区域,每个区域 64 个格子。点亮多少算"征服"这件事,我改了三版。
第一版设 48 格(75%),测试发现太容易了,走个两圈就征服了,没有成就感。第二版设 64 格(必须全亮),又太苛刻——城市里总有你走不进去的地方,比如围墙里的小区、河对岸的死角。
最后定在 58 格,留 6 格容错:
enum TerritoryRules {
static let zoneSideCount = 8
static let zonePerfectTileThreshold = zoneSideCount * zoneSideCount // 64
static let zoneConqueredTileThreshold = 58
}
enum ZoneConquestRules {
static func evaluate(litTiles: Int, conqueredThreshold: Int, perfectThreshold: Int) -> ZoneConquestEvaluation {
let normalizedLitTiles = max(0, litTiles)
return ZoneConquestEvaluation(
isConquered: normalizedLitTiles >= max(0, conqueredThreshold),
isPerfect: normalizedLitTiles >= max(conqueredThreshold, perfectThreshold)
)
}
}
90.6% 的征服线,实测体感是"够得着但要费点心思"。对了,64 格全亮会给一个"完美征服"标记,强迫症玩家很吃这个。
连击倍率:防流失的核心机制
做这类 App 最大的问题是用户一周后就不打开了。我的解法是连击系统——连续天数越多,每天得分倍率越高:
enum RouteScoreRules {
static let dailyContributionCap = 50
static let graceDays = 1
static func multiplier(for consecutiveDays: Int) -> Double {
switch max(0, consecutiveDays) {
case 5...: return 2.0
case 3...4: return 1.5
default: return 1.0
}
}
}
这里有几个我纠结很久的设计决策:
每日贡献上限 50。 一天暴走 3 万步的人和每天走 5000 步的人,差距不会被无限拉大。我想鼓励的是"每天都出门",不是"周末一次走到死"。
graceDays = 1。 断一天不清零。加班到凌晨、刮台风出不了门,这些事总会发生。硬断连击太伤感情了。
最高只有 2 倍。 没搞 5 倍 10 倍那种。新用户进来看到老玩家分数遥遥领先会直接劝退。2 倍已经够有动力了。
热力衰减让地图会"呼吸"
早期版本地图是"点亮就永远亮"的,时间久了整张图一片糊。我加了时间衰减:
| 走过后天数 | 视觉状态 |
|---|---|
| 0-4天 | 柔和高亮 |
| 5-7天 | 正常亮度 |
| 8-14天 | 逐渐弱化 |
| 30天+ | 仅剩 12% 透明度底色 |
MapHeatRules 里写了四个衰减节点。效果是地图上有明暗对比——最近活跃的区域发光,很久没去的地方暗下去。有个用户跟我说看到家附近的领地变暗了会"想出去补一圈",这就是我要的反馈循环。
Tile 循环:老路线也有收益
住在固定区域的用户,周围的格子早就全亮了,之后每天走同样的路就没有任何反馈了吗?
我加了 Tile 循环系统。每个格子有等级和路线阶层(roadTier),重复经过同一个格子会升级,到了一定次数能领碎片奖励。这样通勤族每天走同一条路也有事可做——不是开荒,而是"经营已有领地"。
格子还有冷却时间(cooldownSeconds),你不能站在一个格子上反复刷。得真的走动起来。
踩过的坑
GPS 漂移是大敌。 室内信号差时 CoreLocation 会抽风,坐在办公室点亮了隔壁街的格子。后来我加了精度过滤,accuracy 超过 50 米的定位点直接扔掉。还有速度异常检测,瞬移太远的点也丢弃。
首次启动的默认位置。 第一次打开还没拿到 GPS 怎么办?我按 Locale.current.region 给不同地区设了默认中心点——中国用户看到上海陆家嘴,日本看到东京站,美国看到旧金山。避免用户第一眼看到非洲西海岸的空白大洋。
照片导入的年限限制。 有用户反馈"为什么只能导入最近 3 年的照片位置"。这个是我为了控制首次导入的耗时硬卡的,相册照片太多时扫描 EXIF 会很慢。目前还没想到好的分批加载方案,挺头疼。
日常任务的四个维度
每天给用户一组小目标,四种类型:
unlock:点亮 N 个新格子distance:走 N 米duration:探索 N 分钟momentum:维持连击不断
完成任务给碎片,碎片换地图皮肤。这套东西说白了就是抄游戏的日常任务体系,但对于走路 App 来说确实管用——给每天一个明确的"今天至少做什么"。
写在最后
这个项目现在下载量很少,推广基本没做。独立开发的老问题:写代码和做推广抢同一块时间。
回头看,这个产品的技术难度不大,真正难的是数值设计。征服阈值定多少、倍率曲线怎么画、衰减速度多快才不让人焦虑——这些东西没有标准答案,只能不断调。
如果你也在做游戏化相关的东西,连击和衰减这两个机制的参数你们是怎么调的?有没有什么好的 A/B 测试思路,样本量小的时候?