在游戏中,或者在其他需要匹配组队的需求中,常常需要从一个匹配池中寻找若干个符合条件的对象,将它们组成一队。问题在于,匹配成功往往需要两两匹配,最笨的办法就是多重循环,依次找第1个、第2个......第n个符合的对象,当队伍人数很多时,循环的层数将变得非常可怕,阅读性和扩展性都不好。

可以使用递归的方法来实现这匹配组队的过程。lua示例代码如下:

local TEAM_MEMBER_COUNT = 4  -- 匹配队伍人数--[[
-- member_node  : 匹配池中的某个节点
-- team_members :队伍成员暂存器,成员两两匹配
--]]
function MakeTeam(member_node, team_members)-- 空节点表示已经遍历完匹配池if member_node == nil thenreturn falseendlocal member_data = member_node.data-- 当前节点的对象如果与队伍中的成员均两两匹配if IsMemberMatchTeam(member_data, team_members) then-- 加入到队伍中table.insert(team_members, member_data)-- 匹配到的队伍人数够了,退出组队if #team_members == TEAM_MEMBER_COUNT thenreturn trueelse-- 人数还没够,继续组队,从下一个节点开始local is_match = MakeTeam(member_node.next, team_members)-- is_match为false代表找不到下一个匹配的对象了if is_match == false thentable.remove(team_members, #team_members)endreturn is_matchendelse-- 继续遍历下去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 dolocal is_match = MakeTeam(member_node, team_members)if is_match then-- 匹配成功,team_members为队伍成员集合-- 执行组队操作-- 从匹配池中删除成员else-- 匹配失败endmember_node = member_node.nextend
end

注意:在遍历时我也使用递归,为什么不用担心递归太深造成栈溢出呢,这得益于lua的尾调用机制。

游戏中的匹配组队方法相关推荐

  1. 游戏中应用强化学习技术,目的就是要打败人类玩家?

    来源:AI前线 作者:凌敏 采访嘉宾:黄鸿波 2016 年,DeepMind 公司开发的 AlphaGo 4:1 大胜韩国著名棋手李世石,成为第一个战胜围棋世界冠军的人工智能机器人,一时风头无两.Al ...

  2. 游戏中常用的寻路算法(6):地图表示

    在本系列文档大部分内容中,我都假设A*用于某种网格上,其中的"节点"是一个个网格的位置,"边"是从某个网格位置出发的各个方向.然而,A*可用于任意图形,不仅仅是 ...

  3. 离散事件模拟在游戏中的应用

    离散事件模拟(discrete event simulation),这个东西可能在游戏领域用得并不是很多,它是模拟仿真领域的一个仿真模型,用来模拟在时间轴上一系列离散事件后,整个系统的变化情况,这么说 ...

  4. unity 角度限制_喵的Unity游戏开发之路 推球:游戏中的物理

    前言很多童鞋没有系统的Unity3D游戏开发基础,也不知道从何开始学.为此我们精选了一套国外优秀的Unity3D游戏开发教程,翻译整理后放送给大家,教您从零开始一步一步掌握Unity3D游戏开发. 本 ...

  5. 一行Java代码实现游戏中交换装备

    摘要:JDK 1.5 开始 JUC 包下提供的 Exchanger 类可用于两个线程之间交换信息. 本文分享自华为云社区<一行Java代码实现两玩家交换装备[并发编程]>,作者:陈皮的Ja ...

  6. 游戏对战匹配逻辑小结

    前言 近期接触了到了游戏后台的匹配逻辑,写此文作记录,也给后来者一些参考. 本文主要是对逻辑的一些整理,真正使用的时候还需根据实际场景来. 场景与需求 玩家去匹配战斗力与自己类似的其他玩家.如果在一定 ...

  7. 音视频开发必看:“秒变萝莉音”,游戏中的变声是如何实现的

    0.引 自从有了"变声",你永远猜不到隔着网线的另一边和你开黑的队友到底是男是女. 当然,天然会伪音的我们学不来,也没必要,这里主要跟大家分享一个一篇关于音视频开发中的变声实现的技 ...

  8. 如何在FPS游戏中快速实现简单的人体定位算法

    概述 最近在很多B站的视频上看到大佬们分享的AI应用案例,其中有一个引起了我的兴趣:基于深度学习网络, 在CSGO中实现人体定位算法,并进行自动瞄准与射击.当然,这种明显有悖于游戏公平性的行为我是不会 ...

  9. 游戏中的网络同步机制——Lockstep(转载)

    原文转自http://bindog.github.io/blog/2015/03/10/synchronization-in-multiplayer-networked-game-lockstep 0 ...

最新文章

  1. CV技术在医疗领域中有哪些应用?Salesforce、谷歌、斯坦福综述文章登上Nature子刊...
  2. Android 布局跟着NAVIGATION_BAR 重新布局
  3. ##API(七)————日期操作类(二)
  4. Linux centosVMware Apache 配置防盗链、访问控制Directory、访问控制FilesMatch
  5. python sql语句生成_python Django 生成sql语句
  6. Flutter的Chip标签组件
  7. Java(58):maven test 运行特定单元测试类
  8. GB 2312 编码
  9. JavaMail 发送邮件阻塞问题解决——设置 smtp 超时时间
  10. 向云再出发:如数据般飞驰的内蒙古
  11. 长沙南站启动脸部识别验证验票;奔驰和美国无人机物流公司公司合作用无人机配送商品...
  12. J2ME 2D小游戏入门之旅(五) 实现爆炸效果、并加入道具导弹(转)
  13. UI界面视觉设计之色彩要素
  14. 2021 合肥市信息学竞赛小学组
  15. 使用python计算贝尔宾团队角色测评结果
  16. 独家 | 利用深度学习来预测Spotify上的Hip-Hop 流行程度
  17. 使用dapper遇到的问题及解决方法
  18. 阿里云使用体验-阿里云开发者社区
  19. Sentinel-1 (哨兵1号)轨道数据下载网址跟(2022更新)
  20. 服务器勒索病毒 邮件,中勒索病毒了,不小心点了个邮件,文件全部加了后缀.npsk,怎么办...

热门文章

  1. 漏洞复现 泛微OA E-Cology V9 browser.jsp SQL注入漏洞
  2. mysql如何存储字符上下标_SQL Server如何存储特殊字符、上标、下标
  3. C实现 题目 1209: 密码截获
  4. java Calendar 计算宝宝的年龄 几年几月几天
  5. 微信小程序map 动态修改markers的解决方法
  6. C语言做一个图书管理系统源码,使用txt文件保存数据
  7. java动物类_Java创建动物类animal,以及其子类
  8. airpods二代降噪吗_传苹果明年将推两款无线耳机:AirPods Pro二代来了|airpods|续航|无线耳机|耳机|入门款...
  9. swagger2配置权限认证参数Authorize
  10. 全球首个AI宇宙模拟器发布!6亿光年宽度,还“自行”跑出了暗物质