【游戏功能】
一、一个永远无解的谜题
光点翻转类解谜的第一版被测试打回:"第三关无解。"排查逻辑:点一个光点,它与上下左右四个邻居一起翻转,全亮即通关——逻辑没毛病。毛病在谜题生成:随机把若干光点点灭当作开局,随机生成的局面有一半概率是无解局面。翻转解谜的正确生成方式是反推:从全亮终局出发,随机执行若干次"点按"到达开局——反推生成的谜题天然有解,玩家只需把生成过程倒着做一遍。
二、机制原理:点按即翻转,生成即反推
核心规则:点一个光点,它与上下左右四个邻居一起翻转亮灭状态。谜题生成的反推法:从全亮终局出发,随机点按若干次到达开局——每步点按都可逆(再点一次翻回来),开局必然能通过逆操作回到全亮。玩家的解题直觉在这里就是解题的算法。
fx-lightflip
三、正确写法:反推生成与翻转判定(幂尔版)
local LightFlip = {}
local CONST = { MSG_ID = 12320, KEY = "LightFlip", GEN_PRESSES = 8 }
function LightFlip.GenPuzzle(n)
LightFlip._n = n
LightFlip._grid = {}
for i = 1, n * n do LightFlip._grid[i] = true end -- 从全亮终局反推
for _ = 1, CONST.GEN_PRESSES do
local r = math.random(1, n)
local c = math.random(1, n)
LightFlip:ApplyFlip(r, c, true) -- 生成期点按不记步数
end
LightFlip._steps = 0
LightFlip._won = false
end
function LightFlip:ApplyFlip(r, c, silent)
local dirs = { {0,0}, {0,1}, {0,-1}, {1,0}, {-1,0} }
for _, d in ipairs(dirs) do
local rr, cc = r + d[1], c + d[2]
if rr >= 1 and rr <= self._n and cc >= 1 and cc <= self._n then
local idx = (rr - 1) * self._n + cc
self._grid[idx] = not self._grid[idx]
end
end
if not silent then self._steps = self._steps + 1 end
end
function LightFlip.OnTap(r, c)
if LightFlip._won then return end
LightFlip:ApplyFlip(r, c)
LightFlip._steps = LightFlip._steps + 1
if LightFlip:AllLit() then
LightFlip._won = true
SL:SendLuaNetMsg(CONST.MSG_ID, 0, 0, 0,
SL:JsonEncode({ key = CONST.KEY, op = 1, steps = LightFlip._steps }))
SL:ShowSystemTips("通关! 用了 " .. LightFlip._steps .. " 步")
end
end
return LightFlip
四、四个必须钉死的细节
五、心法:生成谜题的最好方式是破坏答案
反推生成法适用于一切有明确终局的解谜:华容道从终局倒推打乱、拼图从完整图拆块、推箱子从通关态回推箱子位置。从答案倒着走若干步得到谜面,谜面必然可解;随机摆放的谜面,一半是死局。解谜玩法的生成器,写的从来不是"出题",是"从答案出发的破坏"。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏功能】 一刀才二十,凭什么说它是好技能?放血的账要等五秒后才看得全:刀口一开,血自己往外淌,五口小额慢扣,总账远超那一…
【游戏功能】 从它头顶翻过去,落地的哪一秒最疼?答案是它转过身来之前的那半秒。燕返的全套设计都围着这半秒转:起跳掠过头顶、落…
【游戏功能】 移速快两成有什么用?打不到人的时候才知道。疾行术是这批技能里数值最朴素的一个——没有伤害、没有控制,就一条移速…
【游戏功能】 太极阵的骨架就这一行:在地上画一个会转的阴阳圈。但让怪物"身不由己"往阵心走的,不是这个圈的画,是圈里每帧都在…
【游戏功能】 明明开着护甲,怎么比裸奔掉血还快?有人把神圣战甲术和金刚护体混为一谈——罩是先扣罩值再掉血,甲是每一刀 打对折…
【游戏功能】 血条见底的时候,道士的刀为什么还在回血?血刀术的反直觉就在这:伤害照给、血也照回,两条账同时走——它不是"吸血…