> LeekScript 教程
你正心满意足地敲着自己的 AI。代码一行行滚过,变量名……等等,这一段我们不是已经见过了吗? 这一次,编辑器里再也没有红色的提示,编译器对你来说已经毫无秘密可言。决斗时间到! 你观察着自然环境中的韭葱,活像菜园里的史蒂夫·欧文。它们四处闲逛,嬉戏打闹,互相扫射,看上去多么快乐!
它们丝毫没有察觉,暗处正潜伏着可怕的敌人……
啊——经典款!! 这不一定是 AI 写错了,而是超出了每回合的最大操作数(上限取决于你的 核心:每个核心 100 万次操作,可在代码中通过 getMaxOperations 查询)。想看详细讲解,去翻翻关于 操作数 的教程。
这种情况下,多半是某个 循环 没有停止条件,也就是所谓的无限循环。
来个小例子?下面这段代码的意思是:只要还有 行动点,就对敌人使用武器:
很简单吧?才不是!运行时冒出了一个错误: Basique, line 13 ▶ AI 中断:运行时错误:本回合执行的操作过多
问题到底出在哪……其实很简单:只要条件 getTP() > 0 成立,循环就会继续执行。 可是,当武器已经用不了的时候会发生什么呢? 那就不会再消耗 行动点!条件也就永远为真!于是这个循环会一直执行下去去去去去去去去(也就是执行很多很多次)。
要解决这种情况,可以接住 useWeapon 函数的返回值,再判断结果。
可能的修正:
重要的不是大小!
不读一遍你的 AI,我也很难替你改…… 不过还是可以列举几种可能:
lineOfSight 函数要花 15 次操作,把它塞进 3 层嵌套循环里,代价可就大了!getCellToUseWeapon 这类好东西可不能滥用!把耗费大的函数的结果存下来,或者自己重写一个,往往很有用。这次我可小心了,函数里的参数个数一个不差。没错,可是原生函数并不是什么参数都收的。 这些函数要求特定的输入类型。如果你用错误的参数去调用它们,就会得到类似这样的结果:
AI Basique, line 14 ▶ 未知函数:useWeapon(function) AI Basique, line 14 ▶ 未知函数:useWeapon(null)
这里 useWeapon 函数接受一个数字作为参数(一个 WEAPON_... 常量),我们却想塞给它一个函数,或者一个 null。生成器当然要冲我们发牢骚了。
AI Basique, line 11 ▶ 未知函数:sort(number, null) sort 的第一个参数应该是数组,我们却给了它一个数字。
AI Basique, line 8 ▶ 未知函数:getNearestEnemyTo(array) getNearestEnemyTo 的参数是一个实体 ID,而不是数组。
这个错误也可能是因为漏写了括号:
这里我们把 getNearestEnemy 这个函数本身存进了变量 enemy,而不是它的返回结果(见 函数详解)。 修正:var enemy = getNearestEnemy();
Impossible de charger les données du jeu.
Vérifiez votre connexion et réessayez.