欢迎来到淼淼之森的个人小站。  交流请加我微信好友: studyjava。  也欢迎关注同名公众号:Java学习之道

lua之选择消耗匹配目标消耗

  |   0 评论   |   0 浏览

前言

最近接触了一个制作的功能,大体思路是:玩家选择消耗的材料,系统根据选择的消耗去匹配生产配方,决定生产结果。

思路

配方表如下:

formula = {
    [1] = {consume = {1,101,1,1,101,1},target = {2,102,1},},
    [2] = {consume = {1,101,1,1,102,1},target = {2,101,1},},
    [3] = {consume = {1,103,1,1,105,1},target = {2,103,1},},
}

consume说明:3位1组代表一个道具消耗,3位分别是:道具类型,道具sid,道具数量
玩家选择列表如下:{1,101,1,1,102,1}
需要特别说明的是,道具不分顺序,但是每个道具的数量必须一致,不多不少,即为匹配成功。
这个功能的难点是根据消耗列表匹配配方,实现思路如下:
将消耗列表和配方列表转换,把道具的类型,sid结合成唯一键:例如类型*10000+sid(具体可以根据项目情况组合)。将道具数量作为值,与类型,sid组合的键行程键值对。最后只需要判断转换后的列表是否相等。

实现方法

1.转换表

-- 一维数组{2,101,1,2,102,1}
local function ConversionList(list)
    local temp = {}
    for i=1,#list,3 do
        local _type = list[i]
        local sid = list[i+1]
        local num = list[i+2]
        local idx = _type*1000000000+sid
        temp[idx] = temp[idx] and temp[idx] + num or num
    end
    return temp
end

2.比较表是否相等

--判断两个table是否一致
local function CheckTableSame(t1, t2) 
    if type(t1) ~= "table" or type(t2) ~= "table" then
        return t1 == t2
    end
    for k, v in pairs(t1) do
        if not CheckTableSame(t2[k], v) then
            return false
        end
    end
    for k, v in pairs(t2) do
        if not CheckTableSame(t1[k], v) then
            return false
        end
    end
    return true
end

3.通过配置寻找配方

local function GetOneFormula(list)
    local list1 = ConversionList(list)
    for k,v in pairs(base.compose_config) do
        local list2 = ConversionList(v.consume)
        if table.equals(list1,list2) then
            return v
        end
    end
end

完整代码

local formula = {
    [1] = {consume = {1,101,1,1,101,1},target = {2,102,1},},
    [2] = {consume = {1,101,1,1,102,1},target = {2,101,1},},
    [3] = {consume = {1,103,1,1,105,1},target = {2,103,1},},
}

-- 转换表
local function ConversionList(list)
    local temp = {}
    for i=1,#list,3 do
        local _type = list[i]
        local sid = list[i+1]
        local num = list[i+2]
        local idx = _type*1000000000+sid
        temp[idx] = temp[idx] and temp[idx] + num or num
    end
    return temp
end

--判断两个table是否一致
local function CheckTableSame(t1, t2) 
    if type(t1) ~= "table" or type(t2) ~= "table" then
        return t1 == t2
    end
    for k, v in pairs(t1) do
        if not CheckTableSame(t2[k], v) then
            return false
        end
    end
    for k, v in pairs(t2) do
        if not CheckTableSame(t1[k], v) then
            return false
        end
    end
    return true
end

-- 查找对应配方
local function GetOneFormula(list)
    local list1 = ConversionList(list)
    for k,v in pairs(base.compose_config) do
        local list2 = ConversionList(v.consume)
        if CheckTableSame(list1,list2) then
            return v
        end
    end
end

标题:lua之选择消耗匹配目标消耗
作者:shirlnGame
地址:https://www.mmzsblog.cn/articles/2024/05/23/1716435193426.html

如未加特殊说明,文章均为原创,转载必须注明出处。均采用CC BY-SA 4.0 协议

本网站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。若本站转载文章遗漏了原文链接,请及时告知,我们将做删除处理!文章观点不代表本网站立场,如需处理请联系首页客服。
• 网站转载须在文章起始位置标注作者及原文连接,否则保留追究法律责任的权利。
• 公众号转载请联系网站首页的微信号申请白名单!

个人微信公众号 ↓↓↓                 

微信搜一搜爱上游戏开发