> 编程
和移动评估、攻击连招管理一样,伤害地图也是 Leek Wars 中不可或缺的一大利器。 它的主要目的,是根据对手的情况评估每个格子的危险程度,以便在回合结束时退到危险更小的格子上。 最简单的做法是建一个关联数组:dangerMap=[ cell1:danger1 , cell2:danger2 , ... ],必要时只保留你能到达的格子。 为此,有好几种算法可以选择
想写一个危险评估算法时,一般最先想到的就是它。思路如下:
/* -对我每一个可到达的格子 -对每一个对手 -对该对手每一个可到达的格子 -对该对手的每一件武器 -如果他能从他所在的格子打到我这个格子 就给我这个格子加上一个“危险分数” */
分数怎么定,本身就是算法的一部分:可以简单地“+1”,也可以算出对方可能造成的伤害……细化这套评估的方法,有多少玩家就有多少种 😉
这个算法最大的问题,是它极其消耗操作数!所以通常很快就得着手优化。
第一件事,是别让你的韭葱“卡死”……所以要在代码的某处检查 getOperations(),一旦操作数太接近上限就跳出循环:这样你只会得到一份不完整的危险评估,但韭葱至少还动得了 😉
说到优化本身,首先要遵循的一条原则,是尽量避免在循环里把同样的运算重复做很多遍:这种情况下,最好先把结果准备到数组里,之后直接取用。举个例子,在计算“危险分数”的最内层循环里,如果你塞进一个 getStrength(enemy) 调用,这个函数就会被调用好几千次。正确的思路是在进入内层循环之前,把敌人的力量算一次并存进变量。光是这一步,你就能省下几十万次操作!所以要盯紧“内层”循环里那些不依赖本层循环变量、只依赖“外层”循环的部分:把它们提到对应的那层循环里去。
如果算法还是太贵,另一条相当漂亮的优化思路,是降低这套评估的分辨率。比如,不去测试所有可到达的格子(你自己的和/或对手的),而只测试那些所需移动点为偶数的格子。之后“只要”用相邻格子的数值插值,把留下的空洞补上就行(取邻居的平均值、取邻居的最大值、取两行之间平均值的最大值……)。这种做法精度稍差,但以偶数 MP 为例,消耗大约只有第一种算法的四分之一。
想把优化继续做下去,你就得考虑预先计算一些东西,一般放在第一回合:把那些需要反复计算、却又从不变化的内容存进一个大数组(或者很多个数组),甚至每回合更新其中的某些数值(在我们的例子里,就是敌方韭葱的力量)。
这种算法在战斗开始时只预先计算一次危险地图。它开销很小,精度也低得多,但能很快给出战斗地图上整体比较危险的区域。做法是在回合开始时,对战斗地图的每一个格子,找出敌人能用手上的武器从哪些格子打到它:一个只能从 5 个格子打到的格子,分数就会远低于一个能从 200 个格子打到的格子! 也许可以试着退守到“低危险”区域,同时把敌人留在“高危险”区域里。
Impossible de charger les données du jeu.
Vérifiez votre connexion et réessayez.