找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1563|回复: 0

[教程源码] [Lua插件开发]09. 随机数函数例子

[复制链接]
  • 打卡等级:坠落山崖

1081

主题

2107

回帖

4289

积分

院长

鲜花
7
猫粮
7489
QQ
发表于 2022-3-13 14:55:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
本系列教程目的是让大家掌握Lua基本语法与按键精灵手机版的插件开发制作,丰富按键精灵生态环境,让按键精灵变得更加强大!
本教程中部分知识点参考《Lua程序设计》书籍,有兴趣可以自行购买→传送门
按键精灵手机版插件的开发标准草案请阅读帖子:https://zimaoxy.com/b/t-3297-1-1.html
紫猫学院也有提供Lua插件开发的VIP教学服务,有兴趣请咨询紫猫老师QQ345911220或微信zimaoxy

在Lua中的随机数是非常简单方便的实现的,通过math.random()这个命令即可获得范围内的随机整数,而按键精灵内置的Rnd()函数是依据VBScript封装的返回0到1之间小数功能。这里我们自己来用Lua随机数封装一个随机整数。
[Lua] 纯文本查看 复制代码
-- 返回数值范围内的随机整数,不分先后顺序,需自行重置随机种子
function zimao.RndNum(m, n)
    return try {
        function ()
            m = tonumber(m) or 0
            n = tonumber(n) or 0
            local max = ( m > n ) and m or n
            local min = ( m < n ) and m or n
            return math.random(min, max)
        end,
        catch {
            function (errors)
                traceprint("发生运行时错误!错误代码:RndNum(),错误信息:", errors)
            end
        }
    }
end

在按键精灵中调用时,请使用Randomize重置随机数种子,然后再进行取随机值,否则会造成完全一样的返回结果。
[按键精灵] 纯文本查看 复制代码
Import "zimaoxy.lua"

Randomize //重置随机数种子,避免出现重复序列结果

For 10
        TracePrint zimaoxy.RndNum(1, 100) //获得随机结果
Next 


下面附上zimaoxy.lua完整插件代码
[Lua] 纯文本查看 复制代码
local _zimao = {} --这是内部私有table函数
local zimao = {} --这是对外公开table函数
QMPlugin = zimao --通过这行代码, 实现将zimao表中所有函数对外公开

_zimao.version = "20220310" --插件版本号, 方便自己记忆

local function try(block) -- 保护执行函数
    local tablejoin = function (...)
        local result = {}
        for _, t in ipairs({...}) do
            if type(t) == "table" then
                for k, v in pairs(t) do
                    if type(k) == "number" then table.insert(result, v)
                    else result[k] = v end
                end
            else
                table.insert(result, t)
            end
        end
        return result
    end
         
    -- get the try function
    local try = block[1]
    assert(try)
     
    -- get catch and finally functions
    local funcs = tablejoin(block[2] or {}, block[3] or {})
     
    -- try to call it
    local result_error = {}
    local results = {pcall(try)}
    if not results[1] then
        -- run the catch function
        if funcs and funcs.catch then
            result_error = {funcs.catch(results[2])}
        end
    end
 
    -- run the finally function
    if funcs and funcs.finally then
        local result_fin = {funcs.finally(table.unpack(results))}
        if #result_fin > 0 then
            return table.unpack(result_fin)
        end
    end
 
    -- ok?
    if results[1] and #results > 1 then
        return table.unpack(results, 2, #results)
    else
        if #result_error > 0 then
            return table.unpack(result_error)
        else
            return nil
        end
    end
end
local function catch(block) --异常捕获函数
    return {catch = block[1]}
end
local function finally(block) --最终必定执行函数
    return {finally = block[1]}
end

-- 常用的内部函数, 不加入私有table中, 直接定义使用
local function traceprint(...)  --调用按键精灵的调试输出命令
    if QMPlugin then -- 在Lua调试环境下, QMPlugin变量的值是我们插件公开table函数值, 而在按键精灵调试运行环境下, 该变量值被替换为nil
        print(...)
    else
        -- 获取可变长参数的第一个参数值
        local line = select(1, ...)
        -- 如果第一个参数是字符串, 并且符合格式 _数字 , 则判定为行号意思
        if type(line) == "string" and line:match("^%_%d+$") then
            -- 第一个参数按照格式 _数字: 传入TracePrint中可实现打印行号功能
            LuaAuxLib.TracePrint(line .. ":", table.concat({...}, " ", 2, select("#", ...)))
        elseif line == ":" and #{...} > 1 then
            -- 第一个参数是冒号 : 时, 表示直接打印输出数据
            LuaAuxLib.TracePrint(":", table.concat({...}, " ", 2, select("#", ...)))
        else
            -- 其他的情况下则加上前缀后, 进行正常输出
            LuaAuxLib.TracePrint(":","紫猫学院测试插件:", ...)
        end
    end
end

-- 实现获取变量信息的插件函数, 需对外公开, 所以使用zimao前缀
function zimao.VarInfo(...)
    -- 防止无法获取nil参数
    local paramCount = select("#", ...)
    local varType, printStr, t = "", "", {}
    for i = 1, paramCount do
        local v = select(i, ...)
        try {
            function()
                varType = type(v)
                if varType == "table" then
                    printStr = "【" .. varType .." " .. tostring(#v) .. "】" .. LuaAuxLib.Encode_GetJsonLib():encode(v)
                elseif varType == "number" or varType == "string" then
                    printStr = "【" .. varType .." " .. tostring(#tostring(v)) .. "】" .. tostring(v)
                elseif varType == "boolean" or varType == "null" then
                    printStr = "【" .. varType .."】" .. tostring(v)
                else
                    printStr = "【" .. varType .."】 未知数据,无法查看!"
                end
                table.insert( t, #t + 1, printStr )
            end,
            catch {
                function (errors)
                    -- 下面这个traceprint是我们上面定义过的内部输出命令,注意大小写
                    traceprint("发生运行时错误!错误代码:VarInfo(),错误信息:", errors)
                end
            }
        }
    end
    printStr = table.concat( t, ", " )
    return printStr
end

-- 实现打印输出变量详细信息数据, 需对外公开
function zimao.TracePrint(...)
    -- 通过VarInfo函数获取参数的详细数据信息
    local info = zimao.VarInfo(...)
    try {
        function()
            -- 在保护模式下打印输出这个数据内容
            traceprint(info)
        end,
        catch {
            function (errors)
                traceprint("发生运行时错误!错误代码:TracePrint(),错误信息:", errors)
            end
        }
    }
end

-- 遍历按键精灵的LuaAuxLib库下所有函数命令
function zimao.ScanLuaAuxLib()
    -- 以保护模式运行, 避免插件错误造成脚本终止
    try {
        function()
            -- 遍历LuaAuxLib内的内容
            for k, v in pairs(LuaAuxLib) do
                -- 使用自定义函数traceprint在按键精灵中打印函数名
                traceprint("名称: " .. k, "类型: " .. type(v))
            end
        end,
        catch {
            function (errors)
                traceprint("发生运行时错误!错误代码:ScanLuaAuxLib(),错误信息:", errors)
            end
        }
    }
end

-- 数组排序, false为升序, true为降序, 省略默认为false
function zimao.Sort(list, comp)
    return try {
        function ()
            -- 定义排序规则函数
            local f = function(a, b)
                if comp then
                    return a > b
                else
                    return a < b
                end
            end
            -- 返回排序结果
            return table.sort(list, f)
        end,
        catch {
            function (errors)
                traceprint("发生运行时错误!错误代码:Sort(),错误信息:", errors)
            end
        }
    }
end

-- 随机数
function zimao.RndNum(m, n)
    return try {
        function ()
            m = tonumber(m) or 0
            n = tonumber(n) or 0
            local max = ( m > n ) and m or n
            local min = ( m < n ) and m or n
            return math.random(min, max)
        end,
        catch {
            function (errors)
                traceprint("发生运行时错误!错误代码:RndNum(),错误信息:", errors)
            end
        }
    }
end
楼主热帖
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|紫猫编程学园

GMT+8, 2024-4-19 20:32

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表