2011-11-15 10 views
8

私は現在、Javaでパックマンゲームを作っています。私は幽霊についての質問がある。Pacman Ghost AI

私は幽霊がすべて同じスタイルの攻撃をしているわけではないことを理解しています。私はまず、幽霊をパックマンの後ろにつけて、そこにまだ違いがないか心配しないようにする基本について作業したいと思っています。

賢い人が私に質問するのは、幽霊がパックマンを追いかける最善の方法でしょうが、時にはランダムに迂回するパスがあります。私は現在、壁がどこにあるかを伝えるために21×21の2D配列を使用していますので、私はそれをパクマンの現在のグリッド位置についてもっと試して見てみようと考えていました。 (例えば10,14へ行く)もちろん、パックマンのような壁を通らずに。私はこれをどうすればいいのだろうと思っています。また、時には幽霊を止めて別の方向やものにして、それがいつも一定の追跡ではなく、パックマンが逃げる機会を持つようにしてください。多分あなたの中には、パックマンのゲームをプログラムしている人や、これのための良い方法を知っている人がいるかもしれません。どんな助けでも大歓迎です。

(私はグレード11コンピュータサイエンスコースにと途中で学んだのJavaの初学期を通じて、現在てるのでご注意ください。)

+0

Anglosaxoborgによる同化に抵抗する私たちのグレード11は何ですか? –

+0

@larsmans高校3年生ですが、私は高校2年生ですが、コースを取るのを待つことができませんでした。 – ComputerLocus

+0

私はそれをあなたのユーザープロフィールで見たことがあります:) –

答えて

6

あなただけではない、すべて同じように動作するように幽霊をしたい場合、彼らは交差点に遭遇するたびに、彼らの決定などパックマンまでの最短距離と道を続けとして、いくつかの合理的な追跡デフォルトのランダムミックス(作る - 利用Dijkstra's algorithmすべての後継者に最高のものを選ぶ)と無作為の選択。

+0

あなたの言うことは、交差点からランダムな曲を選ぶようにしているのですが、パクマンが行く方向に行くだろうということでしょうか? – ComputerLocus

+1

@Fogest正確に。幽霊が一緒に集まるのを防いでゲームを面白く保つ値は、実験によって(迷路の形に依存して)決定されなければならないだろうが、50%のランダムな選択 - 50%の最短経路が許容できる結果を与えるだろうと推測する。 –

+0

私はこのアイデアが好きで、このラインや@larsmansの答えに沿って何かを使うでしょう。 – ComputerLocus

4

私はこの記事に非常に役に立った:それはあなたが必要なものだけ説明しているように、Understanding Pac-Man Ghost Behaviorを。

+0

はい私はそれぞれの幽霊がそれ自身の行動を持っていることを知っていますが、私はそのような複雑さのゲームをプログラムするためのコースでは全く期待していません。私はちょうど最初に基本的な追跡システムを追加して、この高度な方法ではない。 – ComputerLocus

4

ゴーストが取ることができるすべてのステップについて、そのステップがPacmanに近づくかどうかを計算します。これは、Manhattan distanceで行うことができます.2dグリッドでは、x距離+ y距離です。その後、無作為にステップを選択します。実際にそれを近づけるステップに割り当てられる確率は高くなります。

あなたが近いパックマンのゴーストを取る手順を示す第1 n_closing_inのステップを持つ配列stepsを持っている場合は、あなたが次に同様に残っているもの配布

double total_probility = 1.; 
for (int i=0; i<n_closing_in; i++) { 
    step_prob[i] = prob_closing_in/n_closing_in; 
    total_probability -= prob_closing_in/n_closing_in; 
} 

でそれらprob_closing_inの合計確率を割り当てることができますtotal_probabilityでは、幽霊をパックマンから遠ざけていくステップを踏んでいます。

Step random_step(Step[] possible_steps, double[] step_prob) { 
    double r = Math.random(); 

    int i; 
    for (i=0; i<possible_steps.length(); i++) { 
     if (r < step_prob[i]) 
      break; 
     r -= step_prob[i]; 
    } 
    return possible_steps[i]; 
} 

迷路があまりにも複雑ではなく、中に閉鎖する確率が>.5ある場合は、幽霊がパックマンの後追いするように見えるが、行き当たりばったりのようになります。

prob_closing_in1.にすると、ゲームが難しくなります。

(上記のコードのすべてがテストされていないバグが含まれていてもよい。私は、Javaであまりにも良いではないです。)

+0

あなたはちょっとそこにいなくなってしまいました。私は前にステップについて学んだことはありませんでした。 – ComputerLocus

+0

@Fogest:私は 'enum Step {LEFT、RIGHT、UP、DOWN}'の行に沿って考えていました。 –

+0

まだ理解していません... – ComputerLocus

1

私の大学のレベルAIコースについては、私はパックマンのゴーストの古いバージョンでいくつかの仕事をしてくれましたAIフレームワーク。現在のバージョンはhttp://www.pacman-vs-ghosts.net/software (Now DEAD)のように見えます。この中であなたは自分のゴーストエージェントを開発して、エージェントまたはユーザーが管理するPacmanを捕まえることができます。

これは、さまざまなAI技術を使いこなすのに非常に便利でした。

さらに、このフレームワークのレベルは2次元配列ではなくグラフから構築されます。コードの使い方を見るには、コードをご覧ください。

元のリンクは死んでいて、公式のミラーを見つけることができませんでした。ただし、以下おそらく助けになるだろう。そのようなAIの

Understanding Pac Man Ghost Behavior Ms Pac Man Vs Ghost AI (GitHub) PacMan_v6.2 (GitHub)

+0

それを見ても、私のスキルレベルを考えてみましょう。 – ComputerLocus

+0

自分自身に挑戦! ;-) – Casey

+0

そのリンクは古くなっています。 – jumpnett

0

最も簡単な実装では、素朴なグラフ探索アルゴリズムを使用することです。 BFSは簡単なものになります。しかし、コースの実行時間を最適化するヒューリスティックを実装したいので、ゴーストエージェントからPac-manまでの単純なマンハッタン距離で十分です。

要約:BFSとマンハッタン距離ヒューリスティック。

幽霊が狩りをより効率的にするためには、ゴーストからパックマンまでの距離とパックマンがこれまでに食べたドット数に基づいてゲーム状態ヒューリスティックを実装することができます例えば、幽霊が次に取るべき移動を選択しなければならないときに使用するために)。この場合、pruning techniquesを使用して実行時間を短縮することができます。