恶魔城机器人

这是什么


CastlevaniaBot是在Castlevania中播放的NES Nintaco模拟器的插件。 如果您在启动屏幕上运行它,该插件将从头到尾经历整个游戏。 或者,您可以在游戏中的任何位置运行它,以使其通过其中的一部分。


在本文中,我将告诉您如何创建能够传递恶魔城的机器人,以及如何为NES上的任何游戏创建类似的东西。



基于知识的结构


该项目未使用机器学习。 相反,开发可以称为“机器学习”。 我知道如何通过恶魔城。 困难在于将我的知识写到计算机程序中。 结果就是一个系统,该系统模拟了我手中拿着控制器执行的相同决策过程。 要创建它,必须清楚说明控制西蒙·贝尔蒙特(Simon Belmont)钻头世界的物理学的详细细节,以及经验丰富的吸血鬼猎人所需的所有战术。

CastlevaniaBot可以使用一系列策略来处理各种情况。 它们中的大多数旨在与特定类型的游戏对象一起使用。 例如,有一个骨架控制策略,另一个是针对鱼类的策略,用于打破蜡烛,采集心脏等。

CastlevaniaBot不断监视游戏状态,并在必要时在不同策略之间切换。 在决策过程中,将使用适应度函数,在屏幕上对所有游戏对象进行排名。 列表的顶部是主要目标,当它改变时,该机器人会改变其策略。 例如,当蝙蝠飞进架子时,CastlevaniaBot可能准备打蜡烛。 根据与蝙蝠的距离,CastlevaniaBot可能会做出反应,即从蜡烛策略切换为蝙蝠策略。 销毁蝙蝠后,他将继续使用蜡烛工作。

在决定转换之前,CastlevaniaBot会回顾其当前的目标和策略。 如果他没有成功,他可能会陷入一个无休止的循环,以相等或几乎相等的优先级在两个目标之间来回切换。 为避免这种情况,当出现一个新的主要目标时,该目标的优先级仅略高于当前目标,CastlevaniaBot可以决定继续执行当前策略。

当某些策略落入某个区域时,它们会自动启动。 通常,它们旨在同时处理多个游戏对象。 例如,在走廊上有一堆会飞的水母头,最好只是继续前进,而不要单独瞄准每个头。

某些策略可能会有所不同,具体取决于当前的辅助武器和收集到的内心数量,尤其是在上司战斗中。 CastlevaniaBot试图根据其拥有的工具和当前状况做出最佳决策。



规划8位世界


在进行此类项目时,我主要是试图简化任务。 我想像过如果没有敌人,蜡烛或物品需要收集时,恶魔城会是什么样子。 在这种情况下,所需要做的只是从关卡的开始到结束。 我想知道-如果我能教机器人该怎么做,一路上消灭几个敌人有多困难?

要教机器人如何移动,我需要平铺背景图并了解关卡的组织方式。 游戏包含六个级别,每个级别以一个老板结尾。


每个级别分为3或4个阶段。 舞台通常由木门隔开,木门在玩家的背后开有吱吱作响的声音。


门是控制点(检查点)。 如果玩家被杀死,那么他将回到阶段的开始,但前提是他尚未结束生命。 如果您在“游戏结束”之后继续游戏,则玩家将被带到关卡的最开始。

阶段号表示自游戏开始以来完成的检查点总数。 最后一个阶段是18号。但是,如果您杀死了德古拉,游戏将从困难模式的最开始开始,阶段数继续增加到19个甚至更多。 如果您经过困难模式,那么游戏的第三周期不会变得更加困难,但是阶段数仍会继续增加。


每个阶段都由一个或多个背景水平滚动条组成,我称之为“子步骤”。 如果沿着向上或向下的楼梯退出屏幕,则游戏将从一个子阶段移至另一子阶段,并且不会垂直滚动。


游戏使用3个字节来跟踪游戏周期号,阶段号和子阶段号。 正常模式(Normal Mode)下的游戏周期值为0; 大于或等于1的值表示“困难模式”。 不论游戏周期如何,这些步骤始终具有从0到18的编号。子步骤始终具有0或1的值,因为这些步骤永远不会包含超过2个水平条纹。 CastlevaniaBot跟踪这些字节以了解其位置。

为了方便起见,我将每个子阶段的背景条记录在一个单独的图形文件中。 如果需要找出对象的确切坐标,则可以使用图形编辑器快速找出它们。 我使用Nintaco内置的Map Maker工具记录了文件。 我打开了它,然后浏览了整个游戏。 一些生成的图像包含几个连接在一起的子步骤,这些子步骤很容易分解。

Nintaco的地图制作工具

检查背景图像后,我意识到唯一重要的瓷砖是平台和楼梯。 其他所有内容都可以视为空白空间。 楼梯有两种类型:向前或向后(它们可以表示为等腰三角形的左边缘和右边缘)。 有时,楼梯会以玩家可以在其上行走的平台结束。


只有5种重要类型的图块,并且在每个级别上它们都有不同的外观。 我将它们复制并粘贴到单独的16×16图像文件中。 然后,我编写了一个程序,将每个子步骤中的每个图块与相应的图像集进行比较。 因此,我得到了所有子步骤的图块的矩阵类型。

可以直接从ROM中提取矩阵,但是找不到关于如何以及在何处存储数据的文档。 由于ROM空间有限,因此级别数据通常以类似于矢量图形格式的压缩形式呈现。 每个游戏都使用自己的格式,因此我没有进行研究的必要,因为我拥有Map Maker。 另外,我仍然需要这些子步骤的图形图像。 如果没有捕获背景条纹,则必须编写一个从矩阵生成图像的程序。



寻路


创建矩阵之后,我想应用路径搜索算法,即Floyd-Warshall算法 ,该算法给出了输出表,其中包含有向图的带权重边的每对顶点之间的最短路径。 这个想法是预先计算表格并将它们写入文件,然后在游戏期间加载它们。 该机器人将表存储在内存中,可以搜索并立即找出任何两个平台图块之间的最短路径。

该图由边和顶点组成。 如果平台图块是顶点,则边缘仅是Simon可以执行的操作,以便从一个平台移动到另一个平台。 禁止仅在一个图块内执行操作。 例如,在从图块开始的平面上,Simon只能向左移动一个图块或向右移动一个图块。


同样,如果Simon在楼梯上,那么他可以在两个可能的方向之一上移动一个图块。


这些是有效的操作。 但是诸如从图块的中点移动到图块的边缘之类的动作过于零碎,因为它们不对应于从图形的一个顶点到另一顶点的过渡。

除了左右走动,下降和爬楼梯外,Simon还可跳至另一块瓷砖。 他可以从瓷砖表面的16个像素中的任意一个开始向左或向右跳转。 为了减少图形中的边数(以及查找表的大小),我只考虑了五个可能的排斥点:


添加操作“什么都不做”,我得到了15个操作。 所有这些操作都非常简单,因此机器人可以在游戏执行期间轻松确定执行它们所需的按钮按下的顺序。

为了构建完整的图形,我创建了一个非常简单的Simmon世界物理模拟。 在此仿真中,从每个平台图块开始执行所有15个操作。 该图是通过简单地观察Simon的位置来构建的。 更具体地说,当指定初始坐标和操作时,模拟将在输出中给出最终坐标。 例如,如果没有最终坐标,则当Simon尝试进入墙壁或孔中时,程序将返回该操作无效且该边不属于图形的部分。

要创建此模拟,需要对Simon Belmont进行深入研究。 与其他经典平台游戏(玩家可以从行走到跑步加速)不同,Simon在水平移动时,每帧始终精确移动1像素。 对于步行,跳跃,爬楼梯,甚至在攻击敌人时返回时都是如此。

限制水平速度会大大简化障碍的识别。 游戏检查角色前方一个像素中是否有墙,并在必要时停止移动。 该测试是在头部水平以下进行的,这可以使头部在不影响水平移动的情况下通过低矮的天花板。

垂直运动稍微复杂一些。 如果Simon离开平台边缘,而不是逐渐加速,他将立即以每帧8像素的速度掉落。 由于每个图块的高度为16像素(是8的倍数),因此简化了地面识别。 同时,播放器在跌倒之前获得的方向上保持每帧1像素的水平速度。

Simon的sprite宽度为16像素,但它可以从中点悬停在该块上方最多±4像素。 如果再移动一点,它将跌至下方。


有趣的是,如果他离开平台并以每帧1个水平像素和8个垂直像素的速度恰好落在1个图块上,那么他着陆时将不会完全站在该块上。 他的一只脚将留在墙内2像素深。


之后,他将能够退出隔离墙,但不能进入隔离墙。

西蒙在跳跃过程中无法改变方向。 按下按钮A之后,他沿着抛物线进行固定的移动。


在顶部,Simon上升了36个像素,这使他可以跳到2格高的平台上。 而且“抛物线”的顶部令人惊讶地平坦。 似乎它冻结了9个完整帧的空间,可能是为了简化空中的鞭打。 如果西蒙没什么可落地的,那么抛物线运动会一直持续到他回到原来的高度为止。 此后,它开始以每帧8像素的速度下降,也就是说,以相同的恒定速度从平台下降。

如果角色的头顶上方有平台,则不允许跳跃。


否则,他会部分“跳入”平台砖。


如前所述,如果Simon的触碰超过他的头顶,他将停止水平移动。 在第4级第一阶段结束时,这很烦人,此时玩家正试图离开洞穴。


楼梯使您可以在平台之间自由垂直移动。


在一种情况下,西蒙上楼梯,穿过平台砖。 在楼梯上,他可以自由穿过墙壁。


在4级移动平台上,玩家通常蹲在低垂的钟乳石下面。 但是,您可以站起来反对他们。 在这种情况下,游戏会限制水平移动,从而将Simon迅速拖入集水器中。


生成定向图的物理模拟器将Simon视为矩形。 该矩形的移动受到上述移动规则的限制。 为了使漫游器不会像兔子一样从一个地方跳到另一个地方,伯爵跳数的边缘被分配了比步行和沿着楼梯移动的边缘更高的成本。

路径搜索算法生成的表格包含每个开始和结束磁贴的最短距离(路径的总成本)以及路径第一步的说明。 此描述包括必须在此路径上执行的第一个操作,以及完成字符后将在其上运行的图块。 可以通过在表中重复搜索来重新创建整个路径,每个路径都朝着最终图块的方向进行下一步。

在某些子步骤中,这些列未完全连接。 例如,在第4级,平台是穿越深渊的唯一途径。 在这些子步骤中,该表包含用于在每个岛上移动但不在它们之间移动的方法。


一些可破坏的块包含隐藏的对象。 并且块的破坏改变了该图。 为了解决这个问题,将用于查找具有和不具有拆分块的路径的算法应用于子步骤。 在运行时,CastlevaniaBot监视要拆分的块的状态并使用适当的查找表。




游戏状态


CastlevaniaBot通过其API集成到Nintaco中。 它注册FrameListener的实现以在每个帧中接收返回。 由于仿真器以每秒约60帧的速度运行,因此该侦听器需要按时返回。 漫长的计算或停机时间将减慢或阻塞模拟器。 在短时间内,CastlevaniaBot会读取游戏的状态,确定其主要目标,并在目标改变后切换策略并实现当前策略。

CastlevaniaBot直接从处理器的RAM中读取Simon Belmont的当前状态。 但是我无法确定其他游戏对象如何在内存中表示。 因此,CastlevaniaBot直接从对象属性的内存(对象属性内存,OAM)中读取-该区域存储显示的精灵列表。


该技术有效并且通常适用于其他游戏,但是存在许多缺点。 OAM中子画面的顺序不断变化。 如果屏幕上同时存在多个相同类型敌人的实例,那么跟踪它们的唯一方法就是确定它们的接近度,将子画面的最后一个坐标与前一帧的坐标进行比较。


一些游戏对象包括重复的精灵,例如骨塔。


移动平台由一个精灵重复4次组成。


对这两种情况进行分类都需要附加的逻辑,该逻辑易于实现。 辅助武器升级和某些类型的辅助武器本身使用相同的精灵。 更糟的是,在5级时,骑士们借用了西蒙的次要武器精灵。


幸运的是,除了圣水之外,CastlevaniaBot仅使用通常无法进行升级的辅助武器,例如在老板战斗中。 而且圣水升级精灵与施放时使用的精灵不同。


一些游戏对象在创建过程中会闪烁,例如,boss战斗结束时的水晶球,死亡辫子和德古拉的尸体。 闪烁的精灵会从OAM中出现或消失,因此需要附加逻辑来跟踪这些对象。


还值得注意的是,由于硬件限制,NES每条光栅行只能显示8个精灵。 由于子画面的优先级部分取决于它们在OAM中的索引,因此将随机混合每一帧的顺序,以避免移动使一个子画面始终不可见。 几个精灵依次闪烁,逐渐更改其优先级。 此闪烁不会影响从OAM读取图片。 数据仍然保留在那里,但是模拟硬件不会显示它。 这与上述创建精灵时闪烁的情况不同。 此外,Nintaco还提供了可以大大减少硬件闪烁的选件。


最后,从PPU名称表中读取游戏状态的一小部分-包含所有背景数据的存储区。 这包括检查可破坏块并跟踪第2级“粉碎”的位置。




启发式状态机


策略是状态机。 CastlevaniaBot将它们定义为具有initstep方法的抽象类。 当CastlevaniaBot切换到适当的策略时,将调用init方法,从而允许状态机重置。 然后, step方法执行该策略。 例如,针对鱼类的step策略方法检查鱼类是否在鞭子的范围内,如果是,则机器人用鞭子击中。 否则,它会检查是否可以通过跳跃达到打击距离,如果可以,则机器人会跳跃。 最后,如果机器人离敌人太近,它就会远离它。 通过这些简单的规则,CastlevaniaBot击败了人类的鱼类。

为了尽可能简化编写策略,我创建了一个可能执行的动作的库。 例如,机器人没有按下并释放按钮A进行跳转,而只是从库中调用jump方法。 在此之前,他问图书馆西蒙是否在平台上并且可以跳跃。

接近目标并远离目标是使用路径搜索算法创建的表中的操作执行的标准动作。 例如,烛形策略使用库方法routeAndFace ,该方法不仅将Simon定向到某些指定的坐标,而且在将它们击中后向左或向右旋转。 另外,根据蜡烛的高度,该策略会在击打鞭子之前执行跳跃或下蹲动作。 从蜡烛掉落的物体会在空中产生,并会掉落或缓慢掉落到地面。 取货策略会在物品接触地面之前将Simon引导到他正下方最近的瓷砖。

为了远离敌人,图书馆需要知道如何向左或向右移动而不掉入坑中。 通常,这是通过搜索到子级左边缘或右边缘的路径来完成的。 但是在某些区域,最短的左边缘路径最初需要向右移动,反之亦然。 当出现此类问题时,我为子阶段专门添加了逻辑,将Simon引导到当前平台的左右边缘。



演练


在本节中,我将在整个演练中进行评论,详细描述CastlevaniaBot使用的策略。

游戏从城堡前的庭院开始。 框架中的对象被布置为选择主要目标,在这种情况下,主要目标是带有火焰的圆柱。 专栏策略会告诉漫游器接近专栏并在伸手可及的距离内使用鞭子。


敲打鞭子并销毁色谱柱后,将创建一个项目。 所有项目的优先级都高于火焰列的优先级。 因此,CastlevaniaBot使用一种策略来对此做出反应,该策略将收集出现在继续下一列之前的项目。

在对对象进行排名时,CastlevaniaBot始终考虑长期目标-在时间用完之前完成关卡。 创建潜在目标列表时,始终会向其添加下一个门。 门的优先级较低,但是在销毁所有列并收集所有对象之后,它将成为优先级。 除了一个例外:CastlevaniaBot知道如何发现所有隐藏的宝藏,并且跳过城堡的入口以创建一个眨眼的钱袋子。


进入城堡后,CastlevaniaBot看到鬼魂和蜡烛。 蜡烛和手工制作的物品优先,直到鬼魂靠近。


鞭子似乎经常摧毁敌人而不碰他们。 我在游戏的ROM中找到了一个碰撞矩形表,因此CastlevaniaBot可以准确知道什么时候在鞭子的范围内。 而且由于碰撞矩形通常会略微超出精灵的边界,因此鞭子会撞到“不可见的部分”。

在大多数情况下,销毁蜡烛时,CastlevaniaBot会垂直跳跃,而不是向前跳跃。 这是一种规避风险的策略。 由于处于空中,因此无法改变运动方向,一群接近的敌人会使安全着陆复杂化,甚至使其不可能。 另外,通过垂直跳跃,CastlevaniaBot会停留在同一块上。 他不需要检查跳跃是否会导致跌落在下平台或坑底。

当没有蜡烛要销毁或没有要收集的物体时,CastlevaniaBot开始追逐幽灵。 但是“黑豹战略”命令他站着不动,等待敌人落入鞭打的范围之内。


蜡烛不仅可以作为心脏和其他物体的来源,还可以引导玩家逐步穿越舞台。 例如,在下面的图像中,右上角的蜡烛“邀请”玩家爬楼梯。 但是,要爬上楼梯,玩家最初需要向左走,这就是蜡烛从屏幕上消失的原因。 由于CastlevaniaBot解决方案基于屏幕上可见对象的优先级,因此这种情况可能导致无休止的循环,其中机器人会交替选择到达蜡烛的最短路径(向左)或到出口门的最短路径(向右)。


类似的问题可以通过几种方式解决。 例如,CastlevaniaBot可以配备存储对象,即使对象不可见,也要知道它们仍然存在。 但是为此,从一开始它们都是一样的,需要加以观察。 如果蜡烛更靠右,那么在检测到蜡烛之后,有必要再往回走。

考虑到这一点,我添加了激励因素,促使CastlevaniaBot探索他通常会忽略的舞台区域。 这些激励措施与退出大门类似,将CastlevaniaBot吸引到需要的地方。 此外,我添加了一些规则,使他忽略蜡烛和距离太远的物体(就行进距离而言,不是直线)。

在爬楼梯并销毁蜡烛后,就产生了圣水-所有辅助武器中最有价值的。 CastlevaniaBot通过交换匕首来选择它。


与游戏开始时的钱袋一样,CastlevaniaBot知道所有带有隐藏对象的可破坏块,并使用鞭子破坏块,它使用的策略类似于蜡烛策略。


随着CastlevaniaBot的进一步移动,您会注意到它开始使用圣水来摧毁幽灵和蜡烛。 这似乎是多余的,但起着重要的作用。 恶魔城奖励使用双重和三重曝光辅助武器的玩家。 换句话说,CastlevaniaBot 磨碎了辅助武器的升级。


按下按钮B后,在打鞭子之前会有16帧的延迟。 鞭子将继续保持额外的10帧,但仅在这10帧中的第一个有效。 CastlevaniaBot利用这一事实来改善瞄准。 特别是,它假设主要目标将继续沿线性路径移动,从而跟踪帧中所有对象的速度。 然后,他在目标必须用鞭子碰到16帧之前按下按钮B。 在这16帧中,敌人总是可以改变方向,但是通常这种简单的启发式工作即可。

但是,穿过门后,CastlevaniaBot遇到了红色蝙蝠。 就像水母的头一样,红色的蝙蝠在屏幕上飞来飞去,穿过平台和楼梯穿过正弦曲线。 为了预测16帧后红色蝙蝠的位置,我在一张桌子上记录了其中之一的运动。 在游戏执行期间,CastlevaniaBot跟踪蝙蝠并等待轨迹的最高点或最低点,垂直速度会改变其符号。 然后,他可以将坐标与预先创建的表中的值进行比较。 这允许采取适当的策略用鞭子击打红色蝙蝠,弯腰或反弹。

在恶魔城(Passervania)的传球过程中,玩家会进行一些动作,使游戏尽可能地具有确定性。 例如,他们发现,如果在第1级末尾破坏方块并按一定的时间顺序进行武器升级,则上司将按照所需的模式行事,从而使他迅速击败。

不管经验丰富的人如何,他们都无法完全驯服随机数生成器。 尽管如此,由于CastlevaniaBot可以逐帧精确地控制按钮按下,因此每次通过游戏时都以完全相同的方式将速度传递的概念发挥到极致。 如果他做到了,那将比通过TAS更好。 因此,CastlevaniaBot使用外部随机数生成器任意添加错误和延迟,以防止其确定性的游戏玩法。 例如,当他用鞭子敲打一根高高的蜡烛时,他故意在跳跃和打击中增加了随机帧数的延迟。 这些微小的变化会极大地影响游戏的进度。

尽管CastlevaniaBot试图避免确定性,但他还是从Speedrunning中借鉴了一个概念: 损害赔偿 。 在50%的情况下,CastlevaniaBot跳回红色蝙蝠,将其扔到否则无法到达的平台上,从而完全避免了人类鱼类的地牢通道。


在另一半情况下,CastlevaniaBot选择与人类鱼类作斗争。 他们的火球具有较高的优先级,CastlevaniaBot会根据情况用鞭子,闪躲或弹跳击打他们。


由于制造敌人及其火球的不可预测性,大多数玩家通常会使用人类的鱼来奔跑。 但是,CastlevaniaBot花时间在它们上面,收集所有的心,甚至在最右边收集隐藏的宝藏。 该机器人确切地知道每个蜡烛中包含哪些物品,并且由于他更喜欢使用圣水,因此他跳过了隐藏有计时器的蜡烛。 但是,如果您停留在这一部分并与鱼群争斗,有时您不可避免地会拿起天文钟。

舞台通常以十字架结束,摧毁屏幕上的所有敌人。 万一您好奇,我会说十字架不会在关卡结束时杀死Boss。 实际上,有时甚至在老板打架时也会产生十字架。 例如,在与美杜莎的战斗中,杀死蛇时有时会出现十字架。 但是这些十字架只能杀死其他蛇。


穿过门后,恶魔城再次遇到了幽灵。 在下面的屏幕截图中,他想跳到较低的平台,但是幽灵阻止了他移动。 当通过路径搜索算法创建的表告诉CastlevaniaBot跳转时,它将检查目标平台周围的空间。 如果事实证明他降落在敌人身上,则不会执行跳跃。 在这种情况下,这种机制使CastlevaniaBot等待鬼魂释放它的位置。


该“跳前检查敌人”规则说明了CastlevaniaBot结构的原理之一:应遵循简单,尽可能通用的规则。 在游戏的某些部分,有必要使用一次性策略来解决非常具体的问题。 但是在大多数游戏中,机器人动作是由可重用的启发式驱动的。 我没有写一个让他停在那个特定地点并等待鬼魂挡开他们的队伍。 这种行为是启发式的结果。

CastlevaniaBot通过用三重圣水杀死幻影蝙蝠来完成关卡。 但是他的进攻策略是由他的辅助武器决定的。 实际上,如果他没有辅助武器,他准备用一根鞭子杀死老板。 一个特别有趣的案例是用斧头杀死了幻影蝙蝠。 与红色蝙蝠的情况类似,我在桌子上记录了斧头沿着抛物线的运动。 在游戏执行期间,CastlevaniaBot通过将其与每个地砖匹配来执行桌子偏移。 这使您可以计算出用斧头杀死BOSS的最佳点。


就在拿起水晶球之前,CastlevaniaBot会向不同方向投掷辅助武器,因为它会在接触到球后冻结在空中。 然后,他反复随机跳跃并用鞭子击打,希望冻结在一个奇怪的姿势中。


在第2级开始时,CastlevaniaBot避开了回旋镖隐藏的第一支蜡烛。 与骑士长矛手合作的策略是反对鬼魂或鱼人策略的运动,但这是第一个杀死需要两次命中的敌人。 黑色蝙蝠会打,直到靠近它为止,然后它起飞并线性移动,足以使用上述简单的试探法用鞭子杀死。


在50%的情况下,CastlevaniaBot破坏了墙的砖块,似乎离开了房间而没有抬起冠冕。 但是是这样吗? 实际上,在这种情况下,他利用游戏中的错误拿到了桂冠。 由于上梯子的末端与树冠的位置在水平方向上重合,因此玩家在屏幕上方和后面经过时会暂时下降。 如果您听声音或看眼镜,您会看到机器人实际上获得了表冠。


在等级2上,当玩家处于移动平台上时,敌人不会攻击玩家。 CastlevaniaBot只需等待平台接近,进入平台,等待其到达另一侧,然后下车。 另一方面,不接触图块的平台也略有不同。 在这种情况下,CastlevaniaBot不会下降,但会跳下平台。


一扇门通向充满飞扬头的走廊,CastlevaniaBot通过向前移动对此做出反应。 与移动平台一样,CastlevaniaBot知道需要根据其位置应用此策略,而不是对屏幕上的游戏对象进行优先排序。 但是,一旦海all的所有头部飞过,他就会切换回该技术以选择将被进一步使用的策略。


根据位置的不同,在爬下通往水母头满满的下一个梯子后,将触发另一种策略。 在50%的情况下,CastlevaniaBot故意跳到水母的头上以获得伤害加成,将其推到门旁的上层平台,通向下一阶段。 这是CastlevaniaBot知道的仅有的两种伤害提升方法。 与速度赛跑者不同,它不会执行以节省时间,这只是对段落不确定性的另一贡献。


通过暗恋是一种有趣的基于位置的策略,重复了三遍。CastlevaniaBot一直等到它左侧最接近的“粉碎”到达所需位置,然后运行通过它。经过它之后,他停下来,转身,用鞭子敲打蜡烛,捡起所创建的对象,并在随后的“粉碎”过程中重复该操作。其中一个物体可能是圣水,因此它总是会破坏这些蜡烛。


在“粉碎”之后,鬼魂和骨头塔首先出现。幽灵很容易瞄准,但是要杀死它们,你需要击中几下。瞄准骨塔更容易,因为它们不会移动。他们的火球和鱼人球使用相同的策略。


2级通常以CastlevaniaBot结尾,并用无尽的圣水立即杀死美杜莎。但是,他准备使用任何其他类型的辅助武器。


在第3级,出现跳线。CastlevaniaBot通过等待他们跳入鞭子的极限来对他们做出反应。如果跳线使运动员跳下,则CastlevaniaBot朝相反的方向移动并用鞭子击打他们,然后再接触地面。


然后出现白色骨架。它们具有非常随机的模式。另外,他们扔骨头。在3级,CastlevaniaBot尝试避免被击中。但是我发现,在随后的层次上,骨骼只会分散注意力,而忽略它们会更有效。CastlevaniaBot对白色骨骼的策略是简单地击败它们。


CastlevaniaBot等待乌鸦飞起来。然后,根据乌鸦相对于玩家的高度,他准确地计算出跳跃后何时用鞭子击打。


进入下一个阶段后,CastlevaniaBot独立击打计时码表出现的蜡烛,然后等待直到其消失。在屏幕的前方和后方有个乌鸦。该机器人会在乌鸦战斗前销毁蜡烛,以减少意外击中蜡烛并获得不需要的辅助武器的风​​险。


在木乃伊位置的正前方,CastlevaniaBot左转到平台上,以触发隐藏的钱袋子的出现。他这样做仅仅是出于兴趣,因为他无法以任何方式举起它。


接下来,CastlevaniaBot故意击中匕首掉落的蜡烛。像天文钟一样,他这样做是为了在随后的动作中不会偶然拿起它。


最后,木乃伊被圣水的雨打败。


CastlevaniaBot准备使用任何辅助武器与所有首领作战。实际上,如果由于某种原因摧毁了一块装有猪肉的块,使用辅助武器的策略就会完全改变。没有这个障碍,就不可能爬上较高的平台,这就是为什么您必须在较低级别上战斗。

在第4级,移动平台正在回归。这次,有机会在途中出现红色蝙蝠。为了减少攻击的可能性,他希望平台的到来与红色蝙蝠的毁灭相吻合。由于红色的老鼠以固定的间隔出现,因此,CastlevaniaBot有足够的时间在没有蝙蝠的情况下穿越水坑。他随时准备在平台上与蝙蝠和随机出现的鱼人打交道,但这使从平台上跳下来非常危险。CastlevaniaBot使用的策略增加了其成功的可能性。


在阶段的中间重复相同的策略。这次,跳转到移动平台的时间更长,因此在跳转之前销毁红色蝙蝠至关重要。


如上面的屏幕截图所示,蜡烛始终位于彼此相距64像素的位置。可能是由于以下事实的结果:水平数据以类似于矢量图形的格式显示在ROM中,从而节省了空间。但是由于某种原因,设计人员决定将蜡烛的位置与瓷砖的边缘而不是中心对齐。在这种情况下,蜡烛与平台的两端对齐。因此,在碰到它们之后,出现的物体可能会直接掉入它们下面的深渊中。

我认为设计师在某个阶段就意识到了这个问题。但是到那时,将整个系列的蜡烛移至所有完成的高度以使其与瓷砖中心对齐可能会引起其他问题。相反,他们决定将蜡烛随机移动到创建位置的右侧或左侧一个像素。因此,点击屏幕截图右侧的蜡烛后,其中包含的圣水有50%的机会会落在平台上。在剩下的一半情况下,它掉入水中。

CastlevaniaBot通常会完全避免使用这些蜡烛,因为它可以成功保存圣水。但是,如果他需要它,那么他会非常靠近这些蜡烛,以确保选择从中掉出的圣水。

下一个CastlevaniaBot遇到了一堆跳线。在该区域,杀死跳线后,经常会出现斧子。CastlevaniaBot避免使用它们,因为在与上司战斗时圣水特别有用。


当移动到关卡的最后一个阶段时,CastlevaniaBot完全忽略了骨龙。


但是他用快速的鞭打摆脱了接下来的两个。


科学怪人的怪物和伊戈尔被鞭子和圣水持续不断的击打摧毁。与其他老板一样,CastlevaniaBot也可以处理其他辅助武器,也可以完全不用。但是,没有圣水的生存机会就减少了。


在5级,CastlevaniaBot再次处理白色骨骼。但是这一次,他使用的策略变化在3级上很少见。根据其出现的位置,CastlevaniaBot抛出圣水,然后退后一步,将骨骼拉成火焰。在楼梯附近,他经过骨骼下面,将它们定向到应有的位置。


在第5级,重生的红色骨骼首先出现。CastlevaniaBot跟踪最后一次击中它们的时间,以便知道何时安全通过红色骨骼。


第14阶段的第一个房间由一个巨大的策略完全处理。 CastlevaniaBot首先杀死了跳投者。然后他等待下级骑士扔斧头,用鞭子击中斧头,然后慢慢爬下楼梯。这将下位骑士推到屏幕后方,导致他失踪。然后,他等到上部区域没有轴,击中蜡烛并收集出现的物体。然后他走近通往上层骑士的楼梯底部。当顶级骑士将斧头高高举起时,CastlevaniaBot追随他。这会将上层骑士推向左侧,几乎完全从屏幕上移开,但不会破坏它。 CastlevaniaBot在返回的斧头下方弯曲,并且可能在第二个废弃的斧头下方弯曲,然后最终走上楼梯进入下一个子阶段。万岁!


经过几个台阶后,CastlevaniaBot再次与斧头骑士见面。他用圣水使他昏迷,然后用鞭子使他完蛋。如果没有圣水,他会继续用鞭子殴打,追逐骑士直到死。


上移5级楼梯时,CastlevaniaBot通常必须等待红色骨架从楼梯的顶部或底部移开。在关卡接近尾声时,骨头塔使这项任务更加困难。根据骨骼决定移动的方式,CastlevaniaBot上下楼梯直到可以通过为止。


要处理红色骨骼组,需要附加逻辑,以使漫游器不会陷入无限循环。如果CastlevaniaBot会用鞭子分别击败他们,以便第一击有时间恢复,那么它将陷入一个循环,在那里它将继续摧毁无休止的复活骨骼。为避免这种情况,CastlevaniaBot不会用一堆站在红色骨头旁边的红色骷髅鞭打中。此规则使红色骨骼可以在仍然存活的红色骨骼旁边重生,从而可以同时击中它们。如果销毁之间没有间隔,则不会创建周期。


为了避免在导致死亡的长走廊中出现水母,机器人不会停止,使通常出现在路途中的骑士惊艳。他利用了这样一个事实,即玩家可以穿过被圣水击晕的敌人而不会受到伤害。


如果没有圣水,那么在CastlevaniaBot走廊的正前方可以乘坐飞旋镖。在成功的情况下,他用它摧毁了骑士,并获得了武器升级。


CastlevaniaBot在开始编织辫子之前先用圣水使死亡晕眩,然后迅速杀死她。他也可以用三重回旋镖击败死亡,但这通常需要进行几次尝试。


CastlevaniaBot在6级开始时通过桥梁的主要策略是继续前进。他从上方击打了一下大蝙蝠以使其昏迷,然后从下方出现的巨大蝙蝠弹起。此外,他还需要不时躲避蝙蝠扔出的火球,或用鞭子殴打它们。


不能保证通过桥梁。这完全取决于巨型蝙蝠的友好程度。

在接下来的子步骤中,CastlevaniaBot使用桥梁的计时表两次或更多次来查看鹰和跳线。没有计时器,他试图用鞭子走自己的路。


当CastlevaniaBot到达德古拉的塔楼时,它可以攀登和降下楼梯数次以再次产生蜡烛,这使您可以收集至少20颗心。


德古拉房间中最右边的蜡烛会给圣水,这是对抗德古拉第二种形式所必需的。

击败德古拉的第一种形式需要对头部进行16次打击。CastlevaniaBot数次接近德古拉,等待他用火球射击,然后跳过去,用鞭子击打德古拉的头。


该机器人的第二种形式的吸血鬼被称为Cookie Monster,被机器人用圣水击晕,并用鞭子多次击中头部。Cookie Monster有时不时跳向玩家,而CastlevaniaBot躲闪。Cookie Monster还会抛出火球,通常可以用圣水和鞭子将其摧毁。有时您可以升级武器。而且,双圣水会在持续的眩晕周期中抓住Cookie怪物,从而迅速取得胜利。


CastlevaniaBot无法通过“困难模式”,该模式在获得最终学分后开始。但是,在城堡庭院中重新启动游戏后,它将游戏周期字节重置为零,并将其切换到普通模式。这使得CastlevaniaBot可以无休止地比赛。




档案


CastlevaniaBot_2018-12-09.zip

该文件.zip包含:

  • src -源代码树。
  • CastlevaniaBot.jar — .
  • lgpl-2.1.txt — .



发射



  • Nintaco — NES.
  • Castlevania (U) (PRG1) [!].nes — ROM .


  1. Nintaco Castlevania (U) (PRG1) [!].nes .
  2. CastlevaniaBot.jar .zip .
  3. Run Program, Tools | Run Program...
  4. JAR , Find JAR....
  5. Load JAR, .
  6. Run.

Copyright © 2018 meatfighter.com

. / LGPLv2.1.

Source: https://habr.com/ru/post/zh-CN432784/


All Articles