パックマン:目はどうやってモンスターの穴に戻るのですか?


321

私はパックマンで幽霊のAIについて多くの言及を見つけましたが、パックマンによって幽霊が食べられた後、どのように目が中央の幽霊の穴に戻るのかについては誰も言及しませんでした。

私の実装では、シンプルですがひどいソリューションを実装しました。私は、どの方向をとるべきかを隅々までハードコーディングしました。

より良い/または最良の解決策はありますか?多分異なるレベルのデザインで動作する一般的なものですか?


11
隅のハードコーディングで十分ですか?これは最善のルートを保証するものではありません。幽霊が長く狭い通路に面していると想像してください。あなたのアルゴリズムによって、彼は、その全体の通路を下るコーナーに達する、としなければならないであろう、その後の最速ルートを取ります。すべての正方形でどの方向に進むかをハードコーディングした場合、彼は最初に向きを変えるだけです。
マークピーターズ

3
@Mark、コーナーの定義に依存します。一番上の行をまっすぐ行ってもT字接続なら結構です。
–ThorbjørnRavn Andersen 2010

1
@Thorbjørn:私は交差点についてさえ話していません。この掲示板をご覧ください:en.wikipedia.org/wiki/File : Pac-man.png。ゴーストが右に移動し、左下から2番目のドットに配置されていた場合、しばらくの間、交点に出会うことはありませんでした。これにより、後方(左)に曲がり、最短の経路をたどった場合よりも10マス移動します。
Mark Peters

6
あなたのソリューションはウェイポイント(またはパンくず)を利用していますが、それは経路探索アルゴリズムを高速化するために一般的に使用される手法だと思います。
Nick Dandoulakis 2010

1
すべての答えをありがとう!私は以前の解決策に固執し、隅々まで道案内をハードコードしました。これを汎用的に行うには、leveldesigner / aレベルファイルもこの情報をレベル定義で定義する必要があります。
RoflcoptrException 2010

回答:


152

実際、あなたのアプローチは非常に優れたソリューションであり、あらゆる種類のパスファインディングと比較して実行時間がほとんどゼロです。

任意のマップに一般化する必要がある場合は、任意のパスファインディングアルゴリズムを使用できます。たとえば、幅優先検索は実装が簡単です。ゲームを実行する前に、これを使用して、各コーナーでエンコードする方向を計算します。

EDIT(2010年8月11日)::私はちょうどパックマンシステム上で非常に詳細ページを参照してパックマンドシエを、私はここに受け入れ答えを持っているので、私はそれを更新する必要があります感じました。記事はモンスターハウスに戻る行為を明示的にはカバーしていないようですが、パックマンでの直接パスファインディングは以下の場合であると述べています:

  • 次の交差点に向かって移動を続行します(これは基本的に、「選択肢が与えられたら、次のステップに示すように、方向を逆にすることを含まない方向を選択することの特別な場合です)。
  • 交差点で、隣接する出口広場を見てください。
  • ゴールに最も近いものを選ぶ。複数が同じように目標に近い場合は、最初の有効な方向を上、左、下、右の順に選択します。

16
彼は、実行時に(レベルがロードされているが、再生を開始する前に)一度だけ計算できることを意味すると思います それを維持するのは難しくありません。
Mark Peters

3
ええ、またはその一部として、マップを作成するためのツールがある場合。
Kylotan

6
リターンパスの事前計算に問題はありません。ストレージ(パス)をランタイムパフォーマンスと交換しています。
スティーブクオ

6
ありがとう。私はこの解決策に固執すると思います。オリジナルのパックマンでそれがどのように行われたか知っていますか?
RoflcoptrException 2010

4
いいえ、ありません。元の質問ではこの用語が使用されていましたが、法的に拘束力があるわけではありません。
カイロタン

85

私はこのレベルで一般的なレベルの問題を解決しました。レベルが始まる前に、モンスターホールから何らかの「フラッドフィル」を行います。壁ではない迷路のすべてのタイルには、穴からどれだけ離れているかを示す数字が付けられます。したがって、目が68の距離のタイルにあるとき、それらは隣接するタイルのどれが67の距離を持っているかを見ます。それはそれから行く方法です。


15
はい。フラッドフィルは、世界が大きくなりすぎて実行可能にならない状況での経路探索に非常に適しています。コネクティビティが事前に計算されたより粗いグリッドを適用することで、大きな世界でも使用できると思います。少し邪魔になるかもしれませんが、そのようなゲームで見た渋滞よりはましです。
Loren Pechtel 2010

1
スペースを節約するため(より大きな世界、または制約されたシステムの場合)、すべてのタイルの値を保存するのではなく、すべての交差点で移動する方向を保存できます。これは本質的にOPが示唆していたことです。
BlueRaja-Danny Pflughoeft 2011

BlueRaja:もちろんですが、それを行うのはより複雑で、結果は最適ではありません-ゴーストは2つの交差点の間で食べられるため、しばらくの間間違った方向に走る可能性があります。私のソリューションはen.wikipedia.org/wiki/HP_200LXでうまく機能したので、どれだけ多くの制約を課すことができますか?
Erich Kitzmueller、2011

5
(私は遅れています...)はい、塗りつぶしは良いですが、実際には完全な数は必要ありません。各正方形の方向(2ビット)を使用して、次の正方形を指すだけです。
Matthieu M.

Matthieu:ええ、それは可能な最適化でしょう。
Erich Kitzmueller、2012年

42

従来のパスファインディングアルゴリズムの代わりに、(適切に名前が付けられた!)パックマンの香りのアンチオブジェクトパターンを確認できます

起動時にモンスターの穴の香りを迷路の周りに拡散させ、目を家に追従させることができます。

匂いが設定されると、実行時のコストは非常に低くなります。


編集:残念ながら、ウィキペディアの記事は削除されたので、WayBack Machineが救いに ...


2
これが私の答えになります。基本的にはammoQと同じですが、パックマンのにおいについてはいつも覚えています:)
Luke Schafer

ウィキペディアの記事が死んでいるか、削除されているようです。上位のグーグルの結果はこのスレッドですが、これは近いと思います。
デビッド

2
一瞬戸惑いましたが、「香り」の意味がすぐにわかりました。これは、これらのスカラーフィールドのことを説明するのにとても良い方法です。
Steven Lu


18

機能する単純なソリューションは、保守可能で信頼性が高く、十分に機能するため、優れたソリューションです。あなたはすでに良い解決策を見つけたように思えます...

パス検索ソリューションは、現在のソリューションよりも複雑になる可能性が高く、デバッグが必要になる可能性が高くなります。それもおそらく遅くなります。

IMO、壊れていない場合は修正しないでください。

編集

IMO、迷路が修正された場合、現在のソリューション優れた/エレガントなコードです。「良い」または「優雅」を「賢い」と同一視する間違えないでください。単純なコードも「良い」「優雅」にすることができます。

迷路レベルを構成できる場合は、最初に迷路を構成するときにパスファインディングを実行する必要があります。最も簡単なのは、迷路デザイナーに手作業で行わせることです。あなたがバジリオン迷路を持っている場合、またはユーザーがそれらを設計できる場合にのみ、私はこれを自動化することを気にします。

(さておき:ルートが手動で設定されている場合、迷路デザイナーは次善のルートを使用してレベルをより興味深いものにすることができます...)


はい、動作しています。しかし、私はコードだけでなく、良いコードを書きたいと思っています。さらに、質問の最後の文を追加したので、可能であれば、アルゴリズムは1つの迷路だけでなく、複数の迷路にも対応する必要があります。
RoflcoptrException 2010年

迷路を生成することもできます(私は見栄えの良いパックマンの迷路を生成するアルゴリズムを持っています)。したがって、少し自動化する方法があります
Erich Kitzmueller

「...またはユーザーがそれらを設計できます。」その場合、あなたはバジリオン迷路を持っています。
phuzion

@phuzion-私はそれを知っています。ただし、2つのケースには違いがあります。それが迷路迷路を作成するOPである場合、ルーティングを手動で作成しなければならないのは不便です。エンドユーザーの場合は、OPがドキュメントを作成し、エンドユーザーの迷路のエンドレストラブルシューティングを行い、フィールドエンドレスが不親切であることを不平等にする必要があることを意味します。つまり、自動ルート生成を実装する理由異なります。
スティーブンC

14

オリジナルのパックマンザゴーストは、「におい」によって黄色の錠剤を食べる人を見つけ、地図に痕跡を残しました。幽霊は、匂いが見つかるまでランダムに歩き回り、その後、匂いの経路をたどって、直接にお連れしました。プレーヤー。パックマンが動くたびに、「匂いの値」は1ずつ減っていきます。

プロセス全体を逆にする簡単な方法は、「ゴーストのにおいのピラミッド」を作成することです。これは、マップの中心に最高点があり、ゴーストがこのにおいの方向に移動するだけです。


私はこのアプローチが本当に好きで、私もこれを試してみる
RoflcoptrException

5
これは正しくありません。彼ら全員がこのアルゴリズムに従った場合、彼らは彼に単一のファイルを追いかけることになります。各ゴーストの動作は異なります。詳細については、ウィキペディアの記事をご覧ください。
ディバイダー

5

pacmanを追跡するために必要なロジックがすでにあるとしたら、それを再利用してみませんか?ターゲットを変更するだけです。まったく同じロジックを使用してまったく新しいルーチンを作成しようとするよりもはるかに少ない作業になるようです。


はい、私はすでに実装されているパックマンを追跡するロジックを持っていますが、それにも満足していません;)
RoflcoptrException

私の経験では(楽しみのためにパックマンバージョンを書くのが好きです)、それを行うと、長い間、目が穴の外に詰まる可能性があります。これは、追跡アルゴリズムが「パックマンが北にある場合は北に行く」という線に沿っているのが普通ですが、迷路に「トラップ」が含まれ、目を最初に南に向ける必要があるためです。パックマンが動くので、ゴーストは遅かれ早かれ脱出しますが、穴は固定ターゲットです。(注:生成された迷路について話している)
Erich Kitzmueller、2010

3

パスファインディングの問題です。一般的なアルゴリズムについては、http: //wiki.gamedev.net/index.php/A*を参照してください


3

中心までの距離の値を持つ各正方形はどうですか?このようにして、与えられた正方形ごとに、すべての可能な方向で隣接する正方形の値を取得できます。最も低い値の正方形を選択して、その正方形に移動します。

値は、使用可能なアルゴリズムを使用して事前に計算されます。


これを提案するつもりでした。「モンスターホール」から始まる外向きの盛土。あなたの答えは写真から利益を得ると思います。
AjahnCharles 2017

3

これは、それが実際にどのように機能するかについて私が見つけることができた最高の情報源でした。

http://gameai.com/wiki/index.php?title=Pac-Man#Respawn 幽霊が殺されると、体現されていない目が元の場所に戻ります。これは、ゴーストのターゲットタイルをその場所に設定することで簡単に実現できます。ナビゲーションは同じルールを使用します。

それは実際に理にかなっています。たぶん世界で最も効率的ではないかもしれませんが、ターゲットを変更しているだけで、別の状態やそれらに沿った何かについて心配する必要がないとても良い方法です。

補足:パックマンのプログラマーが、非常に限られたメモリの非常に小さなスペースでメッセージシステム全体を作成したのがどれほど素晴らしいかはわかりませんでした。


2

私はあなたの解決策は問題に適していると思います、それよりも簡単です、ゴーストの目が壁を通り抜けることができる新しいバージョンをより「現実的な」ものにすることです=)


2
D:さらに多くのリアリズムを追加するには、幽霊自体が壁を移動できるようにすることができ
トーマスEding

3
それらはゴーストの不透明な壁ですが、2次ゴースト(ゴーストのゴースト)はより透明です。(あなたは機能に変換バグ多くのユーザーマニュアルを見つけることができる)
エルナンEche

1
「2次ゴースト」の+1-ああ、そうです、ゴーストの派生物は確かに壁のような単なる1次オブジェクトを超越しなければなりません... :)
アサドエブラヒム

2

以下は、ammoQの塗りつぶしのアイデアのアナログコードと疑似コードです。

queue q
enqueue q, ghost_origin
set visited

while q has squares
   p <= dequeue q
   for each square s adjacent to p
      if ( s not in visited ) then
         add s to visited
         s.returndirection <= direction from s to p
         enqueue q, s
      end if
   next
 next

これは幅優先の検索であるため、隣接する新しい正方形sに遭遇するたびに、pを通るのが最適な経路であるという考え方です。O(N)だと思います。


2

ゲームの実装方法についてはよくわかりませんが、次のことができます。

  1. ゲートに対する目の位置の相対位置を決定します。つまり、上に残っていますか?真下?
  2. 次に、2つの方向の一方と反対側に目を動かし(たとえば、ゲートの右側にある場合は左に移動し、ゲートの下に移動するようにします)、壁があり、それを妨げているかどうかを確認します。
  3. それを妨げている壁がある場合は、反対方向に移動させます(たとえば、ピンを基準にした目の座標が右北で、現在左に移動しているが、途中に壁がある場合)南に移動します。
  4. 移動するたびにチェックを続け、目がゲートに対してどこにあるかを確認し、緯度の座標がない場合を確認してください。つまり、ゲートの上だけです。
  5. 壁がある場合は、ゲートの上だけにある場合は下に移動し、左または右に移動して、目が巣穴に入るまでこの番号1〜4を繰り返します。
  6. 私はパックマンで行き止まりを見たことがありません。このコードは行き止まりを説明しません。
  7. また、疑似コードの原点をまたぐ壁の間で目が「ぐらつく」ときの解決策も含めました。

いくつかの擬似コード:

   x = getRelativeOppositeLatitudinalCoord()
   y
   origX = x
    while(eyesNotInPen())
       x = getRelativeOppositeLatitudinalCoordofGate()
       y = getRelativeOppositeLongitudinalCoordofGate()
       if (getRelativeOppositeLatitudinalCoordofGate() == 0 && move(y) == false/*assume zero is neither left or right of the the gate and false means wall is in the way */)
            while (move(y) == false)
                 move(origX)
                 x = getRelativeOppositeLatitudinalCoordofGate()
        else if (move(x) == false) {
            move(y)
    endWhile

2

各コーナーでランダムな方向を選択するだけのdtb23の提案ですが、最終的にはモンスターホールの音がひどく非効率的であることがわかります。

ただし、非効率な原点復帰アルゴリズムを利用して、ゲームの難易度のバリエーションを増やすことで、ゲームをより楽しくすることができます。これを行うには、ウェイポイントや塗りつぶしなどの上記のアプローチのいずれかを適用しますが、非決定的に行います。したがって、隅々で、乱数を生成して、最適な方法をとるか、ランダムな方向をとるかを決定できます。

プレイヤーがレベルを上げるにつれて、ランダムな方向がとられる可能性を減らします。これにより、レベルスピード、ゴーストスピード、錠剤を食べるポーズなどに加えて、全体的な難易度レベルに別のレバーが追加されます。幽霊が無害な目である間、リラックスする時間は長くなりますが、時間は進むにつれて短くなります。


2

短い答え、あまりよくありません。:)パックマン迷路を変更した場合、目は必ずしも戻ってくるわけではありません。浮かんでいるハックのいくつかはその問題を抱えています。だからそれは協力的な迷路を持つことに依存しています。


2

ゴーストは、穴からパックマンまでの経路を保存することを提案します。したがって、幽霊が死ぬとすぐに、彼はこの格納されたパスを逆方向にたどることができます。


2
そのパスはおそらく長くなりすぎるでしょう
アフマドY.サレ

ノードに戻るたびに、履歴からループを取り除くことができます。それはかなり直接的なものになります。常に同じ直接パスをたどるより興味深いかもしれませんが、かなり頻繁に、いくつかのかなりばかげたループ(たとえば、正方形の3辺)が含まれます。
AjahnCharles 2017

1

pacmanパスはランダムではないことを知っています(つまり、特定のレベル0〜255、真っ黒、まばたき、小指、クライドの各レベルは、そのレベルに対してまったく同じパスで機能します)。

私はこれを取って、パックマンが幽霊を食べたときに眼球オブジェクトが保留する「戻りパス」として、迷路全体を包み込むいくつかのマスターパスがあると思います。


1

pacmanのゴーストは、目標が達成されるまで、最初にXまたはYで一致しようとするという点で、予測可能なパターンに従います。私はいつも、これが戻る道を見つける目と全く同じだと思いました。


1
  1. ゲームが始まる前に、ノード(交差点)をマップに保存します
  2. モンスターが死んだとき、ポイント(座標)を取り、ノードリストで最も近いノードを見つけます。
  3. そのノードから穴までのすべてのパスを計算します
  4. 長さで最短経路をたどる
  5. ポイントと最も近いノードの間のスペースの長さを追加します
  6. パスを描いて移動する

楽しい!


1

私のアプローチは(Pacman時代の観点から)少しメモリを集中的に使用しますが、計算は1回だけで済み、どのレベルの設計(ジャンプを含む)でも機能します。

ノードに一度ラベルを付ける

最初にレベルをロードするとき、すべてのモンスターの隠れ家ノードに0をラベル付けします(隠れ家からの距離を表します)。すべてのノードにラベルが付けられるまで、接続されたノード1、それらに接続されたノード2のように、外側にラベルを付けます。(注:これは、隠れ家に複数の入り口がある場合でも機能します)

各ノードとそれらの隣接ノードへの接続を表すオブジェクトがすでにあると想定しています。疑似コードは次のようになります。

public void fillMap(List<Node> nodes) { // call passing lairNodes
    int i = 0;

    while(nodes.count > 0) {
        // Label with distance from lair
        nodes.labelAll(i++);

        // Find connected unlabelled nodes
        nodes = nodes
            .flatMap(n -> n.neighbours)
            .filter(!n.isDistanceAssigned());
    }
}

隠れ家からの塗りつぶし

目は最短距離ラベルの隣に移動します

すべてのノードにラベルが付けられると、目をルーティングするのは簡単です...最小の距離ラベルを持つ隣接ノードを選択するだけです(注:複数のノードの距離が等しい場合、どちらを選択してもかまいません)。疑似コード:

public Node moveEyes(final Node current) {
    return current.neighbours.min((n1, n2) -> n1.distance - n2.distance);
}

完全にラベル付けされた例

完全な地図


0

私のPacManゲームでは、shortest multiple path home(ルールセット内で)提供する迷路で機能するアルゴリズムを作成しました。また、トンネル全体で機能します。

レベルが読み込まれると、すべてpath home data in every crossroadが空になり(デフォルト)、ゴーストは迷路の探索を開始するとcrossroad path home information、「新しい」交差点に出会うたびに、または既知の交差点に再びつまずくたびに更新され続けます。


-2

オリジナルのパックマンは、経路探索や派手なAIを使用していませんでした。ゲーマーに、実際よりも奥行きがあると信じさせただけですが、実際はランダムでした。ゲームの人工知能/ Ian Millingtonに述べられているように、John Funge。

それが本当かどうかはわかりませんが、私には多くの意味があります。正直なところ、私は人々が話しているこれらの行動を見ていません。彼らが言うように、元の赤/ブリンキーは常にプレーヤーをフォローしていません。誰も意図的にプレーヤーを常にフォローしているようには見えません。彼らがあなたをフォローするチャンスは私にはランダムに見えます。特に、小さなスペースで4人の敵と非常に限られた回転オプションがあり、追跡される可能性が非常に高い場合は、ランダムに動作を見るのは非常に魅力的です。少なくとも最初の実装では、ゲームは非常にシンプルでした。本をチェックしてください、それは最初の章の一つです。


はい、それはいくつかのAIを使用しました。そして、そうブリンキーは彼が(時々からそれへの切り替え)、チェイスモードでいたときに、パックマンを次のそれはすべての権利AIですので、
ジャン=フランソワ・ファーブル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.