扫雷一代背后的算法是什么?

时间:2010-08-26 18:50:28

标签: algorithm minesweeper

好吧,我已经通过许多网站教授如何解决它,但是想知道如何创建它。我对它的编码方面不感兴趣,但想了解更多关于它背后的算法。例如,当网格生成10个左右时,我会使用任何随机函数在网格上分布自己,但是我又如何设置与之关联的数字并决定打开哪个框?我无法构建任何通用算法,如何进行此操作。

3 个答案:

答案 0 :(得分:15)

或许有以下几点:

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

这就是它......

** 编辑 **

因为这个算法可以导致创建一个板块,其中一些地雷组合在一起太多,或者更糟糕地分散(因此无聊解决),然后您可以在生成{{1}时添加额外的验证}和mine_x号码。例如,确保至少3个相邻的小区不是地雷,或者甚至可能有利于限制相距太远的地雷数量等。

** 更新 **

我冒昧地用JS bin玩了一下这里有一个功能Minesweeper game demo。这只是为了演示本答案中描述的算法。我没有优化生成的矿井位置的随机性,因此有些游戏可能不可能或太容易。此外,没有关于网格中有多少个地雷的验证,所以你实际上可以用1000个地雷创建一个2乘2的网格....但这只会导致无限循环:)享受!

答案 1 :(得分:4)

你只是播种地雷,然后你遍历每个细胞并计算邻近的地雷。

或者你将每个计数器都设置为0,并且每个看台的矿井都会增加所有相邻的单元格计数器。

答案 2 :(得分:3)

如果你想在m方格上放置N个地雷,并且你可以访问一个随机数生成器,你只需要浏览剩下的方格和每个方形计算(剩下的#mines)/ (#个剩余的方格)如果您的随机数等于或低于该值,则放置一个矿。

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

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广场中逐一递增。 (用地雷对方格进行编号并没有什么坏处。)

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