2009-08-28 19 views
5

パズルゲームのパターンをセルのグリッドに合わせて見つけるのに最も一般的に使用されるアルゴリズムは不思議でした。パズルゲームでのパターンの検索

は、私はそれはあなたが検出したいパターン、またはゲームのルールのようなもののように、多くの要因に依存知っている...しかし、私は問題のようなものの中で最も一般的に使用されるアルゴリズムであるかを知りたいと思いました..

たとえば、列、宝石類、さらにはテトリスのようなゲーム。

また、同じ色の3つの隣接するセルを見つけようとしているすべてのグリッドをスキャンするような「ブルートフォース」でパターンを検出するかどうかを知りたければ、4 Xのような非常に小さなグリッドでは、構造は、一般的なゲームのこの種で使用されている例えば4(そして再び、私は...それはゲームとルールの種類に依存知っている)

答えて

5

常にドメインに依存します。しかし、この種の検索を行う2つの状況もあります。オンエンドの状況は移動後(プレイヤーのゲームフィールドへの変更)であり、もう1つはボード全体が変更された場合です。

はテトリスでは、作品が削除された後、ボード全体をスキャンする必要はありません。ピースが触っている行を検索するだけです。

Bejeweledのような一度に2つの隣接する部分を交換するマッチ3ゲームでは、変更された各四角の周りの各方向のローカライズ検索を実行して、いずれかのピースがトリガーされているかどうかを確認します。その後、ゲームがあれば、ゲームはボード上にいくつかの新しい、ランダムな作品をダンプします。今度は、変更された各四角形について同じローカライズ検索を実行できますが、それは多くのif文を含んでいる可能性があります。ボード全体を左上から右下までスキャンするのが実際より遅いかもしれません。実装に依存し、プロファイリングが必要になります。

Adrianによれば、単純な2D配列で十分です。ただし、パターンの検索の面を簡素化するために、この配列の周囲にピクセルの「境界線」を追加することがあります。境界線がなければ、 "正面にいる場合は検索しないで(そして配列から離れてください)"と書かれた角の四角に沿ってifのステートメントが必要です。その周りに境界線を置くだけで、安全にすべてを検索することができます。ifステートメントを保存して、分岐を保存し、パイプラインの問題を解消し、より速く検索します。

Jonに:ゲームの再生/解決の検索アルゴリズムを作成している場合、これらの種類のものは、現代のマシンであっても、高性能設定では本当に問題になります。ご存じの場合、可能な限り迅速に基礎シミュレーションを実行して、できるだけ深いところで検索してください。

2

アルゴリズムについて:確かにゲームに依存します。たとえばテトリスの場合、同じ色の場合は各行をスキャンするだけです。私はこの場合ブルートフォースアプローチに等しくないものを考えることさえできません。しかし、ほとんどのカジュアルゲームのブルートフォースは完璧にすべきです。パターン認識は、グラフィックスやサウンド処理と比較して無視できるものでなければなりません。

構造について:ボードを表現するには、単純な2D配列で十分です。

0

は、これらの日平均のコンピュータの速度を考えると、ユーザーがゲームをプレイしているとして、それがリアルタイムだ場合、それはおそらく(EDIT:唯一の非常に小さなゲームボード用)の問題ではありません。確かに、ゲームロジックの複雑さにもよりますが、ターゲットマシンでコードを実行する速度(つまり、これはJavaScriptのWebページゲームか、C++で書かれたWindowsアプリです)に依存します。

これは、より効率的なのアルゴリズムを使用し、その後、ゲームプレイ戦略をシミュレートするようなもののためである場合。

より効率的な戦略は、ゲームボードに増分変更、代わりの再スキャンボード全体のたびに追跡を伴う可能性があります。

関連する問題