4

私は現在、マインスイーパのクローンを作成しています。私は、周囲の地雷が 0 のタイルをクリックすると、周囲の地雷が 0 のすべての隣人を明らかにし、次に周囲の地雷が 0 のそれらのすべての隣人を明らかにするアルゴリズムを作成しました... (再帰)。この結果は 1 回クリックするだけで済みます。

正常に動作しますが、遅すぎます。元のマインスイーパはこれらのタイルを即座に明らかにしますが、私の場合、明らかにする間に少し遅れがあります.

私はこのコードを書きました:

private void RevealNeighbor(int x, int y) {
    foreach(var neighbor in _neighbors) {
        try {
            Tile tile = _tiles[x + neighbor[0], y + neighbor[1]];
            if(tile.TileType == TileType.Empty && tile.Hidden) {
                tile.Reveal();
                if(tile.Number == 0) {
                    RevealNeighbor(x + neighbor[0], y + neighbor[1]);
                }
            }
        }
        catch(IndexOutOfRangeException) {
        }
    }
}

_neighbors配列の配列で、隣接する 8 つの位置オフセットがあります。

private readonly int[][] _neighbors = new[] {
                                          new[] {-1, -1},
                                          new[] {0, -1},
                                          new[] {1, -1},
                                          new[] {1, 0},
                                          new[] {1, 1},
                                          new[] {0, 1},
                                          new[] {-1, 1},
                                          new[] {-1, 0}
                                      };

どうすれば速くなりますか?

4

2 に答える 2

3

SuspendLayout メソッドを使用して、必要な場合にのみ描画します。

* false はデザイナのデフォルトです。その意味を調べてください

this.SuspendLayout();
... logic      
this.ResumeLayout(false);

また、例外メカニズムの悪用は避けてください。効率的ではなく、悪い習慣です

代わりに壁を使用してください(マトリックスの最後にある追加のタイルは..まあ..壁を示しています)。

于 2012-12-16T16:22:41.020 に答える
1

RevealNeighbor が実際にボードを再描画していると思います。代わりに、何が明らかになるかを計算してから、ボードを再描画する必要があります。

于 2012-12-16T15:58:57.503 に答える