30 份奖励按 4 人一组分配,学员写 30 / 4 = 7.5,再拿 7.5 去做循环边界或数量比较——Lua 的 / 永远返回浮点,7.5 参与下标、比较、拼接都会出幺蛾子:t[7.5] 是 nil,"共 7.5 组"的公告更让玩家满头问号。除法的商要当“份数”用,必须显式向下取整。错误写法:
local function splitGroups(actor, total, perGroup)
actor = getplayerbyname(actor)
local groups = total / perGroup
for i = 1, groups do
sendmsg(actor, 1, "第 " .. i .. " 组发放完毕。")
end
end
total=30、perGroup=4 时 i 会取到 7.5,循环多跑一轮半且下标全错。
份数用 math.floor 显式取整,余数单独处理:整除部分循环发放,余量单独发一轮。示例代码如下:
local function splitGroups(actor, total, perGroup)
actor = getplayerbyname(actor)
local fullGroups = math.floor(total / perGroup)
local remainder = total % perGroup
for i = 1, fullGroups do
giveitem(actor, "裁决之杖碎片", perGroup)
sendmsg(actor, 1, "第 " .. i .. " 组发放 " .. perGroup .. " 片。")
end
if remainder > 0 then
giveitem(actor, "裁决之杖碎片", remainder)
sendmsg(actor, 1, "余量单发 " .. remainder .. " 片。")
end
end
本篇的新技术点是“商与余分离”:floor 的商管整组循环,% 的余数管散片,两者配合让任何总量都能恰好分完。
三步验证:total=30、perGroup=4 时 fullGroups 应为 7、remainder 为 2,合计恰为 30;total=12、perGroup=4 的整除场景余数为 0、不进余量分支;total=3、perGroup=4 的不足一组场景只走余量分支。
反过来“每组分几个”也同理:人均 = math.floor(总量 / 人数),剩余的进行会金库而不是硬分。示例代码如下:
local function perPlayerAndRemain(total, players)
local per = math.floor(total / players)
local remain = total - per * players
return per, remain
end
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
设计初衷 生存向属性的堆法单一:全堆血防就能站桩——挨打没有反馈,进攻方也没有取舍。反伤与荆棘设计:引入"被打反伤"机制并配…
设计初衷 活动做过就下架:老玩家念着当年的中秋灯会,新玩家永远错过——内容资产利用率极低,新玩法的开发压力却全压在增量上。活…
底层原理 一条业务请求(聊天、交易、入队)前面总挂着同样的横切逻辑:鉴权、限频、日志——每个入口各写一遍必然重复。中间件模式…
底层原理 求区间和(第 3 到 17 名的战力总和):前缀和预处理后查询 O(1),但单点更新要 O(n) 重算整张前缀表;…
设计初衷 玩家的江湖故事散落在各系统的角落:成就页有里程碑、战绩页有击杀、名人堂有荣誉——拼不出一个完整的"人"。玩家传记设…
业务场景 玩家跑商只能身上背货:负重有限、路线自己跑、货物分站下不去。马车货运封装:驿站雇马车按固定线路多点卸货,载重按马车…