悪魔城ドラキュラボット

これは何ですか


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.

Source: https://habr.com/ru/post/J432784/


All Articles