【语法】
一、隐蔽陷阱
4 件库存商品要列全部上架组合,手写 4 层嵌套循环既漏一种又难扩展,改成 5 件就得把代码重写一遍——n 件商品的组合有没有统一走法?
二、底层原理
每件商品只有"选或不选"两种状态,n 件商品的组合恰好对应 0 到 2^n-1 的整数:整数的第 k 个二进制位为 1 表示选第 k 件。外层枚举整数,内层拆位过滤,n=4 时 16 种组合一趟出齐,n 变了只改一个上限。
三、正确代码
基础写法(按掩码挑出成员):
local function pickOne(items, mask)
local out = {}
for k = 1, #items do
if math.floor(mask / 2 ^ (k - 1)) % 2 == 1 then
out[#out + 1] = items[k]
end
end
return out
end
进阶写法(全量枚举与抽样展示):
local items = {"货架A", "货架B", "货架C", "货架D"}
local total = 2 ^ #items
local p = getplayerbyname("combo01")
sendmsg(p, 1, "4 件商品共 " .. total .. " 种组合")
sendmsg(p, 1, table.concat(pickOne(items, 13), ","))
四、引擎验证
掩码 13 的二进制是 1101,输出货架A、货架C、货架D;组合总数 16 与 2^4 一致,改 5 件即 32。
五、FAQ
问:组合数会爆炸吗?
答:2^n 增长,20 件已超百万,按需生成别全存。
问:空组合算吗?
答:掩码 0 即空组合,包含在枚举内。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏】 一、规则机制 线上事故:玩家装备耐久打空才发现,战力拦腰砍半,打不动怪又投诉掉率。耐久提醒立双档:耐久低于三成弹黄…
【语法】 一、机制原理 抛个坑:行列表格要变成列行,每格都搬一遍还新建了整张表——方形矩阵能不能原地换?转置沿对角线折返:只…
【游戏】 一、规则机制 隐蔽的坑:"最近浏览"里同一件商品重复出现五六次,足迹成了复读机。浏览足迹立两条:每次查看先在足迹里…
【语法】 一、机制原理 一行代码拆解:local bucket = math.floor(v / width)。数值分布统计…
【语法】 一、机制原理 一行代码拆解:setmetatable(cfg, {__index = DEFAULTS})。配置对…
【游戏】 一、规则机制 线上事故:结算时玩家追问"我到底打了多少",战斗中没有任何实时输出面板,事后对不上账。输出统计两步走…