Lua中math.random(2)判断代码的语法逻辑疑问
Lua 相关代码逻辑说明
math.random 函数的传参规则
Lua 标准库的math.random用于生成随机数,根据传入参数数量不同行为有区别:
- 仅传入1个正整数参数
n时:返回闭区间[1, n]内的随机整数,每个整数出现概率均等。你看到的传参数2的写法,调用后只会等概率返回1或者2。 - 传入2个整数参数
min、max时:返回闭区间[min, max]内的随机整数,这也是第二行ballDY = math.random(-50, 50)能拿到-50到50之间随机值的原因。
第一行代码的写法逻辑
Lua 原生没有其他语言常见的条件 ? 真值返回值 : 假值返回值三元运算符,开发者普遍用判断条件 and 真值 or 假值的写法模拟三元逻辑,这个写法依赖Lua逻辑运算符的短路求值规则:
- 对
a and b:如果a是假值(Lua里仅nil和false是假值,其余全是真值),直接返回a,不会执行b的逻辑;如果a是真值,直接返回b。 - 对
a or b:如果a是真值,直接返回a,不会执行b的逻辑;如果a是假值,直接返回b。
套用到ballDX = math.random(2) == 1 and 100 or -100这行,执行流程是:
- 调用
math.random(2),50%概率返回1,50%概率返回2 - 判断返回值是否等于1:
- 如果返回1,判断结果为
true(真值),true and 100返回100;后续100 or -100中100是真值,直接返回100,最终ballDX被赋值为100 - 如果返回2,判断结果为
false(假值),false and 100直接返回false;后续false or -100返回-100,最终ballDX被赋值为-100
- 如果返回1,判断结果为
这两行是弹球类游戏的常见开局逻辑:
ballDX控制小球水平移动方向,等概率随机选向左或向右的初始速度;ballDY控制小球垂直移动方向,随机取-50到50之间的速度值,让开局发球角度不固定。
内容的提问来源于stack exchange,提问作者NADER LABBAD
相关产品推荐
相关产品推荐

