游戏中的匹配组队方法

        在游戏中,或者在其他需要匹配组队的需求中,常常需要从一个匹配池中寻找若干个符合条件的对象,将它们组成一队。问题在于,匹配成功往往需要两两匹配,最笨的办法就是多重循环,依次找第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的尾调用机制。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值