【问题标题】:How can i improve performance in this Minesweeper algorithm?如何提高扫雷算法的性能?
【发布时间】:2012-12-17 00:36:12
【问题描述】:

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

我怎样才能让它更快?

【问题讨论】:

  • tile.Reveal(); 是否提示渲染?
  • 延迟肯定是在绘制更新而不是计算更新。使用分析器来避免猜测。
  • 瓷砖是 System.Windows.Forms.Button。 Reveal() 只是禁用按钮并将 Text 设置为大于 0 的数字。
  • 那将触发一次绘制。

标签: c# recursion


【解决方案1】:

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

*false 是设计器的默认值,看看是什么意思

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

ALSO - 避免滥用异常机制,这既不是有效的做法,也是不好的做法

改为使用墙(矩阵末端的额外瓷砖表示……嗯……墙)。

【讨论】:

    【解决方案2】:

    我猜 RevealNeighbor 实际上会重新绘制 Board。相反,您应该计算将要显示的内容,然后才重新绘制 Board。

    【讨论】:

      猜你喜欢
      • 2014-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多