传2-Lua 系统函数 第七课 math函数

image.png

课程入口,点击进入

《Lua数学函数完全指南:从基础到实战应用》

上课日期:2025年3月25日

上课时间:晚上9:33

上课时长:1小时6分钟26秒


一、课程核心内容概述

这节课是Lua数学函数的系统讲解课程,重点讲解了绝对值计算随机数生成取整函数三角函数基础等核心数学函数。通过实际代码演示游戏开发场景,深入理解了数学计算在游戏开发中的实际应用。


二、课程时间线梳理

0-15分钟基础数学函数

  • 绝对值函数abs() - 距离计算的实际应用
  • 取整函数ceil()/floor() - 向上向下取整的区别
  • 数值处理技巧 - 游戏中的坐标计算

15-30分钟随机数系统

  • 随机种子设置 - 伪随机数的原理
  • 时间戳应用 - 基于时间的随机种子
  • 游戏概率实现 - 抽奖系统的随机算法

30-45分钟高级数学函数

  • 取模运算mod() - 余数计算的应用
  • 最大值最小值 - 数值比较的优化
  • 数值类型判断 - 整数与浮点数的区分

45-60分钟时间与日期函数

  • OS时间函数 - 系统时间的获取与应用
  • 日期格式化 - 时间字符串的生成
  • 耗时检测 - 程序性能的监控

60-66分钟三角函数基础

  • 简单三角函数 - 基础概念介绍
  • 实际应用场景 - 游戏中的角度计算
  • 学习资源建议 - 进一步学习的途径

三、重点技术难点解析

1. 绝对值函数的实战应用

游戏中的距离计算

-- 计算玩家与怪物之间的距离
function CalculateDistance(playerX, playerY, monsterX, monsterY)
    local diffX = math.abs(playerX - monsterX)  -- X轴距离
    local diffY = math.abs(playerY - monsterY)  -- Y轴距离
    local distance = math.sqrt(diffX^2 + diffY^2)  -- 直线距离
    return distance
end

-- 应用场景:判断是否在攻击范围内
if CalculateDistance(playerX, playerY, monsterX, monsterY) <= attackRange then
    -- 执行攻击逻辑
end

取整函数的实际用途

-- 物品数量计算(向上取整)
local neededItems = math.ceil(totalNeed / stackSize)

-- 经验值计算(向下取整)  
local actualExp = math.floor(baseExp * rate)

-- 坐标对齐(网格系统)
local alignedX = math.floor(rawX / gridSize) * gridSize

2. 随机数系统的深入理解

正确的随机种子设置

-- 基于时间的随机种子(推荐)
math.randomseed(os.time())

-- 更复杂的种子生成(提高随机性)
local complexSeed = os.time() * 1000 + os.clock() * 1000000
math.randomseed(complexSeed)

-- 游戏中的概率应用
function CalculateDropChance()
    local roll = math.random(100)  -- 1-100的随机数
    if roll <= 5 then       -- 5%概率
        return "史诗装备"
    elseif roll <= 20 then   -- 15%概率  
        return "稀有装备"
    else                     -- 80%概率
        return "普通装备"
    end
end

随机数的高级技巧

-- 指定范围的随机数
function RandomInRange(min, max)
    return math.random(min, max)
end

-- 权重随机系统
function WeightedRandom(weights)
    local total = 0
    for _, weight in ipairs(weights) do
        total = total + weight
    end
  
    local roll = math.random() * total
    local current = 0
  
    for i, weight in ipairs(weights) do
        current = current + weight
        if roll <= current then
            return i
        end
    end
end

3. 时间日期函数的实用技巧

游戏活动时间控制

-- 获取当前时间
local currentTime = os.date("*t")

-- 判断是否在活动时间内
function IsEventActive()
    local timeInfo = os.date("*t")
  
    -- 检查星期几(1=周日,2=周一,...)
    if timeInfo.wday == 1 or timeInfo.wday == 7 then  -- 周末
        return true
    end
  
    -- 检查具体时间(晚上8-10点)
    if timeInfo.hour >= 20 and timeInfo.hour < 22 then
        return true
    end
  
    return false
end

-- 耗时性能检测
function MeasurePerformance(func)
    local startTime = os.clock()
    func()  -- 执行被测函数
    local endTime = os.clock()
    local elapsed = endTime - startTime
    print(string.format("函数执行耗时: %.6f 秒", elapsed))
    return elapsed
end

四、核心函数详解

基础数学函数

  1. math.abs(x) - 绝对值计算

    • 应用:距离计算、数值修正
    • 示例:math.abs(-5.5)5.5
  2. math.ceil(x) - 向上取整

    • 应用:物品堆叠、分页计算
    • 示例:math.ceil(3.2)4
  3. math.floor(x) - 向下取整

    • 应用:经验计算、数值截断
    • 示例:math.floor(3.9)3
  4. math.max(...) - 最大值

    • 应用:属性比较、伤害计算
    • 示例:math.max(1, 5, 3)5
  5. math.min(...) - 最小值

    • 应用:限制数值、条件判断
    • 示例:math.min(1, 5, 3)1

随机数函数

  1. math.random() - 基础随机数

    • 应用:概率判定、随机事件
    • 示例:math.random()0.12345
  2. math.random(n) - 范围随机数

    • 应用:随机选择、物品掉落
    • 示例:math.random(100)1-100的整数
  3. math.random(m, n) - 区间随机数

    • 应用:伤害浮动、属性随机
    • 示例:math.random(10, 20)10-20的整数
  4. math.randomseed(seed) - 随机种子

    • 应用:随机序列控制、调试复现

高级数学函数

  1. math.modf(x) - 分离整数小数

    • 应用:数值分析、精确计算
    • 示例:math.modf(3.14)3, 0.14
  2. math.type(x) - 数值类型判断

    • 应用:输入验证、数据处理
    • 示例:math.type(5)"integer"
  3. math.tointeger(x) - 转换为整数

    • 应用:类型转换、数据清理
    • 示例:math.tointeger(3.0)3

时间日期函数

  1. os.clock() - CPU时间

    • 应用:性能测试、耗时统计
  2. os.date(format) - 日期格式化

    • 应用:时间显示、日志记录
    • 格式符:%Y%m%d%H%M%S
  3. os.time(table) - 时间戳

    • 应用:时间计算、过期判断

五、实战应用场景

游戏开发中的应用

1. 战斗系统

-- 伤害浮动计算
function CalculateDamage(baseDamage, variance)
    local minDamage = baseDamage * (1 - variance)
    local maxDamage = baseDamage * (1 + variance)
    return math.random(minDamage, maxDamage)
end

-- 命中率判定
function CheckHitRate(attackerHit, defenderDodge)
    local hitRate = math.max(0, math.min(100, attackerHit - defenderDodge))
    return math.random(100) <= hitRate
end

2. 物品系统

-- 随机掉落
function RandomDrop(dropTable)
    local totalWeight = 0
    for _, item in ipairs(dropTable) do
        totalWeight = totalWeight + item.weight
    end
  
    local roll = math.random(totalWeight)
    local current = 0
  
    for _, item in ipairs(dropTable) do
        current = current + item.weight
        if roll <= current then
            return item.id
        end
    end
end

3. 时间活动

-- 每日签到
function CheckDailyReward(lastRewardTime)
    local currentTime = os.time()
    local lastTime = os.time(lastRewardTime)
    local timeDiff = currentTime - lastTime
  
    -- 检查是否过了一天
    return timeDiff >= 86400  -- 24小时的秒数
end

六、学习建议与进阶方向

掌握程度要求

必须熟练掌握

  • 绝对值、取整、最大值最小值函数
  • 随机数生成与种子设置
  • 基础的时间日期处理

建议了解掌握

  • 取模运算、数值类型判断
  • 简单的三角函数概念
  • 性能检测与耗时统计

可选深入学习

  • 高级三角函数应用
  • 复杂的数学算法实现
  • 自定义数学函数库

实践练习项目

  1. 简易计算器 - 练习基础数学运算
  2. 随机抽奖系统 - 掌握概率计算
  3. 游戏伤害系统 - 综合应用各种函数
  4. 时间管理工具 - 熟练日期时间处理

常见错误避免

  1. 忘记设置随机种子 - 导致随机数可预测
  2. 整数除法错误 - 注意Lua的除法规则
  3. 时间格式混淆 - 清楚区分各种时间格式
  4. 浮点数精度问题 - 注意浮点运算的精度限制

这节课通过系统的数学函数讲解丰富的实战示例,让学员全面掌握了Lua中数学计算的核心技术,特别是游戏开发中常用的数学处理技巧,为后续复杂的游戏系统开发奠定了坚实的数学基础!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

举报

改内容来自
系统函数
进入
快速回复 返回顶部 返回列表