2

マインスイーパ ゲームを作成していますが、これまでのところ完全にプレイ可能で、ゲームを終了できます。しかし、私の解決アルゴリズムは最悪です。それはかなり厄介で、おそらくループを使用して、よりクリーンな方法を探していますが、何も考えられません。

これが私が現在使用しているものです:

4 つのグローバル リストがあります。

    List<String> flaggedButtons = new List<String>();
    List<String> minedNodes = new List<String>();
    List<String> playingField = new List<String>();
    List<String> adjacence = new List<String>();

これは、リストを利用してゲームを解決する方法です。

メソッド全体: http://pastebin.com/7J2Fc8yw

最も重要な部分:

            char btnLetter = Convert.ToChar(buttonName.Substring(0, buttonName.Length - 1));
            char aboveLetter = btnLetter; aboveLetter--;
            char belowLetter = aboveLetter; belowLetter++; belowLetter++;
            int upDown = Convert.ToInt32(buttonName.Substring(1));
            int leftSide = Convert.ToInt32(buttonName.Substring(1)) - 1;
            int rightSide = Convert.ToInt32(buttonName.Substring(1)) + 1;

            //Clear the list by making a new list before adding the new values as to not overlap.
            adjacence = new List<String>();

            //Put all adjacent sides in to a list
            adjacence.Add(Convert.ToString(btnLetter.ToString() + leftSide));
            adjacence.Add(Convert.ToString(btnLetter.ToString() + rightSide));
            adjacence.Add(Convert.ToString(aboveLetter.ToString() + leftSide));
            adjacence.Add(Convert.ToString(aboveLetter.ToString() + rightSide));
            adjacence.Add(Convert.ToString(belowLetter.ToString() + leftSide));
            adjacence.Add(Convert.ToString(belowLetter.ToString() + rightSide));
            adjacence.Add(Convert.ToString(aboveLetter.ToString() + upDown));
            adjacence.Add(Convert.ToString(belowLetter.ToString() + upDown));

基本的に、これは私が助けを必要としている部分です。動作しますが、面倒です。ループなどを使用する必要があることはわかっていますが、これをループしてクリーンにする方法がわかりません。基本的には、押したタイルの周囲にある 8 つの隣接するタイルをすべて見つけます。何か案は?ありがとう :)

4

1 に答える 1

5

フラッド フィルを使用します。これは、MS が使用するアルゴリズムです。文字列を使用せずにセル値を格納する配列に変更してください。

enum CellType 
{
   Bomb,
   Flag,
   Hidden,  
   Empty
}

CellType[,] cells = new CellType[10,10];

基本的に、誰かがセルチェックをクリックして非表示かどうかを確認するときは、その周囲のセルが非表示になっているかどうかを確認します。その周りの非表示の各セルは、キューまたはスタックに追加してからトラックに戻ります。 http://en.wikipedia.org/wiki/Flood_fill

更新: C# の完全な例を次に示します。これらは、バックトラッキングにコレクションを使用する代わりに再帰的です https://gamedev.stackexchange.com/questions/31909/best-algorithm-for-recursive-adjacent-tiles

于 2012-10-31T09:23:20.437 に答える