沙巴克入场的复合判定:会员、有令牌、非红名三选二即可进,学员写 status ~= "red" and (hasToken or isMember) 或不加括号的变体——and 优先级高于 or,不加括号时 and 先结合,语义悄悄改变。多条件混用 and/or 时,“谁是 AND 组、谁是 OR 组”必须由括号显式声明,靠优先级记忆写的条件迟早出事。错误写法:
local function canEnterBad(actor, hasToken, isMember)
actor = getplayerbyname(actor)
local status = getplayvar(actor, "HUMAN", "Status")
if hasToken or isMember and status ~= "red" then
beginteleport(actor, 333, 333)
end
end
这个写法里红名的会员也能进(and 只绑定了 isMember 与红名判断),与“红名一律拦下”的业务意图相反。
先把业务意图写成中文的与或句,再按句加括号:会员或有令牌,且非红名。示例代码如下:
local function canEnter(actor, hasToken, isMember)
actor = getplayerbyname(actor)
local status = getplayvar(actor, "HUMAN", "Status")
local notRed = status ~= "red"
if (hasToken or isMember) and notRed then
beginteleport(actor, 333, 333)
sendmsg(actor, 1, "欢迎进入沙巴克战场。")
return true
end
sendmsg(actor, 1, "入场条件:会员或持有令牌,且非红名。")
return false
end
本篇的新技术点是“中间变量拆条件”:notRed 单独成变量,表达式从三层嵌套变成两个词的与,可读性与正确性同时提升。
真值表四行各触发一次:非红名有令牌(进)、非红名是会员(进)、红名有令牌(拦)、红名无令牌无会员(拦),对照业务意图逐行核对。
not 与比较混用同样加括号:not (a == b) 与 a ~= b 等价但前者多绕一层,直接用不等运算符。示例代码如下:
local function isNotEqual(a, b)
return not (a == b)
end
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
设计初衷 生存向属性的堆法单一:全堆血防就能站桩——挨打没有反馈,进攻方也没有取舍。反伤与荆棘设计:引入"被打反伤"机制并配…
设计初衷 活动做过就下架:老玩家念着当年的中秋灯会,新玩家永远错过——内容资产利用率极低,新玩法的开发压力却全压在增量上。活…
底层原理 一条业务请求(聊天、交易、入队)前面总挂着同样的横切逻辑:鉴权、限频、日志——每个入口各写一遍必然重复。中间件模式…
底层原理 求区间和(第 3 到 17 名的战力总和):前缀和预处理后查询 O(1),但单点更新要 O(n) 重算整张前缀表;…
设计初衷 玩家的江湖故事散落在各系统的角落:成就页有里程碑、战绩页有击杀、名人堂有荣誉——拼不出一个完整的"人"。玩家传记设…
业务场景 玩家跑商只能身上背货:负重有限、路线自己跑、货物分站下不去。马车货运封装:驿站雇马车按固定线路多点卸货,载重按马车…