先知兵圣兵棋大赛初赛思路

1. 战术思路

1.1 战场环境

整个战场地图比较大,但是比较关注的是两个目标点周围的地形,其它地方的影响不大。

1.2 行进方法

行军实现起来太过麻烦,目前只调用给出的机动接口。

1.3 进攻思路

目前的进攻思路较为简单。考虑到主要目标点的分值是80,次要目标点的是50,因此主要思路就是攻占主要目标点。

最开始所有的战车和坦克的目标点都是主要目标点,到达主要目标点周围时

  • 若主要目标点未被攻占,则派遣其中一个战车进行占领,另一个战车和坦克分布在周围的居民区内,战士下车。
  • 若主要目标点已经被攻占,坦克进行行进间射击,射击之后往后退。战车若能被观察到则下车,否则选择附近高地或居民区。
  • 之后若主要目标点空出则择机进行占领,否则消灭可见的敌方棋子。

2.代码结构

2.1 整体思路

和demo代码的框架类似,不断循环判断当前阶段是否还有动作要执行,若没有则等待进入下一阶段。
其中主要改动为:

  1. 将wgAI文件中的doAction代码分解为三个部分,分别为doMyMoveAction()对应我方机动环节,doMyFinalShootingHuanJieAction()对应我方最终射击环节,doOpMoveHuanJieAction()对应对方机动环节。
  2. doMyFinalShootingHuanJieAction()和doOpMoveHuanJieAction()两个部分思路比较简单,就是不断循环判断当前是否可以射击然后执行射击。
  3. doMyMoveAction()表示我方机动阶段的动作,此中又分为三个部分,分别是doTankMoveAction对应坦克机动阶段动作,doVehicleMoveAction对应战车机动阶段动作,doSoldierMoveAction对应战士机动阶段动作。
  4. 添加实现上述函数的辅助函数。

2.2 doSoldierMoveAction函数

战士在机动阶段的动作。
因为战士不能行进间射击,且移动两个及以上会疲劳。因此尽量避免移动战士。
实现思路为,若当前主要目标点被敌方占领,且没有我方棋子目标位置是它,且没有可见的敌方棋子,那么战士向其移动一格。

2.3 doVehicleMoveAction函数

战车在机动阶段的动作。

  • 首先当可见范围内没有敌方棋子,其中一个设定目标为主要目标点并移动,另一个设定目标为主要目标点附近的一个居民区。
  • 若到达设定的目标点则下车并停止移动。
  • 若到达目标点以前见到敌方棋子且距离较近时,停止移动并下车。
  • 之后若视线内没有敌方棋子且没有其它棋子的目标点是主要目标点,则往它移动。
  • 如果周围有需要帮忙的同格的己方棋子,移动到该棋子位置。

2.4 doTankMoveAction函数

坦克在机动阶段的动作。

  • 刚开始距离较远时,坦克直接设定目标点为主要目标点。
  • 主要目标点被敌方占领,且所有敌方棋子都不可见时,目标也为主要目标点。
  • 如果有可见的敌方棋子,选择最近的一个进行行进间射击。
  • 如果主要目标点被己方占领,且没有可见的敌方棋子,那么选择周围的居民区为目标位置。

2.4.1 doMoveShootAction(self,att_bop,obj_bop)函数

坦克对敌方某个棋子进行行进间射击,射击之后往后退。判断当前位置是否能够射击,如果可以直接射击之后后退,否则移动到该棋子周围6格中最近的没有敌方棋子的位置,射击之后后退。

2.4.2 genMoveShootTarget函数

选择行进间射击的目标棋子周围的一个合适位置,移动到该位置。在射击之前调用。

2.4.3 genMoveShootBackTarget函数

选择行进间射击之后的后退位置,射击之后调用。往远离当前目标敌方棋子的方向移动。

2.5 其它函数

2.5.1 wgAI中的doMove函数

根据self.dic_targets(新添加的)字典得到每个棋子的目标位置,key是每个棋子的Identity。调用common.getSpecifiedBopById函数得到。之后产生路径进行移动。每个棋子移动后都要刷新态势。

2.5.2 wgsdata中的mainCity和secondarCity函数

分别返回主要目标点和次要目标点的目标

2.5.3 common.getAroundPos(pos) 函数

返回某个位置周围的6个格子位置,用在得到行进间射击第一个目标位置的时候。

2.5.4 common.getAllBopByPos函数

得到某个位置上所有的列表中的棋子。

2.6 其它改动

2.6.1 禁止射击同格状态的敌方棋子

在判断是否能够射击的函数wgruler.shooting函数中多加了一个判断。

3.当前问题

3.1 是否能够最终射击的判断可能出错

3.2 坦克行进间射击的位置选择有点问题

3.3 可能依然会射击同格状态的敌方棋子

3.4 对射击函数的调用优点问题,可能重复调用

3.5 坦克行进间射击的动作顺序和设计的有点区别

3.6 控制接口的调用延迟较大,可能也是上一条问题的原因,状态刷新有时候有问题

4. 当前效果

目前使用红方胜率较大,使用蓝方,若不出逻辑上的bug也还行,但有时候会出现#3 中的问题,目前胜率还不高,继续调试中。

猜你喜欢

转载自blog.csdn.net/qq_25037903/article/details/83118837