2009-03-08 23 views
6

本質的に私が取り組んでいるパックマンクローンゲームです。私は敵のクラスを持っていて、このクラスの4つのインスタンスが作成され、それらはすべてゲームの4つの幽霊を表しています。Java 2dゲームでのパス検出

すべてのゴーストは、画面のランダムな領域で起動し、その後、彼らはパーマン文字に向かって作業しなければなりません。プレイヤーがパックマンをコントロールしながら移動すると、それに沿って最寄りの方に向かうべきです。

迷路/障害物はありません(まだ)ので、マップ全体(400x400ピクセル)はそれらに開放されています。

プレイヤーと各ゴーストについては、X、Y、イメージの幅と高さの属性を取得できます。また、私はすでに衝突検知アルゴリズムを持っているので、心配する必要はありません。

答えて

12

A*を使用すると、高度な効率的で効果的なパス検索を必要としないシンプルなゲームでは、文字をターゲットに向かって移動させるだけでよいでしょう。ターゲットの方向は十分でなければならない。

例えば、擬似コードでは、文字の動きを作るために決定:

if (target is to the left of me): 
    move(left); 
else 
    move(right); 

if (target is above me): 
    move(up); 
else 
    move(down); 

はい、文字が最も効率的な運動をするつもりされていないが、それは上のターゲットに近づくと近づくだろうゲームループの各繰り返し。

80年代前半のアーケードゲームは洗練された経路探索アルゴリズムを使用していない可能性があります。

+0

。 A *などは良い出発点です...私はそれが良い終点だったとは言いませんでした:-) – TofuBeer

+0

私は実際にパックマンを長い間演奏していないので、それらの幽霊がいかにスマートになったか覚えている実際には、私はレベル3または4を過ぎたとは思えませんね、ちょっと、私は3年生でした) – coobird

+0

スピードアップのために、彼らはあなたをよりターゲットにすることができます。彼らはレベルが上がるにつれて減少するランダム性をいくつか追加します。 – TofuBeer

0

あなたはlooking at A* (A star)

そして、他のパス発見アルゴリズムへのリンクがありhere is a pageを開始することができます。

[編集] gah ...脳が遅すぎる...この本を忘れてしまった、それはCまたはC++(私は忘れている)だが、まだJavaのコンセプトを得ることができる。あなたが読むのが一番簡単ではないかもしれませんが、全体的に悪くはありません。 AI for Game Developers by David M. Bourg, Glenn Seemann

6

パクマンとゴーストが自由に動き回ることができる「大きなフィールド」のピクセルグリッドがあれば、最短のパスは簡単です。ゴーストとパックマンの間の直線です。

しかし、「最短経路」は、必ずグラフ理論問題を解くことを意味しています。 (私は、グラフの知識、いくつかのグラフ理論、調整行列などを仮定しています)

上記の場合、各ピクセルをグラフ上のノードとみなしてください。各ノードはエッジによって隣接ノードに接続され、各エッジは等しい「重み」を有する(「上」のノードへの移動は「下のノード」への移動よりも遅くない)。

ですから、この持っている: - |パックマンが中央にある場合、それは非常に他のノードに移動することができます( "*" =ノード、=エッジ "/、\、")

*-*-* 
|\|/| 
*-*-* ... (etc) 
|/|\| 
*-*-* 

を簡単に。現実にもっと近い

何かがこのようになります。今

*-*-* 
| | | 
*-*-* ... (etc) 
| | | 
*-*-* 

、パックマンは、斜めに移動することはできません。中央から右下に行くには、1つではなく2つの「ホップ」が必要です。

進行継続するには、次の一番上にあるノードへの途中でノードから行くために、今すぐ

*-*-*-* 
| | | | 
| | | | 
| | | | 
*-*-*-* 
| | | | 
*-*-*-* 

を、あなたは3ホップを必要としています。しかし、底に向かって移動するには1ホップしかかかりません。

ゲームボードの設定をグラフに簡単に変換できます。各「交差点」はノードです。 2つの交差点間のパスはエッジであり、そのパスの長さはそのエッジのウェイトです。

A *を入力してください。グラフを作成する(隣接行列またはノードのリストを使用する)ことにより、A *アルゴリズムを使用して最短経路を見つけることができます。他のアルゴリズムにはDijkstra'sが含まれる。他にもたくさん!しかし、まずグラフを使って問題を特定し、次にノードA(パックマン)からノードB(ゴースト)に行く方法をおもしろくする必要があります。

希望に役立ちます!

0

私はパクマンが行ったすべての動きで最短経路アルゴリズムを使うと思います。非常に良い実装はDijkstra's algorithmです。

ちょうど要約する:迷路を頂点とエッジを持つグラフとして視覚化します。各辺には待機があります(あなたのケースではすべての辺が同じ重みを持ちます)。アルゴリズムは、各直近の到達可能なエッジを1ステップ下に移動することによって、ソース頂点からターゲット頂点までの最短経路を見つける。次に、次の頂点で同じことをして、目標に達するまで続けます。到達した最初のパスは最短パスです。このアルゴリズムには多くの最適化が行われ、パックマンが以前の位置にあった場所と移動した方向を考慮して、アルゴリズムでいくつかのヒューリスティックを得ることができるようになります。私はすべての動きで各ゴーストからパックマンまでの最短経路を見つけ、その方向にゴーストを移動することをお勧めします。最終的に距離は減少し、あなたはパクマンを捕まえることができます。

pacmanから到達可能なすべての即時エッジを見つけて、ゴーストによって可能な限り多くのこれらの頂点をカバーしようとするために使用できる別のヒューリスティックです。そのため、pacmanをターゲットの頂点に設定する代わりに、pacmanがターゲットとしてすぐに到達できる頂点を設定すると、使用可能な幽霊がpacmanの主要なエスケープルートを隠して捕まえようとします。

3

これは非常に長い時間でしたが、記憶から、パックマンの幽霊は、経路探索の方法ではあまり効果がありませんでした。彼らはあなたに向かって廊下の軸に沿って、遮るもののない道を見つけ関与され、あなたを「発見」するまで、彼らはかなり標準的な無作為化迷路トラバーサルをするだろう、とあなたが視力の彼らのラインから消えるまで、彼らはその後、あなたに向かって直接移動しますランダムなパターンを再開します。より高いレベルでは、パックマンは、幽霊が「嗅ぐ」と時々続いていく間、彼の後ろに見えない道を残すだろう。パックマンがパワーアップしました

は、アルゴリズムの唯一の違いは、彼らはあなたを発見したときに、幽霊が代わりにあなたに向かって移動するのあなたを逃げるだろう、ということです。

ので、本物の経験のために、あなたはおそらくすべてで非常に洗練された経路探索アルゴリズムを必要としません。あなたが空想になりたいならば、A *を実装することができます。

+0

私はいつも元のパックマンがあらかじめ定義されたパスとパスの発見の間に混ざり合っていたと感じました。しかしそれは静的な出発点のためかもしれません。 – guyumu

2

敵に向かって直接歩くのは始まりですが、迷路を追加すると少し賢い経路探索を追加して、幽霊が曲がりくねったり死んだりしないようにします。

次チュートリアルでは、ダウンロード可能な例で、*を使い始めるには絶好の軽量ガイドです。>チェイス -

パックマンで

Path Finding on Tile based Maps

1

幽霊の全ては、異なる追跡アルゴリズム

  • ブリンキーを持っていました。通常、あなたに最短ルートをとるだろうし、従う傾向があります。
  • ピンキー - >放牧。 pac-manにもっと迂回する方法を取る傾向があります。致命的。 (ピンキーとブリンクは、方向を選択するときに異なる選択をする傾向があり、しばしばコーナーでプレイヤーをケージする)
  • Inky - > Freak。この男は不思議な動きをする。彼はかなり無作為にボードについて動いているが、彼が近づくと追いかけることもある。
  • クライド - >バカ。ランダムに移動します。あまり脅威ではありません。

幽霊はその動きにプログラムされた興味深いパターンを持っている:時折、彼らは同時に停止し、パックマンの追求をやめると「散布モード」に入る、迷路のそれぞれのコーナーに戻ります。

the pacman dossier

よろしく

でアルゴの完全な記述がある

ギヨームパックマンは(ゲームの進行、特にとして)おそらく上記のアルゴリズムよりも優れてやるん

関連する問題