做一款解谜游戏,最贵的环节不是摆棋盘,而是证明这个棋盘真的能被解开。到了240关这个量级,靠人一关一关去验,根本做不到。所以PRISM的作者把顺序反了过来。
PRISM的规则只有一条:点一下方块,它旋转90度,光线立刻找到新的路径。让每一颗水晶都亮起它要求的颜色,并且同时亮起,这一关就算通关。
![]()
规则简单,不代表关卡好做。要检查一个手工摆出来的棋盘,你得自己先把它解一遍。可一旦解不出来,你没法判断这关是难,还是压根无解。用这种办法,240关是做不出来的。
先造答案,再打乱
旋转类解谜游戏的生成器通常走另一条路:不摆棋盘再去找解法,而是先造出解法,再把它打乱。
顺序一换,无解的关卡就不可能存在了,因为棋盘是从一个解出发的。把打乱的过程倒着走回去,就是答案。
但停在这一步会产出一堆烂谜题。有些棋盘不止一个解。当两种摆法都能通关时,逻辑就没法把答案收窄,玩家靠乱转方块就能撞进正确答案。
所以每一个候选关卡都要被暴力穷举。生成器枚举所有可旋转方块的组合,数出其中有多少种是已解状态。只要不是恰好一个,直接丢掉。
如果状态空间超过上限,计数直接放弃,候选关卡同样丢弃。没有任何一关是靠“它大概是唯一解”上线的。证明不了的棋盘,不进游戏。
唯一性检查顺手清掉了废方块
这个检查还带来了一个作者没预料到的副作用:它会自动淘汰掉死方块。
一个光线永远照不到的方块,无论怎么旋转结果都一样。这会把已解状态的数量乘以该方块的旋转数,总数被推高到一以上,关卡随即失败。屏幕上每一个可旋转的方块,都是承重的。
每一关都会显示一个最少点击次数。在这个次数内解开,就能拿到“完美”。这个数字不是设计师拍脑袋估的,而是真正的最小值。
唯一性在这里又派上了用场。当解恰好只有一个时,最小点击次数就等于每个方块还差几圈才能到位之和。也就是说,生成器不需要去估算标准步数,它可以直接选定:定一个目标值,然后精确地倒着旋转那么多下。
选完之后还要独立验证一遍。打乱后的棋盘用广度优先搜索从头解一次,如果找到的最短路径和预设的标准步数对不上,候选关卡就被丢掉。生成器的bug会在这里现形。
过了证明,也不代表值得玩
通过唯一性证明还不够。后面还有更多关卡在等着筛:太简单的不要,一上来就已经解开的不要,水晶太少的不要,光线从不拐弯的不要,以及这一章本该教的现象——色散、混色——压根没发生的,也全部拒掉。
通过率很低。越到后面的章节,方块越多,供光线穿行的空格越紧张,水晶的摆放会吃掉大部分尝试。填满第六章的45关,需要大约一百万次尝试。这个脚本只在准备发版时跑一次,所以结果比运行时间重要。
生成器会统计每一道关卡拦下了多少候选,并把它打印出来,因为这份统计是调校某一章参数时唯一可用的证据。
“生成器跑对了”和“发出去的文件是对的”,是两件不同的事。所以同一套检查会在每次提交时对最终的关卡数据再跑一遍,覆盖全部240关:它能不能解,按求解器的路径点击是否真能清空棋盘,以及解是不是恰好只有一个。
没有这道测试,作者吃过一次亏。一次渲染改动让光束在接近吸收方块时提前停下,导致光束线段的端点不再是整数,而生成器的关卡判断恰恰是靠“端点是不是整数”来决定光线有没有到达。从那一刻起,所有带墙的关卡全被拒了。测试却一直是绿的,因为它们校验的是已提交的输出,从不校验生成规则。
现在可达性改由位置和行进方向判断,不再看端点坐标,渲染器把光束画得多短都不再影响结果。
六个章节,240关,平均标准步数单调上升。
对玩家来说,这一切最终收束成一句承诺:卡住了,是有原因的。没有哪个棋盘能靠运气通过,屏幕上显示的点击次数是真的够得着。一关你解不开,不是bug,是你还没看出来的逻辑。
这款游戏叫PRISM,付费、无广告、无内购、无需注册、不联网。第一章共14关,可在浏览器中直接游玩,无需安装。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.