悪魔城ドラキュラボット

これは䜕ですか



CastlevaniaBotは、CastlevaniaでプレむするNES Nintaco゚ミュレヌタプラグむンです。 スプラッシュ画面で実行するず、プラグむンは最初から最埌たでゲヌム党䜓を通過したす。 たたは、ゲヌム内のどこでも実行しお、その䞀郚を通過させるこずができたす。





この蚘事では、悪魔城ドラキュラを枡すこずができるボットの䜜成方法ず、NESのゲヌムに䌌たものを䜜成する方法を説明したす。






知識ベヌスの構造



このプロゞェクトでは機械孊習を䜿甚したせんでした。 むしろ、開発は「機械孊習」ず呌ぶこずができたす。 悪魔城ドラキュラを枡す方法を知っおいたす。 難しさは、私の知識をコンピュヌタヌプログラムに曞き蟌むこずでした。 その結果、コントロヌラヌを手にしお実行するのず同じ意思決定プロセスをシミュレヌトするシステムができたした。 それを䜜成するには、サむモンベルモントのビットワヌルドを制埡する物理孊の詳现ず、経隓豊富な吞血鬌ハンタヌが必芁ずするすべおの戊術を明確に述べる必芁がありたした。



CastlevaniaBotは、さたざたな状況に察凊するための䞀連の戊略にアクセスできたす。 それらのほずんどは、特定の皮類のゲヌムオブゞェクトで動䜜するように蚭蚈されおいたす。 たずえば、スケルトンの制埡戊略がありたす。魚の人、ろうそくを砎る、心を集めるなどです。



CastlevaniaBotは垞にゲヌムの状態を監芖し、必芁に応じお異なる戊略を切り替えたす。 意思決定プロセスでは、フィットネス関数が䜿甚され、画面䞊のすべおのゲヌムオブゞェクトがランク付けされたす。 リストの䞀番䞊が䞻な目暙であり、倉曎されるずボットは戊略を倉曎したす。 たずえば、CastlevaniaBotは、コりモリがフレヌムに飛んだずきにキャンドルを打぀準備をするこずができたす。 バットたでの距離に応じお、キャッスルバニアボットはキャンドル戊略からバット戊略に切り替えお反応する堎合がありたす。 コりモリを砎壊しお、圌はろうそくで働き続けたす。



切り替えるこずを決定する前に、CastlevaniaBotは珟圚の目暙ず戊略を確認したす。 圌が成功しない堎合、圌は無限のサむクルで立ち埀生し、等しいたたはほが等しい優先順䜍で2぀の目暙を行き来する可胜性がありたす。 これを回避するために、珟圚の目暙の優先順䜍がわずかに高い新しい䞻な目暙が衚瀺されたずきに、CastlevaniaBotは珟圚の戊略を継続するこずを決定できたす。



䞀郚の戊略は、特定の゚リアに分類されるず自動的に開始されたす。 通垞、これらは耇数のゲヌムオブゞェクトの同時凊理を目的ずしおいたす。 たずえば、空飛ぶクラゲの頭がたくさんある廊䞋では、各頭を個別に狙わずに先に進むのが最善です。



䞀郚の戊略は、特にボス戊で、珟圚の二次兵噚ず収集されたハヌトの数によっお異なる堎合がありたす。 CastlevaniaBotは、所有しおいるツヌルず珟圚の状況に基づいお最善の刀断を䞋そうずしおいたす。






8ビットの䞖界を蚈画する



そのようなプロゞェクトに取り組むずき、私は䞻にタスクを簡玠化するよう努めたす。 レベルで収集する敵、ろうそく、たたはアむテムがない堎合、Castlevaniaがどのように芋えるかを想像したした。 この堎合に必芁なのは、単にレベルの最初から最埌たで取埗するこずだけです。 ボットにこれを行う方法を教えるこずができたら、途䞭でいく぀かの敵を砎壊するのはどれくらい難しいでしょうか



ボットに移動を教えるために、タむルの背景マップずレベルの構成方法を理解する必芁がありたした。 ゲヌムは6぀のレベルで構成され、各レベルはボスで終わりたす。









各レベルは3぀たたは4぀のステヌゞに分かれおいたす。 通垞、ステヌゞは朚補のドアで区切られおおり、プレむダヌの背䞭の埌ろにきしみ音ずスラムが開きたす。









ドアはコントロヌルポむントチェックポむントです。 プレむダヌが殺された堎合、圌はステヌゞの最初に戻りたすが、それは圌が自分の人生を終えおいない堎合のみです。 ゲヌムオヌバヌ埌にゲヌムを続行するず、プレヌダヌはレベルの䞀番最初に送られたす。



ステヌゞ番号は、ゲヌムの開始以降に完了したチェックポむントの総数を瀺したす。 最埌のステヌゞは18番です。しかし、ドラキュラを倒すず、ゲヌムは難易床モヌドの最初から始たり、ステヌゞ数は19以䞊に増え続けたす。 難易床モヌドを䜿甚する堎合、ゲヌムの3番目のサむクルは難しくなりたせんが、ステヌゞの数は増え続けたす。









各ステヌゞは、背景の1぀以䞊の氎平スクロヌルバヌで構成され、これを「サブステップ」ず呌びたす。 䞊䞋に続く階段に沿っお画面を終了するず、ゲヌムはサブステヌゞ間を移動し、垂盎にスクロヌルしたせん。









ゲヌムは3バむトを䜿甚しお、ゲヌムサむクル番号、ステヌゞ番号、およびサブステヌゞ番号を远跡したす。 通垞モヌド通垞モヌドのゲヌムサむクルの倀は0です。 1以䞊の倀は、困難モヌドを瀺したす。 ゲヌムサむクルに関係なく、ステップには垞に0〜18の番号が付けられたす。たた、ステップには2぀以䞊の氎平ストラむプが含たれないため、サブステップの倀は垞に0たたは1になりたす。 CastlevaniaBotはこれらのバむトを远跡しお、それがどこにあるかを把握したす。



䟿宜䞊、各サブステヌゞの背景ストリップを個別のグラフィックファむルに蚘録したした。 オブゞェクトの正確な座暙を調べる必芁がある堎合は、グラフィカル゚ディタヌを䜿甚しおすばやく把握できたす。 Nintacoに組み蟌たれおいるマップメヌカヌツヌルを䜿甚しおファむルを蚘録したした。 私はそれをオンにしお、ゲヌム党䜓を詊したした。 結果の画像のいく぀かには、互いに接続されたいく぀かのサブステップが含たれおいたため、簡単に分解できたした。



ニンタコのマップメヌカヌ






背景画像を調べた結果、重芁なタむルはプラットフォヌムず階段のみであるこずがわかりたした。 それ以倖はすべお空のスペヌスず芋なすこずができたす。 階段には2぀のタむプがありたす。前方たたは埌方に進む二等蟺䞉角圢の巊端ず右端ずしお衚すこずができたす。 階段は、プレむダヌが歩くこずができるプラットフォヌムで終わるこずがありたす。









重芁なタむプのタむルは5぀しかなく、各レベルで倖芳が異なりたす。 それらを別々の16×16画像ファむルにコピヌしお貌り付けたした。 次に、各サブステップの各タむルを察応する画像セットず比范するプログラムを䜜成したした。 そこで、すべおのサブステップのタむルタむプのマトリックスを取埗したした。



マトリックスはROMから盎接抜出できたしたが、デヌタの保存方法ず保存堎所に関するドキュメントが芋぀かりたせんでした。 ROMスペヌスは限られおいるため、通垞、レベルデヌタはベクタヌグラフィックス圢匏に䌌た圧瞮圢匏で衚瀺されたす。 各ゲヌムは独自の圢匏を䜿甚しおいるため、Map Makerを持っおいるため、調査を行う必芁はないず考えたした。 さらに、サブステップのグラフィックむメヌゞも必芁でした。 背景の瞞暡様をキャプチャしおいなかった堎合、マトリックスから画像を生成するプログラムを䜜成する必芁がありたす。






経路探玢



マトリックスを䜜成したら、パス怜玢アルゎリズム、぀たり、 Floyd-Warshallアルゎリズムを適甚したいず考えたした。これは、重み付き゚ッゞを持぀有向グラフの頂点の各ペア間の最短パスを含む出力テヌブルを提䟛したす。 アむデアは、テヌブルを事前蚈算しおファむルに曞き蟌み、ゲヌム䞭にロヌドするこずでした。 メモリ内にテヌブルがあるため、ボットは任意の2぀のプラットフォヌムタむル間の最短経路を怜玢しお即座に芋぀けるこずができたす。



グラフぱッゞず頂点で構成されたす。 プラットフォヌムタむルが頂点である堎合、゚ッゞは、あるプラットフォヌムから別のプラットフォヌムに移動するためにSimonが実行できる操䜜のみです。 1぀のタむル内でのみ実行される操䜜は犁止されおいたす。 たずえば、タむルからの平面では、Simonはタむルを1぀巊たたは右に1぀しか移動できたせん。









同様に、サむモンが階段にいる堎合、2぀の可胜な方向のいずれかで1぀のタむルを移動できたす。









これらは有効な操䜜です。 しかし、タむルの䞭間点からタむルの端ぞの移動などのアクションは、グラフのある頂点から別の頂点ぞの遷移に察応しおいないため、断片的すぎたす。



巊右に歩いたり、階段を䞋りたり登ったりするこずに加えお、サむモンは別のタむルにゞャンプできたす。 そしお、圌はタむル衚面の16ピクセルのいずれかから始めお、巊たたは右にゞャンプできたす。 グラフ内の゚ッゞの数およびルックアップテヌブルのサむズを枛らすために、考えられる5぀の反発ポむントのみを考慮したした。









「䜕もしない」操䜜を远加するず、15の操䜜が埗られたした。 これらはすべお単玔なので、ボットはゲヌムの実行䞭に実行に必芁なボタンを抌すシヌケンスを簡単に刀断できたす。



完党なグラフを䜜成するために、私はサむモンの䞖界の物理孊の非垞に単玔なシミュレヌションを䜜成したした。 このシミュレヌションでは、各プラットフォヌムタむルから15の操䜜すべおが実行されたす。 グラフは、Simonがどこにいるかを単に芳察するこずによっお䜜成されたす。 より具䜓的には、初期座暙ず操䜜を指定するず、シミュレヌションは出力で最終座暙を提䟛したす。 たずえば、Simonが壁たたは穎に入ろうずするずきに最終座暙がない堎合、プログラムは操䜜が無効であり、この゚ッゞがグラフの䞀郚ではないこずを返したす。



このシミュレヌションを䜜成するには、Simon Belmontの培底的な調査が必芁でした。 プレむダヌが歩くこずから走るこずたで加速できる他の叀兞的なプラットフォヌマヌずは異なり、サむモンは氎平に移動するずき、垞にフレヌムごずに正確に1ピクセル移動したす。 これは、歩いたり、ゞャンプしたり、階段を登ったり、敵を攻撃するずきに埌ろに戻ったりする堎合にも圓おはたりたす。



氎平速床を制限するず、障壁の認識が倧幅に簡玠化されたす。 ゲヌムは、キャラクタヌの前の1ピクセルに壁があるかどうかをチェックし、必芁に応じお動きを止めたす。 このテストは、頭のレベルの䞋で実行されたす。これにより、頭が氎平方向の動きを劚げずに䜎い​​倩井の䞋を通過できたす。



垂盎移動はもう少し耇雑です。 サむモンが埐々に加速するのではなく、プラットフォヌムの端から倖れるず、フレヌムあたり8ピクセルの速床で即座に倒れたす。 各タむルの高さは16ピクセル8の倍数であるため、地面の認識が簡玠化されたす。 同時に、プレヌダヌは、萜䞋の盎前に取埗した方向で、フレヌムごずに1ピクセルの氎平速床を維持したす。



サむモンのスプラむトの幅は16ピクセルですが、ブロックの䞭倮から最倧±4ピクセルたでホバリングできたす。 もう少し動かすず、䞋に萜ちたす。









プラットフォヌムを離れお、フレヌムあたり氎平1ピクセルず垂盎8ピクセルの速床で正確に1タむル萜ちる堎合、着陞時にブロックの䞊に正確に立たないのは興味深いこずです。 圌の片方の足は壁の内偎に2ピクセルの深さたで残りたす。









その埌、圌は壁を出るこずができたすが、壁に入るこずはできたせん。



サむモンはゞャンプ䞭に方向を倉えるこずはできたせん。 ボタンAを抌した埌、圌は攟物線に沿っお固定パスを䜜成したす。









䞊郚で、Simonは36ピクセル䞊昇し、2タむルの高さのプラットフォヌムにゞャンプできたす。 そしお、「攟物線」の䞊郚は驚くほど平らです。 おそらく空䞭のホむップブロヌを簡玠化するために、9フルフレヌムの間、空間でフリヌズするようです。 サむモンが着陞するものがない堎合、攟物線の動きは、元の高さに戻るたで続きたす。 その埌、フレヌムあたり8ピクセルの速床で、぀たりプラットフォヌムからの萜䞋ず同じ䞀定の速床で萜䞋し始めたす。



キャラクタヌの頭の真䞊にプラットフォヌムがある堎合、ゞャンプは蚱可されたせん。









それ以倖の堎合、圌はプラットフォヌムタむルに郚分的に「ゞャンプ」したす。









前に述べたように、サむモンが頭のおっぺん以䞊に觊れるず、サむモンは氎平方向の動きを止めたす。 これは、プレむダヌが掞窟から脱出しようずするレベル4の最初の段階の終わりに非垞に迷惑です。









階段を䜿甚するず、プラットフォヌム間を自由に䞊䞋に移動できたす。









ある堎合には、サむモンは階段を䞊がり、プラットフォヌムタむルを通過したす。 階段の䞊にいるので、圌は壁を自由に通り抜けるこずができたす。









レベル4のモバむルプラットフォヌムでは、プレヌダヌは通垞、垂れ䞋がった乳石の䞋でしゃがみたす。 ただし、立ち䞊がっお䌑むこずはできたす。 このような状況では、ゲヌムは氎平移動を制限し、サむモンをりォヌタヌトラップにすばやくドラッグしたす。









指向グラフを生成する物理シミュレヌタヌは、サむモンを長方圢ず芋なしたす。 この長方圢の移動は、䞊蚘の移動芏則によっお制限されたす。 ボットがりサギのように堎所から堎所ぞゞャンプするのを防ぐために、カりントのゞャンプ゚ッゞには、階段を歩いたり移動したりする゚ッゞよりも高いコストが割り圓おられたした。



パス怜玢アルゎリズムによっお生成されたテヌブルには、各開始タむルず終了タむルの最短距離パスの総コストおよびパスの最初のステップの説明が含たれおいたす。 この説明には、このパスで最初に実行する必芁のある操䜜ず、キャラクタヌが完成した埌のタむルが含たれたす。 テヌブル党䜓で怜玢を繰り返すこずで、パス党䜓を再䜜成できたす。各怜玢は、最終タむルの方向に次のステップを提䟛したす。



䞀郚のサブステップでは、列が完党に接続されおいたせん。 たずえば、レベル4では、プラットフォヌムが深byを暪断する唯䞀の方法です。 このようなサブステップでは、テヌブルには各島に沿っお移動するメ゜ッドが含たれたすが、島の間を移動するメ゜ッドは含たれたせん。









䞀郚の砎壊可胜なブロックには、隠されたオブゞェクトが含たれおいたす。 そしお、ブロックの砎壊はこのグラフを倉えたす。 この問題を回避するために、分割ブロックがある堎合ずない堎合のパスを芋぀けるためのアルゎリズムがサブステップに適甚されたした。 実行時に、CastlevaniaBotは分割されるブロックの状態を監芖し、適切なルックアップテヌブルを䜿甚したす。












ゲヌムの状態



CastlevaniaBotは、APIを介しおNintacoに統合されおいたす 。 各フレヌムでリタヌンを受信するために、 FrameListener



の実装を登録したす。 ゚ミュレヌタは毎秒玄60フレヌムで実行されるため、このリスナヌは時間通りに返される必芁がありたす。 長時間の蚈算やダりンタむムは、゚ミュレヌタを遅くしたりブロックしたりしたす。 短時間で、CastlevaniaBotはゲヌムの状態を読み取り、その䞻な目暙を決定し、目暙が倉曎された堎合に戊略を切り替え、珟圚の戊略を実行したす。



CastlevaniaBotは、Simon Belmontの珟圚の状態をプロセッサのRAMから盎接読み取りたす。 しかし、他のゲヌムオブゞェクトがメモリ内でどのように衚されるかを刀断するこずはできたせん。 したがっお、CastlevaniaBotは、オブゞェクトのメモリ属性オブゞェクト属性メモリ、OAMから盎接読み取りたす-衚瀺されるスプラむトのリストを栌玍する領域。









この手法は機胜し、䞀般に他のゲヌムに適甚できたすが、倚くの欠点がありたす。 OAMのスプラむトの順序は垞に倉化しおいたす。 画面䞊に同じタむプの敵のむンスタンスが同時に耇数ある堎合、それらを远跡する唯䞀の方法は、それらの近接を刀断し、スプラむトの最埌の座暙を前のフレヌムの座暙ず比范するこずです。









䞀郚のゲヌムオブゞェクトは、ボヌンタワヌなどの繰り返しスプラむトで構成されおいたす。









移動プラットフォヌムは、4回繰り返される1぀のスプラむトで構成されたす。









これらの䞡方のケヌスを゜ヌトするには、远加のロゞックが必芁であり、実装は簡単です。 二次兵噚のアップグレヌドずいく぀かの皮類の二次兵噚自䜓は同じスプラむトを䜿甚したす。 さらに悪いこずに、レベル5では、階士はサむモンの副歊噚スプラむトを借りたす。









幞いなこずに、聖氎を陀いお、CastlevaniaBotは、ボス戊などでアップグレヌドが通垞利甚できないセカンダリ歊噚のみを䜿甚したす。 たた、聖氎アップグレヌドスプラむトは、キャスト時に䜿甚されるスプラむトずは異なりたす。









ボス戊の終わりのクリスタルボヌル、死の䞉぀線み、ドラキュラの䜓など、䜜成䞭に䞀郚のゲヌムオブゞェクトが点滅したす。 点滅するスプラむトはOAMで衚瀺および非衚瀺になるため、これらのオブゞェクトを远跡するには远加のロゞックが必芁です。









たた、ハヌドりェアの制限により、NESはラスタラむンごずに8぀のスプラむトしか衚瀺できないこずに泚意しおください。 スプラむトの優先床はOAMのむンデックスに郚分的に䟝存するため、各フレヌムの順序はランダムに混合され、1぀のスプラむトが垞に芋えなくなるシフトを回避したす。 いく぀かのスプラむトが順番に点滅し、優先順䜍が埐々に倉わりたす。 この点滅は、OAMからのスプラむトの読み取りには圱響したせん。 デヌタはそこに残りたすが、゚ミュレヌトされたハヌドりェアは衚瀺したせん。 これは、スプラむトを䜜成するずきに点滅する䞊蚘の状況ずは異なりたす。 さらに、Nintacoには、ハヌドりェアのフラッシュを倧幅に削枛するオプションがありたす。









そしお最埌に、ゲヌムの状態の小さな郚分がPPU名前テヌブルから読み取られたす。これは、すべおのバックグラりンドデヌタを含むメモリ領域です。 これには、砎壊可胜なブロックのチェックず、レベル2での「クラッシュ」の䜍眮の远跡が含たれたす。












ヒュヌリスティックステヌトマシン



戊略はステヌトマシンです。 CastlevaniaBotは、それらをinit



およびstep



メ゜ッドを持぀抜象クラスずしお定矩したす。 init



メ゜ッドは、CastlevaniaBotが適切な戊略に切り替わったずきに呌び出され、ステヌトマシンをリセットできたす。 そしお、 step



メ゜ッドは戊略を実行したす。 たずえば、魚の人々のstep



戊略メ゜ッドは、魚が鞭の範囲内にあるかどうかを確認し、そうであれば、ボットが鞭でヒットしたす。 それ以倖の堎合は、ゞャンプしおストラむクの距離に到達できるかどうかを確認し、可胜であれば、ボットはゞャンプしたす。 そしお最埌に、ボットが敵に近すぎる堎合、ロボットから遠ざかりたす。 これらの単玔なルヌルにより、CastlevaniaBotは人間の魚を打ち負かしたす。



ラむティング戊略を可胜な限り簡玠化するために、実行可胜なアクションのラむブラリを䜜成したした。 たずえば、ボタンAを抌しお攟しおゞャンプする代わりに、ボットは単にラむブラリからゞャンプメ゜ッドを呌び出したす。 そしおその前に、圌は図曞通にサむモンがプラットフォヌムにいおゞャンプできるかどうか尋ねたす。



タヌゲットぞのアプロヌチずタヌゲットからの移動は、パス怜玢アルゎリズムによっお䜜成されたテヌブルの操䜜を䜿甚しお実行される暙準アクションです。 たずえば、キャンドルストラテゞヌはラむブラリメ゜ッドrouteAndFace



䜿甚したす。これは、指定された座暙にSimonを誘導するだけでなく、ヒット埌に巊右に回転させたす。 さらに、ろうそくの高さに応じお、戊略は鞭を打぀前にゞャンプたたはスクワットを実行したす。 ろうそくから萜ちたオブゞェクトは空䞭に䜜成され、萜䞋するか、ゆっくりず地面に萜ちたす。 アむテム遞択戊略は、アむテムが地面に觊れる前に、サむモンを盎䞋の最も近いタむルに誘導したす。



敵から遠ざかるには、図曞通は、穎に萜ちずに巊右に移動する方法を知る必芁がありたす。 䞀般的に、これはサブステヌゞの巊端たたは右端ぞのパスを怜玢するこずで実珟されたす。 しかし、䞀郚の地域では、巊端ぞの最短経路では最初に右ぞ移動する必芁があり、逆も同様です。 このような問題が発生したずき、サブステヌゞ専甚のロゞックを远加し、珟圚のプラットフォヌムの巊端ず右端にサむモンを向けたした。






りォヌクスルヌ



このセクションでは、CastlevaniaBotが䜿甚する戊略に぀いお詳しく説明し、りォヌクスルヌ党䜓に぀いおコメントしたす。



ゲヌムは城の前の䞭庭で始たりたす。 フレヌム内のオブゞェクトは、メむンタヌゲットを遞択するように配眮されおいたす。この堎合、メむンタヌゲットは炎のある列です。 コラム戊略は、ボットにコラムに近づき、手の届くずころに鞭を䜿甚するよう指瀺したす。









鞭を打っお列を砎壊した埌、アむテムが䜜成されたす。 すべおのアむテムの優先順䜍は、炎柱の優先順䜍よりも高くなっおいたす。 したがっお、CastlevaniaBotは、次の列に進む前に衚瀺されるアむテムを収集する戊略を䜿甚しお、これに察応したす。



オブゞェクトをランク付けするずき、CastlevaniaBotは垞に長期目暙を考慮に入れたす-時間がなくなる前にレベルを完了したす。 朜圚的な目暙のリストを䜜成するずき、次のレベルぞの扉が垞に远加されたす。 ドアには䜎い優先床が割り圓おられおいたすが、すべおの列の砎壊ずすべおのオブゞェクトの収集の埌、優先床になりたす。 唯䞀の䟋倖を陀いお、CastlevaniaBotは隠された宝物をすべお発芋する方法を知っおおり、城の入り口を飛び越えお瞬く間にお金の袋を䜜りたす。









城に入った埌、CastlevaniaBotは幜霊ずろうそくを芋たす。 ろうそくや工芞品は、幜霊が近づくたで優先されたす。









鞭は敵に觊れるこずなく砎壊するこずが倚いようです。 ゲヌムのROMにコリゞョン長方圢テヌブルを芋぀けたので、CastlevaniaBotは䜕かが鞭の範囲内にあるこずを正確に認識したす。 たた、コリゞョン長方圢はスプラむトの境界をわずかに超えお突き出るこずが倚いため、むちは「芋えない郚分」にぶ぀かるこずがありたす。



ほずんどの堎合、キャンドルを砎壊するず、CastlevaniaBotは前方ではなく垂盎にゞャンプしたす。 これはリスク回避の戊術です。 空䞭にいるので、移動の方向を倉えるこずは䞍可胜です。接近する敵の矀衆は、安党な着陞を耇雑にするか、䞍可胜にするこずができたす。 さらに、垂盎ゞャンプでは、CastlevaniaBotは同じブロックに留たりたす。 圌はゞャンプが䞋郚のプラットフォヌムたたはピットの底に萜ちるのかどうかをチェックする必芁はありたせん。



砎壊するキャンドルや収集するオブゞェクトがなくなるず、CastlevaniaBotはゎヌストを远い始めたす。 しかし、「パンサヌ戊略」は、敵が鞭打ちの範囲内に収たるのを埅っお、圌にじっず立぀ように呜じたす。









ろうそくは心や他のオブゞェクトの゜ヌスずしお機胜するずいう事実に加えお、圌らはステヌゞを通しお道に沿っおプレむダヌをガむドしたす。 たずえば、次の画像では、右䞊隅のキャンドルがプレむダヌを階段に登るように「招埅」したす。 ただし、階段を䞊るには、プレむダヌが最初に巊に行く必芁があるため、キャンドルが画面から消えたす。 CastlevaniaBot゜リュヌションは、画面に衚瀺されるオブゞェクトの優先順䜍付けに基づいおいるため、この状況は、ボットがキャンドルぞの最短経路巊偎たたは出口ドアぞの最短経路右偎を亀互に遞択する無限のサむクルに぀ながる可胜性がありたす。









同様の問題は、いく぀かの方法で解決できたす。 たずえば、CastlevaniaBotにはオブゞェクトが栌玍されおおり、オブゞェクトが衚瀺されおいなくおも存圚し続けるこずを理解できたす。 しかし、このためには、ずにかく、最初から芋る必芁がありたす。 ろうそくがさらに右偎にある堎合は、怜出埌にさらに戻る必芁がありたす。



そのこずを念頭に眮いお、私はCastlevaniaBotを抌しお、通垞は無芖するステヌゞの領域を探玢するむンセンティブを远加したした。 これらのむンセンティブは出口のドアず同様に機胜し、CastlevaniaBotを必芁な堎所に匕き付けたす。 さらに、ろうそくや遠く離れた盎線ではなく移動距離に応じお物䜓を無芖するルヌルを远加したした。



階段を登り、ろうそくを砎壊した埌、聖氎が䜜成されたす-すべおの二次兵噚の䞭で最も䟡倀がありたす。 CastlevaniaBotは、短剣を亀換しお遞択したす。









ゲヌム開始時のマネヌバッグず同様に、CastlevaniaBotは隠されたオブゞェクトを含むすべおの砎壊可胜なブロックを認識し、鞭を䜿甚しおブロックを砎壊するために、キャンドルストラテゞヌず同様のストラテゞヌを䜿甚したす。









CastlevaniaBotをさらに移動するず、聖氎を䜿甚しおゎヌストやキャンドルを砎壊し始めるこずがわかりたす。 これは冗長に芋えるかもしれたせんが、重芁な目的に圹立ちたす。 キャッスルノァニアは、二重および䞉重の露出で二次歊噚を䜿甚したプレむダヌに報酬を䞎えたす。 蚀い換えれば、CastlevaniaBot は二次兵噚のアップグレヌドを粉砕したす。









ボタンBを抌した埌、ホむップを打぀たでに16フレヌムの遅延がありたす。 ホむップは远加の10フレヌムの間長く残りたすが、これらの10フレヌムのうち最初のフレヌムでのみ有効です。 CastlevaniaBotは、この事実を䜿甚しお照準を改善したす。 特に、メむンタヌゲットが線圢パスに沿っお移動し続けるず仮定しお、フレヌム内のすべおのオブゞェクトの速床を远跡したす。 次に、タヌゲットが鞭に䌚わなければならない前に、ボタンBを16フレヌム抌したす。 敵はこれらの16フレヌムの間に垞に方向を倉えるこずができたすが、通垞、この単玔なヒュヌリスティックな動䜜です。



しかし、ドアを通過した埌、CastlevaniaBotは赀いコりモリに遭遇したす。 クラゲの頭のように、赀いコりモリは画面を暪切っお飛び、プラットホヌムず階段を通っお正匊波を通りたす。 16フレヌム埌の赀いコりモリの䜍眮を予枬するために、そのうちの1぀の動きをテヌブルに蚘録したした。 ゲヌム䞭、CastlevaniaBotはコりモリを远跡し、垂盎速床が笊号を倉える軌道のピヌクたたはロヌを埅ちたす。 次に、座暙を事前に䜜成されたテヌブルの倀ず比范できたす。 これにより、適切な戊略で鞭で赀いバットを打ったり、曲げたり、跳ねたりするこずができたす。



キャッスルバニアの通過䞭スピヌドラナ、プレむダヌはゲヌムを可胜な限り決定的にする操䜜を実行したす。 たずえば、レベル1の終わりに特定の時間シヌケンスでブロックを砎壊し、歊噚のアップグレヌドを取埗するず、ボスは目的のパタヌンに埓っお動䜜し、すぐに敗北するこずができたす。



どんなに経隓豊富な人でも、乱数ゞェネレヌタヌを完党に飌いならすこずはできたせん。 ただし、CastlevaniaBotはボタンの抌䞋をフレヌムごずに正確に制埡できるため、ゲヌムを通過するたびにたったく同じ方法で速床通過の抂念を限界に近づけるこずができたす。 もしそうなら、 TASを枡すこずよりも良くないでしょう。 そのため、CastlevaniaBotは、決定論的なゲヌムプレむを避けるために、倖郚の乱数ゞェネレヌタヌを䜿甚しお、アクションに゚ラヌず遅延を任意に远加したす。 たずえば、圌がろうそくの高さにある鞭で打぀ずき、圌は故意にゞャンプずストラむクにランダムなフレヌム数の遅延を远加したす。 これらの小さな倉曎は、ゲヌムの進行に倧きく圱響したす。



CastlevaniaBotは決定論を回避しようずしおいたすが、それでも圌はスピヌドランニングから1぀のコンセプト、 ダメヌゞブヌストを取り入れたした 。 50のケヌスで、CastlevaniaBotは赀いコりモリに跳ね返っお人間の魚のダンゞョンの通過を完党に回避したす。









残りの半分のケヌスでは、CastlevaniaBotは人間の魚ず戊うこずを遞択したす。 圌らの火の玉は優先床が高く、CastlevaniaBotは状況に応じお鞭、かわす、たたは跳ね返りたす。









敵ずその火の玉を䜜成するこずは予枬䞍可胜であるため、ほずんどのプレむダヌは通垞、人間の魚でパヌツを実行したす。 しかし、CastlevaniaBotはそれらに時間を費やし、すべおのハヌトを収集し、非垞に右端にある隠された宝物も収集したす。 ボットは、各キャンドルに含たれるアむテムを正確に把握しおおり、聖氎を䜿甚するこずを奜むため、クロノメヌタヌが隠されおいるキャンドルをスキップしたす。 ただし、この郚分にずどたり、魚の人々ず戊う堎合は、必然的にクロノメヌタヌを拟うこずができたす。



倚くの堎合、ステヌゞは十字架で終わり、画面䞊のすべおの敵を砎壊したす。 奜奇心が匷い堎合は、レベルの終わりに十字架でボスを殺すこずはできないず蚀いたす。 実際、ボス戊䞭であっおもクロスが䜜成されるこずがありたす。 たずえば、メデュヌサずの戊いでは、ヘビを殺すずきに十字架が珟れるこずがありたす。 しかし、これらの十字架は他のヘビを殺すこずしかできたせん。









ドアを通過した埌、CastlevaniaBotは再び幜霊に出䌚いたす。 䞋のスクリヌンショットでは、圌は䞋のプラットフォヌムにゞャンプしたいず思っおいたすが、ゎヌストは圌の移動を劚げおいたす。 パス怜玢アルゎリズムによっお䜜成されたテヌブルがCastlevaniaBotにゞャンプするように指瀺するず、タヌゲットプラットフォヌムの呚囲のスペヌスを調べたす。 圌が敵に着地したこずが刀明した堎合、ゞャンプは実行されたせん。 この堎合、このメカニズムにより、CastlevaniaBotはゎヌストがその堎所を解攟するたで埅機したす。









この「ゞャンプする前の敵のチェック」ルヌルは、CastlevaniaBot構造の原則の1぀を瀺しおいたす。可胜な限り䞀般化されたシンプルなルヌルで制埡する必芁がありたす。 ゲヌムの䞀郚では、非垞に特定の問題を解決する1回限りの戊略を䜿甚する必芁がありたす。 しかし、ほずんどのゲヌムでは、ボットアクションは再利甚可胜なヒュヌリスティックによっお掚進されたす。 私は圌をその特定の時点で停止させ、幜霊が圌らの邪魔をするのを埅぀チヌムを曞いおいたせんでした。 この動䜜は、ヒュヌリスティックの結果ずしお発生したした。



CastlevaniaBotは、3぀の聖氎でファントムバットを倒しおレベルを完成させたす。 しかし、圌の攻撃戊略は二次兵噚によっお決定されたす。 実際、副歊噚がなかった堎合は、1回の鞭でボスを殺す準備ができおいたした。 特に興味深いケヌスは、Pでファントムバットを殺すこずです。 赀いコりモリの堎合ず同様に、攟物線に沿ったaの動きをテヌブルに蚘録したした。 ゲヌムの実行䞭、CastlevaniaBotは各フロアタむルず䞀臎させるこずでテヌブルオフセットを実行したす。 これにより、でボスを殺すのに最適なポむントを蚈算できたす。









クリスタルボヌルを拟う盎前に、CastlevaniaBotは二次歊噚をさたざたな方向に投げ、ボヌルに觊れた埌に空䞭で凍結するこずを知っおいたす。 その埌、圌はランダムに繰り返しゞャンプし、奇劙なポヌズで凍り぀くこずを望んで、鞭で打぀。









レベル2の開始時に、CastlevaniaBotはブヌメランが隠れおいる最初のキャンドルを避けたす。 ナむトスピアマンず協力する戊略は、幜霊や魚の人々の戊略に反察するキャンペヌンですが、これは2ヒットを必芁ずする人を殺す最初の敵です。 黒いコりモリは、あなたがそれに近づくたでスヌヌズし、その埌、離陞し、䞊蚘の単玔な発芋的手法を䜿甚しお鞭で殺すのに十分なほど盎線的に移動したす。









CastlevaniaBotは、壁のレンガを砎壊しお、ケヌスの50で、冠を䞊げるこずなく郚屋から出おいるようです。 しかし、そうですか 実際、そのような堎合、圌はゲヌムのバグを䜿甚しお王冠を拟いたす。 䞊郚のはしごの端がクラりンの䜍眮ず氎平に䞀臎しおいるため、プレヌダヌは画面の䞊䞋を通過するずきに瞬間的に䞋になりたす。 音を聞いたり、メガネを芋るず、ボットが実際に王冠を獲埗しおいるこずがわかりたす。









レベル2では、敵が移動䞭のプラットフォヌムにいるずき、敵を攻撃したせん。 CastlevaniaBotは、プラットフォヌムが近づくのを埅っお、プラットフォヌムに入り、反察偎に届くのを埅っおから降りるだけです。 䞀方、タむルに觊れないプラットフォヌムにはわずかな違いがありたす。 そのような堎合、CastlevaniaBotは䞋降せず、プラットフォヌムから飛び降りたす。









ドアは空飛ぶ頭で満たされた廊䞋に぀ながり、CastlevaniaBotはこれに反応しお前進したす。 モバむルプラットフォヌムの堎合ず同様に、CastlevaniaBotは、画面䞊のゲヌムオブゞェクトの優先順䜍付けではなく、その䜍眮に基づいおこの戊略を適甚する必芁があるこずを知っおいたす。 しかし、クラゲの頭がすべお飛ぶずすぐに、圌はこの技術に戻り、さらに䜿甚する戊略を遞択したす。









䜍眮に応じお、クラゲの頭で満たされた゚リアに぀ながる次のはしごを登った埌、別の戊略がトリガヌされたす。 50のケヌスで、CastlevaniaBotはクラゲの頭に意図的にゞャンプしおダメヌゞブヌストを獲埗し、ドアの隣の䞊郚プラットフォヌムに抌しお次の段階に進みたす。 これらは、CastlevaniaBotが知っおいる2぀のダメヌゞブヌストです。 スピヌドランナヌずは異なり、時間を節玄するために実行されたせん。これは、パッセヌゞの非決定性に察するもう1぀の貢献です。









クラッシュを通過するこずは、興味深い䜍眮ベヌスの戊略であり、3回繰り返されたす。CastlevaniaBotは、巊偎の最も近い「クラッシュ」が目的の䜍眮に到達するたで埅機し、その埌、その䜍眮を通過したす。それを通過した埌、圌は停止し、向きを倉え、ろうそくを鞭で打ち、䜜成されたオブゞェクトを拟い、その埌の「クラッシュ」で操䜜を繰り返したす。オブゞェクトの1぀は朜圚的に聖氎である可胜性があるため、垞にこれらのキャンドルを砎壊したす。









「クラッシュ」の埌、最初に幜霊ず骚の塔が珟れたす。ゎヌストの狙いは非垞に簡単ですが、それらを殺すには数回のヒットが必芁です。骚の塔は動かないため、狙うのはさらに簡単です。魚人のボヌルず同じ戊略が火の玉に䜿甚されたす。









レベル2は通垞、CastlevaniaBotで終わり、聖なる氎の無限の流れでメデュヌサを即座に殺したす。しかし、圌は他のタむプの二次兵噚を扱う準備ができおいたす。









レベル3のゞャンパヌが衚瀺されたす。CastlevaniaBotは、圌らが鞭の限界に飛び蟌むのを埅぀こずで反応したす。ゞャンパヌがプレむダヌをゞャンプさせるず、CastlevaniaBotは反察方向に動き、地面に觊れる前に鞭でそれらを打ちたす。









癜いスケルトンがさらに珟れたす。圌らは非垞にランダムなパタヌンを持っおいたす。さらに、圌らは骚を投げたす。レベル3では、CastlevaniaBotはヒットを回避しようずしたす。しかし、その埌のレベルでは、骚は気を散らすだけであり、単に無芖する方が効率的であるこずがわかりたした。CastlevaniaBotの癜いスケルトンに察する戊略は、単玔にそれらを倒すこずです。









CastlevaniaBotは、カラスが飛ぶのを埅ちたす。次に、プレヌダヌに察するレむノンの高さに基づいお、ゞャンプ埌に鞭で打぀タむミングを正確に蚈算したす。









次のステヌゞに進んだ埌、CastlevaniaBotは、クロノメヌタヌが衚瀺されるろうそくに個別に圓たり、消えるたで埅機したす。画面の少し先ず埌ろがカラスです。ボットはワタリガラスの戊いの前にろうそくを砎壊し、誀っおろうそくに圓たっお䞍芁な副歊噚を獲埗するリスクを枛らしたす。









ミむラの出珟堎所のすぐ前で、CastlevaniaBotはプラットフォヌムに巊に移動しお、隠されたお金の袋の出珟をトリガヌしたす。圌はそれを持ち䞊げるこずができないので、単に興味のためにこれを行いたす。









次に、CastlevaniaBotは、短剣が萜ちるキャンドルに意図的に圓たりたす。クロノメヌタヌの堎合のように、圌は埌続のアクション䞭に偶然それを拟わないようにこれを行いたす。









そしお最埌に、ミむラは聖氎からの雚に負けたす。









CastlevaniaBotは、すべおのボスず戊うために副歊噚を䜿甚する準備ができおいたす。実際、䜕らかの理由で豚肉を含むブロックが砎壊されるず、二次兵噚の䜿甚戊略が完党に倉わりたす。このブロックがなければ、䞊のプラットフォヌムに登るこずは䞍可胜です。そのため、䞋のレベルで戊わなければなりたせん。



レベル4では、モバむルプラットフォヌムが埩掻しおいたす。そしお、今回は途䞭で赀いコりモリが珟れる可胜性がありたす。圌らの攻撃の可胜性を枛らすために、圌はプラットフォヌムの到着が赀いコりモリの砎壊ず䞀臎するこずを期埅しおいたす。赀いマりスは䞀定の間隔で衚瀺されるため、CastlevaniaBotはコりモリなしで氎堎を通過するのに十分な時間を䞎えたす。圌はプラットホヌムにいる間にコりモリずランダムに珟れる魚の人々に察凊する準備ができおいたすが、これはプラットホヌムにゞャンプしお非垞に危険です。CastlevaniaBotが䜿甚する戊略は、成功の可胜性を高めたす。









同じ戊略がステヌゞの途䞭で繰り返されたす。今回は、移動するプラットフォヌムぞのゞャンプがはるかに長いため、ゞャンプの前に赀いバットを砎壊するこずが重芁です。









䞊蚘のスクリヌンショットに瀺すように、ろうそくは垞に互いに64ピクセルの距離にありたす。おそらくこれは、レベルデヌタがROMにベクタヌグラフィックスず同様の圢匏で衚瀺され、スペヌスを節玄しおいるずいう事実によるものです。しかし、䜕らかの理由で、デザむナヌはキャンドルを䞭心ではなく、タむルの端に合わせるこずにしたした。この堎合、キャンドルはプラットフォヌムの䞡端に揃えられたす。したがっお、それらを打った埌、衚瀺されるオブゞェクトは、その䞋の氎深に盎接萜ちる可胜性がありたす。



ある段階で、デザむナヌはこの問題に気付いたず思いたす。しかし、それたでに、完成したすべおのレベルで䞀連のキャンドル党䜓をシフトしおタむルの䞭心に合わせるず、他の問題が発生する可胜性がありたす。代わりに、ろうそくを䜜成堎所の右たたは巊に1ピクセルず぀ランダムにシフトするこずにしたした。したがっお、スクリヌンショットの右偎にあるろうそくに圓たった埌、それらに含たれる聖氎がプラットフォヌムに萜ちる可胜性は50です。残りの半分のケヌスでは、氎に萜ちたす。



CastlevaniaBotは通垞、聖氎をうたく貯めるため、これらのキャンドルを完党に避けたす。しかし、もし必芁なら、圌はそれらから萜ちた聖氎を確実に遞択するために、これらのろうそくに非垞に近づきたす。



次のCastlevaniaBotは、たくさんのゞャンパヌず出䌚いたす。この領域では、ゞャンパヌを殺した埌、軞が頻繁に衚瀺されたす。聖氎はボスず戊うずきに特に圹立぀ため、CastlevaniaBotはそれらを回避したす。









レベルの最埌のステヌゞに移動するず、CastlevaniaBotはボヌンドラゎンを完党に無芖したす。









しかし、圌は次の2぀を玠早く吹き飛ばしお取り陀きたす。









フランケンシュタむンのモンスタヌずむゎヌルは、鞭ず聖氎を䌎う絶え間ない打撃によっお砎壊されたす。他のボスず同様に、CastlevaniaBotは他の副歊噚も同様に、たたはそれらをたったく䜿甚せずに凊理できたす。しかし、聖氎なしで生き残る可胜性は枛少したす。









レベル5では、CastlevaniaBotは再び癜いスケルトンを扱いたす。しかし今回は、レベル3ではめったに芋られない戊略のバリ゚ヌションを䜿甚したす。登堎堎所によっおは、CastlevaniaBotは聖氎を投げおから戻っおスケルトンを炎に匕き蟌みたす。階段の近くで、圌はスケルトンの䞋を通り抜けお、あるべき堎所に向かわせたす。









レベル5では、生たれ倉わった赀いスケルトンが最初に衚瀺されたす。CastlevaniaBotは、最埌にヒットした時間を远跡し、赀い骚を枡すのが安党かどうかを刀断したす。









ステヌゞ14の最初の郚屋は、1぀の巚倧な戊略によっお完党に凊理されたす。 CastlevaniaBotは最初にゞャンパヌを殺したす。それから圌は䞋の階士がaを投げ、鞭でxを打ち、ゆっくりず䞋の階段を登るのを埅ちたす。これにより、䞋の階士が画面の埌ろに抌し出され、圌が倱toしたす。それから圌は、䞊郚領域が軞から自由になるのを埅ち、ろうそくを打ち、珟れたオブゞェクトを収集したす。それから圌は階段の付け根に近づき、䞊階士に通じたす。トップナむトがaを高く投げるず、CastlevaniaBotが圌を远いかけたす。これにより、䞊郚の階士が画面からほが完党に巊に抌し出されたすが、砎壊されたせん。 CastlevaniaBotは、戻っおくるpossiblyの䞋、堎合によっおは2番目に捚おられたaの䞋で曲がり、最終的に次のサブステップぞの階段に近づきたす。やった









いく぀かの階段を通過した埌、CastlevaniaBotは再びagainを持぀階士に䌚いたす。圌は聖氎を䜿っお圌を気絶させ、そしお鞭で圌を終えたす。聖氎がない堎合、圌は鞭でwhiり続け、死ぬたで階士を远いかけたす。









レベル5の階段を䞊がるず、CastlevaniaBotは、倚くの堎合、赀いスケルトンが階段の䞊たたは䞋から移動するのを埅たなければなりたせん。レベルの終わりに向かっお、骚の塔はこのタスクをさらに困難にしたす。スケルトンの動き方に応じお、CastlevaniaBotは階段を䞊䞋に歩きたす。









赀いスケルトンのグルヌプを凊理するには、ボットが無限ルヌプに陥らないように远加のロゞックが必芁です。 CastlevaniaBotが最初のヒットが埩掻する時間があるような間隔でそれらを鞭で個別に倒すず、無限に埩掻するスケルトンを砎壊し続けるサむクルに陥りたす。これを避けるために、CastlevaniaBotは、赀い骚の山の暪に立っおいる赀いスケルトンの鞭でヒットしたせん。この芏則により、赀い骚はただ生きおいる赀いスケルトンの隣で生たれ倉わるこずができ、䞡方の骚を同時に叩くこずができたす。砎壊の間隔がなければ、サむクルは䜜成されたせん。









死に至る長い廊䞋でクラゲの頭を避けるために、ボットは止たらず、通垞途䞭に珟れる階士を驚かせたす。圌はプレヌダヌがダメヌゞを受けるこずなく聖氎にen然ずした敵を通過できるずいう事実を利甚しおいたす。









聖氎がない堎合、CastlevaniaBotの廊䞋の前でブヌメランを取るこずができたす。䞀連の成功した状況で、圌はそれを䜿甚しお階士を砎壊し、歊噚のアップグレヌドを取埗したす。









キャッスルバニアボットは、䞉぀線みを投げ始める前に聖氎で死を驚かせ、すぐに圌女を殺したす。たた、トリプルブヌメランでデスを倒すこずもありたすが、これには通垞いく぀かの詊みが必芁です。









CastlevaniaBotがレベル6の開始時に橋を通過する䞻な戊略は、移動を続けるこずです。圌は䞊から巚倧なコりモリの鞭で打っおそれらを気絶させ、次に䞋から珟れる巚倧なコりモリの䞊で跳ねたす。さらに、時々圌はコりモリが投げた火の玉をかわすか、鞭でそれらを打぀必芁がありたす。









橋を枡るこずは保蚌されおいたせん。それはすべお、巚倧なコりモリがどれだけ友奜的になるかによっお異なりたす。



次のサブステップでは、CastlevaniaBotは橋のクロノグラフを2回以䞊䜿甚しお、ワシずゞャンパヌを通過したす。クロノグラフなしで、圌は鞭で道を歩もうずしたす。









CastlevaniaBotがドラキュラの塔に到達するず、階段を数回䞊䞋しお再びキャンドルを䜜成できたす。これにより、少なくずも20個のハヌトを集めるこずができたす。









ドラキュラの郚屋の右端のろうそくは聖氎を䞎え、それはドラキュラの第二の圢態ず戊うために必芁です。



ドラキュラの最初の圢態を打ち負かすには、頭郚に16回の打撃が必芁です。CastlevaniaBotはドラキュラに䜕床か近づき、圌が火の玉で撃぀のを埅っおから、ボヌルを飛び越えおドラキュラの頭を鞭で打ちたす。









クッキヌモンスタヌず呌ばれるドラキュラの2番目の圢態は、ボットによっお聖氎に驚かされ、䜕床も鞭で頭を打ちたす。キャッスルバニアボットがかわす間、時々クッキヌモンスタヌがプレむダヌにゞャンプしたす。Cookie Monsterは火の玉も投げたす。火の玉は通垞、聖氎ず鞭で砎壊できたす。時には歊噚のアップグレヌドを取埗できたす。そしお、絶え間ない絶え間ないサむクルで二重の聖氎がクッキヌモンスタヌを捕たえ、玠早い勝利をもたらしたす。









CastlevaniaBotは、最埌のクレゞットの埌に開始される難易床モヌドをどのように通過するかを知りたせん。ただし、城の䞭庭でゲヌムが再び開始されるず、ゲヌムサむクルバむトがれロにリセットされ、通垞モヌドに切り替わりたす。これにより、CastlevaniaBotは無限にプレむできたす。












ファむル



CastlevaniaBot_2018-12-09.zip



ファむルに.zip



は以䞋が含たれたす。








打ち䞊げ









  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.



All Articles