做了个什么东西
去年我一直在琢磨一个事儿:运动类 App 太多了,但绝大多数都在强调"你今天走了多少步""消耗了多少卡路里"。说实话,这种数字对我来说毫无吸引力——我不是为了减肥才出门的。
所以我做了「像素征途」,核心概念很简单:你走过的每一条街道、每一个路口,都会在地图上被"点亮"成属于你的像素格子。走得越多,你的领地版图越大。说白了就是把现实世界当成一张待征服的棋盘。
目前 App Store 评分 5 分(样本量还小,不吹),有用户评论说"和世界迷雾一样好玩,解锁成就"。这让我挺开心的,因为世界迷雾确实是我的灵感来源之一,但我想做出差异化——不只是"去雾",还要有游戏化的正反馈循环。
区域占领的规则设计
我在设计领地系统时纠结了很久。最早的版本是每个格子走过就算占领,但这样太无聊了,没有"经营感"。
最后我定了一套 Zone 征服规则:每个区域是 8×8 = 64 个格子的网格,走过 58 格算"征服",全部 64 格点亮算"完美占领"。这个 58/64 的阈值是反复调过的——太低没挑战性,太高会让人在最后几格时崩溃(城市里有些角落真的很难绕进去)。
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 >= normalizedConqueredThreshold,
isPerfect: normalizedLitTiles >= normalizedPerfectThreshold
)
}
}
58 这个数字怎么来的?我自己在上海跑了两周,统计了 20 多个区域的实际覆盖情况。大部分区域你正常走完主要道路能到 50-55 格,想到 58 需要特意绕一两条小路。这个"差一点就满"的感觉挺上瘾的。
连击系统和每日贡献上限
纯粹的"走路点亮格子"玩久了还是会腻。我加了一个连续行走天数的倍率系统:
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。没有这个 cap 的话,周末暴走一天就能刷满分数,工作日完全没动力。有了上限,"每天走一点"比"周末疯狂刷"更划算。
- 连续 3 天 1.5 倍,5 天 2 倍。倍率不高,但心理效果很明显。我观察到有用户为了不断连击,会特意在下雨天也出门走个 10 分钟。
- graceDays = 1。断了一天不会直接归零,给用户一个缓冲。这个是上线后根据反馈加的,最早没有,被骂了。
地图热力衰减:让"最近的探索"更突出
一个纯粹累积的地图看久了会变成一团色块,新走的路和三个月前走的路看起来一样。我做了时间衰减:
- 4 天内的路线有发光效果(soft decay)
- 7 天后发光消失
- 14 天后区域高亮减弱
- 30 天后格子只保留 12% 的残留透明度
这样打开地图时,最近活跃的区域一目了然,老区域变成淡淡的底色。有种"我的领地需要维护"的感觉——不是说走过就永远亮着,你得持续巡逻。
这个决策有争议。有用户说"我辛辛苦苦点亮的格子怎么变淡了",但我觉得如果全部永久高亮,半年后地图就没有信息密度了,全亮等于全不亮。
每日任务和碎片奖励
为了给每天的短途行走一个明确目标,我做了四种日常任务:
unlock— 今天点亮 N 个新格子distance— 今天走 N 米duration— 今天户外 N 分钟momentum— 维持连击
每个任务完成给碎片奖励,碎片可以用来解锁地图皮肤之类的装饰。说实话碎片经济目前还比较简单,后续想接更多可兑换的东西。
格子循环(Tile Loop):让老路也有意义
这是我比较满意的一个设计。大部分人上班通勤路线是固定的,如果只有"新格子"有奖励,那通勤路上就变成无意义的重复。
我给每个格子做了等级和"路线阶层"(TileRoadTier)的概念。反复走同一个格子,格子会升级,从"侦察"到更高级别。每天踩同一个格子也有产出上限(todayYieldClaimCap),不会无限刷。格子还有冷却时间(cooldownSeconds),走过一次后要等一段时间才能再次收获。
这套机制的核心想法是:探索新区域给大量一次性奖励,经营老区域给少量持续性奖励。两种玩法都有正反馈。
一些踩过的坑
定位精度问题。城市里高楼密集区域 GPS 漂移很严重,有时候人没动,定位点在几个格子之间跳。最早的版本会导致"站着不动也能刷格子"。后来加了速度和距离的过滤逻辑,太不合理的位移直接丢弃。
电池消耗。持续定位很费电这事儿大家都知道。我用了 allowsBackgroundLocationUpdates 配合 desiredAccuracy 的动态调整——移动时高精度,静止时降级。但还是会有用户反馈耗电,这个暂时没有完美解。
照片位置导入的年限限制。目前只支持导入最近 3 年的照片位置来回溯足迹,有用户提到想导入更早的旅行照片。这个限制主要是性能考虑——太多历史数据一次性导入会导致地图渲染卡顿。后面打算做分批加载。
当前状态和接下来的打算
说实话下载量目前不高,产品还在早期阶段。但留下来的用户粘性还不错,有人已经连续打卡好几周了。
接下来想做的:
- 探索排行榜(有用户反馈"发现无法参与探索榜",这个功能还没完全开放)
- 多城市切换的体验优化
- 分享卡片做得更好看一些
如果你也对"游戏化 + LBS"这个方向感兴趣,欢迎在评论区聊聊。我特别想知道,这种"格子占领"的玩法,大家觉得衰减机制合理吗?还是说应该让已征服的领地永久保留?