我目前正在制作扫雷克隆。 我做了一个算法,当点击一个有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}
};
如何让它更快?
答案 0 :(得分:3)
使用SuspendLayout方法,仅在需要时绘制:
* false是设计师的默认设置,找出它的含义
this.SuspendLayout();
... logic
this.ResumeLayout(false);
另外 - 避免滥用例外机制,这不是有效和不好的做法
改为使用墙(矩阵末端的额外图块表示..井......墙)。
答案 1 :(得分:1)
我猜RevealNeighbor实际重绘了董事会。相反,你应该计算将被揭示的内容,然后重新绘制董事会。