我目前正在制作扫雷艇克隆。
我做了一个算法,当点击一个周围有 0 个地雷的图块时,会显示所有有 0 个周围地雷的邻居,然后显示所有有 0 个周围地雷的邻居......(递归)。
这个结果只需要一键:

它像它应该的那样工作,但它太慢了。最初的扫雷艇会立即显示这些瓷砖,但在我的情况下,它们在显示之间有一点延迟。

我写了这段代码:

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}
                                      };

我怎样才能让它更快?

最佳答案

使用 SuspendLayout 方法,仅在需要时绘制:

*false 是设计器的默认值,了解它的含义

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

ALSO - 避免滥用 Exceptions 机制,这不是高效和不好的做法

改为使用墙 (矩阵末尾的额外瓷砖表示......好吧......一堵墙)。

关于c# - 我怎样才能提高这个扫雷算法的性能?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13902957/

10-12 12:48