精华更新时间2023/10/211981 浏览精品攻略
玩家关卡存活检测关详细攻略(附最简命令)!
存活检测作为异常里面最难的算法关之一,难倒了一大批人,甚至都没有攻略
[表情_狗头],所以我将用我的思路带来一份比较详细的攻略,希望能够帮助大家对这关有更深的认识。
首先过关条件并不难理解,剩几个机器人就去几号,而编译器里能用到的指令也很少,只有三个,可以说看上去“十分简单”了,但众所周知,给的条件越少算法就越复杂,这关就是个典型的例子(类似的还有余数关等)。
这关的难点就在于无法直接检测友军的数量,而是要通过信号来间接地进行判断,再加上开火时间的不确定,直接杜绝了用延时器的方式,因此,想要过关,就需要写出能够实时检测数量的代码。
那么,应该如何实现呢?首先,我们需要了解代码的运行机制,从上至下以及代码优先级想必大家都了解,不是很清楚的游戏内都说的很明白了,在此不多赘述。值得一提的是本关的代码执行顺序,假设从左至右的机器人编号依次为1-5,那么游戏就会依次运行1-5号的代码,也就是说前面的代码会影响后面。举个例子,1号设置信号1开,2号设置信号1关,那么在1-3号都存活的情况下,3号检测到的为信号1关,也就是被2号的关闭信号所影响了。这个特性对游戏的理解以及代码的编写很有帮助,可以说不明白这一点的人基本上没办法稳定解过这一关。
明白了这一机制,接下来要解决的就是数据通过信号的传输问题,在这一关里,显然,数据不是完全互通的,2个机器人间的信号传递会被夹在他们之间的机器人所影响,因此,尽量减少数据的传递,保留必要的数据可以大大简化代码编写难度以及代码量。
让我们从最简单的情况开始:仅剩一个机器人,那么显而易见,1-5号机器人都需要前往路点1的代码,那么条件该如何写呢?别急,让我们先分析完所有情况。
假设剩余2个,那么需要其中一个机器人前往路点2,因为程序从1-5运行,那么编号大的机器人就更容易获得更多数据,所以我们让大号前往路点,小号站立。值得注意的是,如果1号存活,那么必定有更大编号存活,因此1号并不需要前往路点2的命令。
接着分析剩余3个的情况,容易发现,只要有三个机器人的代码中包含了前往路点三的代码,那么剩余的机器人中就一定有至少一个机器人有这个代码,那么根据尽量让大号移动的原则,我们把这三条代码分别给3-5号即可。类比于2个存活的情况也可知,1、2号不需要前往路点3的代码,这验证了我们的想法。
分析了这么多,剩余4、5个的情况也就不需要深入地分析了,直接类比可以得出,4、5号需要前往路点4的代码,5号需要前往路点5的代码。
分析完这些,接下来就是算法的实现了,我们该如何实现小号站立,大号移动呢?其实原理很简单,我们只需要将信号1-5分别对应1-5号机器人,以最简单的1号为例:
第一行:如果 信号1开 则 前往路点1
第二行:如果 信号1关 则 信号1开
这是什么意思呢?先看第二行,可以理解为执行完1号的代码后信号1必然开启(1号存活时),当有比编号1大的机器人存活时,只要关闭信号1,就能实现程序再次执行到1号时,信号1为关,因此,只要有比编号1大的机器人存活时,第一行的条件就不成立,那么1号就会站在原地。
由此可见2-5号机器人均需要关闭信号1的代码以保证2-5号中任意机器人存活时,1号都不动。类比一下其他情况就能发现,2号机器人需要关闭信号1;3号机器人需要关闭信号1-2;4号机器人需要关闭信号1-3;5号机器人需要关闭信号1-4。每一个机器人都需要在自己对应编号没被关闭时才能移动,这样就保证了只有存活的最大编号机器人才能移动,也很大程度上减少了代码的复杂程度。
到了这里,我们的程序框架已经出来了,接下来要实现的是计数器以及实时检测。计数器比较好理解,用信号7、8、9做一个二进制计数器(7号为最低位,9号为最高位)从左至右每经过一个机器人计数+1,到存活的最大编号时完成计数并前往路点,再次回到存活的最小编号时清零并加1,也就是归1(注意:死亡的机器人代码不会被执行)。其中存活的机器人中编号不是最大的机器人无法获得完整的计数,这也是我们让非最大号机器人站立的原因。
现在,程序已经完成了大半,接下来是实时检测,也就是最小号计数器归1。那么重点来了:如何确定存活中的最小号。我们不难发现,如果某个编号的机器人死亡,那么对应的信号就不会再开启。我们以1、2号死亡,3号存活为例,当程序执行到3时,信号1-2均关闭,这说明3号为最小号,这时,在对应的条件中加上7开8关(计数1)就实现了最小号归1的效果。
在上述例子中虽然2号机器人中有关闭信号1的代码,但假设2号存活,信号2也会开启,那么就不满足1-2都关的条件,也就说明3号不是最小号,这验证了我们程序的严谨性。
讨论完程序的合理性,就可以为每一个机器人补充代码了,计数器并不难实现,若当前计数为3,那么说明前面存活数为3(不含自身),此时需要前往路点4并计数加1,若对应编号的信号被关闭则说明这不是最后一个,那么根据命令优先级就会执行站立命令(显然,此时5号前往路点5)。
分析完这些代码,我们不难想到,5号机器人并不需要站立命令,因为只要他存活那么必定是最大编号,这时信号1-4均被5号关闭,只有5号前往对应路点,不难发现,信号5没有被用到(我用在了其它地方,下面会讲)。
写到这,已经基本上大功告成了,接下来只需要处理一些小问题,程序就能完美地实现了。以3图的3号机器人为例,信号6的作用是防止计数归1后再次计数,有人可能会说把这句代码放到后面不就行了吗?我们只要仔细想一想就能明白这样做的问题,正常的计数加1的代码中关闭了前面的所有信号,这会直接影响归1的判断,因此用于防冲突的信号6是必要的。4图中的信号5也是同样效果。至于5号为什么不加这一条件是因为5号是最后一个,即便多加一次也不会影响(计数器并不影响归1)。
看到这里,相信你对这一关一定有了更深入的理解,那么还等什么,快去写代码!
[表情_狗头]
TapTap
TapTap
TapTap
TapTap
TapTap
TapTap
12
8
7