下载 App
精华修改于2023/10/212269 浏览精品攻略
玩家关卡存活检测关详细攻略(附最简命令)!
存活检测作为异常里面最难的算法关之一,难倒了一大批人,甚至都没有攻略
[表情_狗头],所以我将用我的思路带来一份比较详细的攻略,希望能够帮助大家对这关有更深的认识。
首先过关条件并不难理解,剩几个机器人就去几号,而编译器里能用到的指令也很少,只有三个,可以说看上去“十分简单”了,但众所周知,给的条件越少算法就越复杂,这关就是个典型的例子(类似的还有余数关等)。
这关的难点就在于无法直接检测友军的数量,而是要通过信号来间接地进行判断,再加上开火时间的不确定,直接杜绝了用延时器的方式,因此,想要过关,就需要写出能够实时检测数量的代码。
那么,应该如何实现呢?首先,我们需要了解代码的运行机制,从上至下以及代码优先级想必大家都了解,不是很清楚的游戏内都说的很明白了,在此不多赘述。值得一提的是本关的代码执行顺序,假设从左至右的机器人编号依次为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)。
看到这里,相信你对这一关一定有了更深入的理解,那么还等什么,快去写代码!
[表情_狗头]
官方关卡的精简、优化和竞速解截图
官方关卡的精简、优化和竞速解
本攻略是在(L)、(Q)的基础上整理优化而成。 精简:极稳定,行数少。 优化:极稳定,适用一般情况,无惯性指令。 竞速:较稳定,用时少(测5次取中位数)。 第八关 合作 精简 优化 竞速(L,12.501) 第九关 向导 精简(L) 优化 竞速(58.784) 无侦察() 第十关 狩猎 精简/竞速(L,16.534) 优化 第十一关 距离 精简(L) 优化 竞速(17.568左右) 第十二关 载体
精华
128 赞
8 回复
01:54
第28关 天赋 只要7行,刷关必备,省时省事。截图
第28关 天赋 只要7行,刷关必备,省时省事。
刷图必备,省时省事。 七行无伤稳定过。 主要是判断机器人的位置来确定行动指令。 附加过关视频:
9 赞
9 回复
【关卡更新!】异常的2021年,玩家关卡又更新了!截图
【关卡更新!】异常的2021年,玩家关卡又更新了!
自从2017年8月异常首个测试版跟大家见面以来,已经过了将近四个年头了。当初还是学生的玩家大佬们,现在有很多已经参加工作了吧。时间过得真快! 当异常的版本进入一个相对稳定的阶段后,本咕就开了新坑,开始了新的咕咕生活。但玩家大佬们时不时的贡献一些关卡,居然让异常还能保持一些活力。本以为早就会凉凉的异常,在2021年还是会偶尔触动某些玩家大佬们的灵感,从而诞生一些让人赞叹的创意关卡。 为了让这些宝藏不
官方
314 赞
81 回复
第12关和第14关极简步骤随机解法截图
第12关和第14关极简步骤随机解法
优雅永不过时!
2 赞
3 回复
01:26
异常:最好的编程入门书截图
异常:最好的编程入门书
好 难 啊 真的打不过 我不是计算机相关专业的,之前因为有需要自学了一点c和lua,但说实话还得是那种认真学了计算机,对算法和流程控制有点了解的玩起来能更轻松点。 游戏链接:https://www.taptap.com/app/59622
26 赞
3 回复
00:34
第10关卡老半天,终于稳定过了截图
第10关卡老半天,终于稳定过了
2 赞
4 回复
02:22
「将带你去另一个世界的绝佳创意游戏」物理或思维层面的送走你,花18元,就能成为程序员!截图
「将带你去另一个世界的绝佳创意游戏」物理或思维层面的送走你,花18元,就能成为程序员!
109 赞
65 回复
定位(24行)截图
定位(24行)
在正常的思路中,最简情况为6*6=36行。 详见我之前的攻略:https://www.taptap.cn/moment/548067507773115805?utm_medium=share&utm_source=copy&share_id=811FB8ACA045 但在这一关可以利用特性进一步简化代码。 本关只要经过了所有正确路点,就会立即判定成功,即使你的代码中机器人还要前往下个路点。当一个机
精华
9 赞
3 回复
IMO数竞之旅——玩家关:入侵截图
IMO数竞之旅——玩家关:入侵
本关的敌人在一个5*4的范围内分布,每一行最多只有一个敌人,每列刚好只有一个敌人,我们的目标就是在3次机会内穿过敌人的封锁,到达终点。 我们无法消灭敌人,碰到敌人会立刻死亡,由于无法事先知道敌人的位置,那么就需要根据死亡前走过的路经收集信息 这一关的突破口是每行最多只有一个敌人,那么如果我们能够绕到某一个敌人的身后,那么不就无敌了吗!我们来简化一下模型,看一下简单的情况: 1 A B C…… 2
精华
28 赞
3 回复
02:10
【买到就是赚到的游戏推荐】:这游戏太烧脑了吧,打完我快异常了截图
【买到就是赚到的游戏推荐】:这游戏太烧脑了吧,打完我快异常了
好难啊!!!我已经大脑过载了! 商店页面:https://www.taptap.com/app/59622
22 赞
1 回复