繁体   English   中英

如何提高此扫雷算法的性能?

[英]How can i improve performance in this Minesweeper algorithm?

我目前正在制作扫雷克隆。 我做了一个算法,当点击一个有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);

另外 - 避免滥用例外机制,这不是有效和不好的做法

而是使用一个墙 (矩阵末端的额外瓷砖表示......井......墙)。

我猜RevealNeighbor实际上重绘了董事会。 相反,你应该计算将被揭示的内容,然后重新绘制董事会。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM