部落冲突思路

出生点地图

  • GameStart消息中给出了初始地图。
  • 根据游戏规则,遍历每个栅格,判断其九宫格范围内(上下左右+1)的栅格是否有建筑物,如果有则当前栅格不能作为出生点。
  • 最终利用一个二维矩阵存放上述信息

出生点选取

  • 为了避免盲目地将所有士兵下到同一个位置,尽最大可能保留战斗力,制定了一套出生点的选取规则:
    • 以基地为中心,划分四个象限进行排序
    • 一级排序:每个象限如果存在可出生区域,则计算该象限内的防御方攻击力总和,并按照攻击力总和对象限进行升序排序。攻击力最弱的象限排在第一。
    • 二三级排序:每个象限内,选取离建筑物最近(避免靠近建筑物过程中受到的无谓伤害)、攻击力最弱的点(避免一开始就遭遇大量伤害,对地狱之塔特别有效)。
  • 不是每个象限都会有可用的出生点(例如基地在任意角落里,就只存在一个象限)。
  • 根据出生点的数量下发不同数量的部队。

敌方势力图

  • 势力图是防御建筑对我方形成的攻击力叠加在地图栅格上的状态
  • 概念与热力图类似
  • 势力图的利用:
    • 在出生点地图的基础上叠加对防御建筑攻击力的考虑,出生点选取在可选范围内攻击力最弱的地方。
    • 法师和胖子的走位配合(寻路)会考虑攻击力的影响,法师如果在收到伤害时会主动往攻击力较弱的地方撤退。
  • 为了避免部队乱跑,决赛时打了一个补丁:如果防御建筑物有攻击对象(说明胖子正在吸收伤害),则该建筑物的攻击力不纳入势力图统计。

寻路算法

  • 寻路采用经典的A*算法,但在实际使用过程中,根据地图上的不同元素,采用了加权的地图。
  • 加权的考虑:
    • 绕行容易让士兵们落入地图的陷阱,而直接粗暴地打墙会丧失一些突破“城墙口”的机会。
    • 墙对于寻路系统来说,可以视作一个权值很高的障碍,绕过墙所受到的伤害,很有可能大于原地摧毁墙后继续前进所受到的伤害。在绕和不绕之间如何取舍,就是靠权值。
    • 地形在破坏之前,大体上的行进路线是固定的。
  • 测试时发现不能以基地为直接目标,因为基地一旦被摧毁,所有士兵都在原地发呆。
  • 补丁策略:搜索一定范围内(例如9*9)的目标,基地优先,防御力高的建筑物优先。

兵种配置

  • 游戏规则中对于角色的设置较为复杂,短时间内无法从数值角度完整分析出最优的兵种配置。
  • 从攻击力、血量和兵种占比的角度,总体策略是“胖法流”,即胖子+法师的组合。
  • 由于一共有四种出生点策略,对应不同的出生点数量,都有不同的兵种组合:
    • 只有一个出生点时:30胖子+20法师
    • 有两个出生点时:每个出生点15胖子+12法师
    • 有三个出生点时:每个出生点10胖子+7法师
    • 有四个出生点时:每个出生点7胖子+6法师
  • 优点
    • 出生点分散,能有效提高部队存活时间,从而提高摧毁率。
    • 胖法流配置固定,在微操上能够更加有效地利用胖子吸收伤害,同时减少运算量,避免超时失误。
  • 缺点
    • 没有补兵策略,一次性下完所有士兵有可能全军覆没

防守策略

  • 防守策略主要是对于虚弱和冰冻两种魔法的释放条件的理解
  • 初赛时发现炸弹人如果把围墙破开了口,会造成战局形势的巨大改变。因此我们在虚弱魔法是针对炸弹人量身定做的。按照以下规则进行:
    • 确认当前这一轮的剩余虚弱魔法数量,如果还有,则遍历所有的进攻方士兵对象,如果有炸弹人在我方围墙1格范围内,并且能被我方防御建筑攻击到,则作为候选人。
    • 以候选人为中心点,在九宫格范围内计算人数总和,按照人数进行降序排序。
    • 按照排名逐个释放虚弱魔法。
  • 冰冻的释放逻辑是决赛时加入的,按照以下规则进行:
    • 确认当前这一轮的剩余冰冻魔法数量,如果还有,则遍历所有的进攻方士兵对象,如果有法师|皮卡|弓箭手这三种高攻击力或远程攻击兵种,并且他们处在攻击状态(有攻击目标),则作为候选人。
    • 以候选人为中心点,在九宫格范围内计算人数总和,按照人数进行降序排序。
    • 取第一个元素作为释放位置。如果还有剩余冰冻,则遍历排序后的候选人,如果它的九宫格范围内已有冰冻,则跳过。直到找到没有交叠的区域位置。
  • 决赛时由于大家很少用炸弹人,因此虚弱没有释放。而冰冻在决赛第三轮成功地保护了基地。
posted @ 2022-07-14 15:18  IcyYs  阅读(218)  评论(0编辑  收藏  举报