lua之选择消耗匹配目标消耗
前言
最近接触了一个制作的功能,大体思路是:玩家选择消耗的材料,系统根据选择的消耗去匹配生产配方,决定生产结果。
思路
配方表如下:
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 协议!
本网站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。若本站转载文章遗漏了原文链接,请及时告知,我们将做删除处理!文章观点不代表本网站立场,如需处理请联系首页客服。• 网站转载须在文章起始位置标注作者及原文连接,否则保留追究法律责任的权利。
• 公众号转载请联系网站首页的微信号申请白名单!