18

好吧,我已经通过许多网站教授如何解决它,但想知道如何创建它。我对它的编码方面不太感兴趣,但想更多地了解它背后的算法。例如,当网格由大约 10 个地雷生成时,我会使用任何随机函数将自身分布在网格中,但我又该如何设置与其关联的数字并决定打开哪个盒子?我无法制定任何通用算法来说明我将如何去做。

4

3 回答 3

16

也许是这样的:

grid = [n,m]   // initialize all cells to 0
for k = 1 to number_of_mines
   get random mine_x and mine_y where grid(mine_x, mine_y) is not a mine
   for x = -1 to 1
      for y = -1 to 1
         if x = 0 and y = 0 then
            grid[mine_x, mine_y] = -number_of_mines  // negative value = mine
         else 
            increment grid[mine_x + x, mine_y + y] by 1

差不多就是这样...

**编辑**

因为这个算法可能会导致创建一个板,其中一些地雷组合在一起太多,或者更糟糕的是非常分散(因此解决起来很无聊),然后您可以在生成mine_xmine_y编号时添加额外的验证。例如,确保至少 3 个相邻单元不是地雷,或者甚至可能倾向于限制彼此相距太远的地雷数量等。

**更新**

我冒昧地玩了一点 JS bin 在这里想出了一个功能性扫雷游戏演示。这只是为了演示此答案中描述的算法。我没有优化生成地雷位置的随机性,因此有些游戏可能是不可能的或太容易了。此外,没有关于网格中有多少地雷的验证,因此您实际上可以创建一个包含 1000 个地雷的 2 x 2 网格......但这只会导致无限循环 :) 享受吧!

于 2010-08-26T18:55:42.243 回答
5

您只需播种地雷,然后遍历每个单元格并计算相邻的地雷。

或者,您将每个计数器设置为 0,并使用每个播种的地雷,递增所有相邻单元格计数器。

于 2010-08-26T18:52:03.090 回答
3

如果你想m在方块上放置地雷N,并且你可以使用随机数生成器,你只需遍历剩余的方块并为每个方块计算(剩余的#地雷)/(剩余的#方块)并放置一个地雷,如果你的随机数等于或低于该值。

现在,如果你想用相邻地雷的数量标记每个方格,你可以直接这样做:

count(x,y) = sum(
  for i = -1 to 1
    for j = -1 to 1
      1 if (x+i,y+j) contains a mine
      0 otherwise
)

或者,如果您愿意,您可以从一个零数组开始,然后在中心有一个地雷的 3x3 正方形中将每个零递增。(用地雷给方格编号并没有什么坏处。)

这产生了一个纯粹随机且正确注释的扫雷游戏。然而,一些随机游戏可能不是有趣的游戏;选择随机但有趣的游戏是一项更具挑战性的任务。

于 2010-08-26T19:16:49.680 回答