如何在Lua中实现游戏无重复的无轨电车编号?
实现不重复无轨电车编号的正确Lua方案
原代码存在的问题
- 每次调用
giveNumber都会重新创建局部表takedNumbers,无法持久记录已使用的编号 - 函数内的
number、takedNumbers等都是局部变量,函数外的重复检查代码根本无法访问这些变量,完全无效 - 函数调用方式错误,
script.Parent.Script:giveNumber()是面向对象调用格式,但giveNumber不是类方法,应该直接调用函数 - 重复检查逻辑放在函数外部,既触发时机不对,也无法获取到函数内的变量值
正确实现代码
-- 全局/模块级别存储已使用的编号,确保跨调用能复用记录 local usedNumbers = {} function assignTramNumber() local number -- 循环生成编号,直到拿到未被使用的 repeat number = math.random(100, 199) until not usedNumbers[number] -- 标记该编号已被使用 usedNumbers[number] = true -- 给各个UI文本框设置编号 local parent = script.Parent local numStr = tostring(number) parent.pered.SurfaceGui.TextLabel.Text = numStr parent.zad.SurfaceGui.TextLabel.Text = numStr parent.levo.SurfaceGui.TextLabel.Text = numStr parent.pravo.SurfaceGui.TextLabel.Text = numStr return number end -- 首次执行分配编号 assignTramNumber()
关键说明
usedNumbers放在函数外部,避免每次调用都重置记录,保证已使用编号能被持久追踪- 用
repeat-until循环确保生成的编号一定未被使用,逻辑简单直接 - 以编号为键存入
usedNumbers表,判断是否重复的效率远高于数组遍历 - 用
tostring()把数字转成字符串,避免UI文本框因类型不匹配出现异常 - 函数命名更贴合业务语义,可读性更强
内容的提问来源于stack exchange,提问作者dyvaraZrab
相关产品推荐
相关产品推荐

