【问题标题】:Minesweeper neighbor count扫雷邻居计数
【发布时间】:2015-04-16 13:27:55
【问题描述】:

我正在尝试复制 Minesweeper,但在计算属于地雷的邻居时遇到了问题。这似乎是一件很容易实现的事情,但由于某种原因,我并没有在任何地方都得到想要的结果。我有一个表示每个图块的一维整数数组。考虑到它可能具有可变的网格大小,我想要一种方法来分别获取图块的每个邻居。这是我的代码的样子:

int num = 0;

if (i + 1 < 16 && graph[i + 1] == -1)
    num++;
if (i - 1 >= 0 && graph[i - 1] == -1)
    num++;
if (i + 3 < 16 && graph[i + 3] == -1)
    num++;
if (i - 3 >= 0 && graph[i - 3] == -1)
    num++;
if (i + 4 < 16 && graph[i + 4] == -1)
    num++;
if (i - 4 >= 0 && graph[i - 4] == -1)
    num++;
if (i + 5 < 16 && graph[i + 5] == -1)
    num++;
if (i - 5 >= 0 && graph[i - 5] == -1)
    num++;

return num;

我没有得到我想要的最左边和最右边图块的结果。有时,最下面和最上面的瓷砖也会出现问题。我的代码使用了一个固定大小为 4x4(int[16]) 的网格(显然我称之为图形 :))。

提前致谢。

【问题讨论】:

  • 使用二维数组或更好的二维向量会使这更容易。

标签: c++ minesweeper neighbours


【解决方案1】:

您的条件不正确。如果玩家位于网格的右边缘,则 i-3 将是网格的左侧。

为了解决这个问题,您可以添加额外的检查以查看您是否处于优势地位。例如

if (i - 3 >= 0 && (i+1) % 4 > 0 && graph[i - 3] == -1)
    num++;

您需要对大多数其他 if 语句进行类似检查(除 +/- 4 之外的所有语句)。

【讨论】:

    【解决方案2】:

    我认为错误来自您认为数据的存储方式与实际存储方式。如果我理解正确,您的代码 sn-p 当前会查看与您的ith 位置同一行(或可能是列)上的几个邻居。

    此答案包含有关如何将 2D 网格线性化为 1D 数组的很好的解释:Convert a 2D array index into a 1D index

    或者,使用 2D 数组(或者更好的是,std::vector&lt;std::vector&lt;int&gt; &gt; 可能会使事情变得更清晰,更不容易出错。在这种情况下,性能成本可以忽略不计。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 2021-06-10
      • 2014-08-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多