在游戏中,或者在其他需要匹配组队的需求中,常常需要从一个匹配池中寻找若干个符合条件的对象,将它们组成一队。问题在于,匹配成功往往需要两两匹配,最笨的办法就是多重循环,依次找第1个、第2个......第n个符合的对象,当队伍人数很多时,循环的层数将变得非常可怕,阅读性和扩展性都不好。
可以使用递归的方法来实现这匹配组队的过程。lua示例代码如下:
local TEAM_MEMBER_COUNT = 4 -- 匹配队伍人数
--[[
-- member_node : 匹配池中的某个节点
-- team_members :队伍成员暂存器,成员两两匹配
--]]
function MakeTeam(member_node, team_members)
-- 空节点表示已经遍历完匹配池
if member_node == nil then
return false
end
local member_data = member_node.data
-- 当前节点的对象如果与队伍中的成员均两两匹配
if IsMemberMatchTeam(member_data, team_members) then
-- 加入到队伍中
table.insert(team_members, member_data)
-- 匹配到的队伍人数够了,退出组队
if #team_members == TEAM_MEMBER_COUNT then
return true
else
-- 人数还没够,继续组队,从下一个节点开始
local is_match = MakeTeam(member_node.next, team_members)
-- is_match为false代表找不到下一个匹配的对象了
if is_match == false then
table.remove(team_members, #team_members)
end
return is_match
end
else
-- 继续遍历下去
return MakeTeam(member_node.next, team_members)
end
end
-- 使用例子
function MatchTeam(match_pool)
local team_members = {} -- 存储队伍成员
local member_node = match_pool:GetFirstNode() -- 获取匹配池头节点
while member_node do
local is_match = MakeTeam(member_node, team_members)
if is_match then
-- 匹配成功,team_members为队伍成员集合
-- 执行组队操作
-- 从匹配池中删除成员
else
-- 匹配失败
end
member_node = member_node.next
end
end
注意:在遍历时我也使用递归,为什么不用担心递归太深造成栈溢出呢,这得益于lua的尾调用机制。
本文来自 duxin121 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/duxin121/article/details/82918453?utm_source=copy
网友评论