上个月我做了一个消消乐——用自家八只猫的照片当棋子。本来故事到这就该结束了,结果停不下来:打地鼠、贪吃蛇、Flappy、跑酷、配对接连上线,最后长成了一个六游戏合集 + 猫咪图鉴的「猫宇宙」。这篇记录这次进化里最有意思的部分:113 行公共代码撑起的跨游戏元进度系统,以及一只马里奥怎么跑进消消乐里补位。
🎮 线上地址:bayshier.github.io/Nikki(手机浏览器直接玩)
一切从一个朴素的想法开始:市面上的消消乐千千万,但棋子上不是你家的猫。于是有了第一版——8×8 棋盘、八只真猫照片当棋子、Hello Kitty 粉色体系、加一只拥有三重性格的问题儿童「大儿」(挂机乱跑 / 倔强拒绝消除 / 反咬扣分)。做完发到家人群,效果超预期。
然后问题来了:通关的家人开始催更。一个游戏喂不饱了,那就——多来几个。
现在合集长这样,全部游戏共用同一批猫咪角色:
| 游戏 | 玩法 | 一句话介绍 |
|---|---|---|
| 🐱 猫咪消消乐 | 三消 | 本合集的起点,2.0 版新增 L 形炸弹与马里奥补位 |
| 🃏 猫咪配对 | 记忆翻牌 | 翻开卡片寻找相同的猫,40 步内通关有成就 |
| 🐟 猫吃小鱼 | 贪吃蛇 | 操控小猫吃小鱼变长,别撞墙别咬自己 |
| 🐦 飞飞猫 | Flappy | 点击振翅穿管道,飞过 6 根管道解锁大儿 |
| 🔨 猫咪打地鼠 | 打地鼠 | 猫咪冒头快点它喂小鱼干——小心别点到大儿,他会反击 |
| 🍄 猫猫马里奥 | 跑酷平台 | 戴红帽的猫猫闯关:踩捣蛋猫、收金币、抵达旗帜 |
注意大儿的戏份扩张了:在消消乐里赌气,到打地鼠里继续反击——角色性格跨游戏一致,这是合集比"六个游戏"多的那点东西。
原版只有 4 连条纹(清行/清列)和 5 连彩虹。2.0 加入了 L 形 / T 形匹配生成炸弹 💣,特殊道具之间还能两两交换触发组合技。生成判定延续了旧版的克制思路——只在交叉匹配时生成,防止道具泛滥把关卡冲垮。
跑酷游戏里的箱子被砸碎后会留下洞,猫咪不会自动下落补位——这时候「马里奥」会从屏幕外跑进来,把猫一只只丢进缺口,丢完拍拍手跑走。平时他躲在屏幕外不出现,有活儿才来。这个设计解决了一个真问题(箱子关卡的地形需要手动补位),但表现形式完全是个喜剧:你永远会为一只戴红帽的猫抱着另一只猫跑进场而会心一笑。
解锁弹窗升级成了肯德基疯狂星期四主题——红底(#e60012)黄字(#ffcc00)大横幅「🍗 疯狂星期四 V50 🍗」,文案是标准的疯四文学:「今天是肯德基疯狂星期四,V 我 50 获得密码助力通关 😼」。粉色 Hello Kitty 游戏里弹出一个正红金黄的 KFC 弹窗,配色上就是故意的反差萌。背后依然是家人专属密码解锁,逻辑没变,仪式感翻倍。
六个游戏如果各自为政,就是六个孤岛。合集真正的工程核心是一个 shared/common.js——113 行代码的公共系统层,所有游戏共用三个子系统:
所有游戏的金币读写同一个池子。这里有个值得记录的细节:存档迁移——消消乐比钱包先存在,金币存在它自己的存档里。Wallet 首次被访问时检测到全局池为空,就把消消乐存档里的金币一次性迁移进来。老玩家无感升级,金币一分不少。
每天从奖池抽一条任务(配对 40 步内通关 / 贪吃蛇 60 分 / 飞飞猫 6 管道……),达标自动发金币。抽选没有用随机数,而是拿日期字符串做哈希再对奖池取模——同一天所有人抽到的是同一条任务,且跨天自动重置。「伪随机但确定」的选择让每日挑战有了集体话题感:今天全家都在肝同一条。
图鉴是整个合集的进度粘合剂——8 只猫各有一条跨游戏的解锁规则:
| 猫 | 解锁条件 | 引导去向 |
|---|---|---|
| 陈皮 | 消消乐解锁第 3 关 | 消消乐 |
| 包子 | 消消乐解锁第 6 关 | 消消乐 |
| 年年 | 配对 40 步内通关 | 配对 |
| 松露 | 猫吃鱼单局 60 分 | 贪吃蛇 |
| 有鱼 | 猫吃鱼单局 120 分 | 贪吃蛇 |
| 警长 | 打地鼠单局 120 分 | 打地鼠 |
| 大儿 | 飞飞猫飞过 6 根管道 | 飞飞猫 |
| 阿狸 | 完成 1 次每日挑战 | 全游戏 |
每条规则指向一个玩家还没玩过的游戏——图鉴本质上是一张「缺什么补什么」的任务清单。未解锁的猫显示灰度剪影 + 问号 + 解锁条件,游戏结束时上报成绩、check() 评估所有规则,新解锁的猫以粉色渐变胶囊 toast 全屏弹出(多个解锁错峰依次出现,一个一个爽)。
为什么这套元进度系统重要?单游戏的生命周期是「玩到腻」,合集的生命周期是「还有猫没收集」。113 行代码把六个独立小游戏变成了一个有长期目标的产品——这可能是整个项目性价比最高的 113 行。
| 坑 | 现象 | 解法 |
|---|---|---|
| 倔强状态记坐标 | 大儿移走后旧坐标误伤其他猫 | 状态挂在 DOM 元素引用上,跟着猫走 |
| 音效自动播放限制 | 首次操作无声 | 首次用户交互后才初始化 AudioContext |
| 多游戏存档分裂 | 各游戏各存各的,金币不通用 | 统一钱包 + 首次访问一次性迁移旧存档 |
| 每日挑战被刷 | 反复领奖励 | 领取即刻置 done 标记,跨天(日期比对)才重置 |
| 图鉴重复弹提示 | 已解锁的猫反复触发 toast | check() 只返回「本轮新解锁」,解锁即刻落盘 |
回头看,这个项目最值得记的不是任何一个单独的游戏,而是「合集」这个形态本身:六个小游戏各自都只是「能玩」的水平,但统一钱包让金币有了跨游戏的价值,每日挑战给了每天打开的理由,猫咪图鉴给了长期收集的目标——1 + 1 + 1 + 1 + 1 + 1 > 6。
以及,大儿现在会在三个游戏里欺负玩家了。家人的猫咪图鉴还差有鱼和警长没解锁,看样子最近要被贪吃蛇和打地鼠虐一阵——这正是我想要的效果。