好吧,我已经通过许多网站教授如何解决它,但是想知道如何创建它。我对它的编码方面不感兴趣,但想了解更多关于它背后的算法。例如,当网格生成10个左右时,我会使用任何随机函数在网格上分布自己,但是我又如何设置与之关联的数字并决定打开哪个框?我无法构建任何通用算法,如何进行此操作。
答案 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广场中逐一递增。 (用地雷对方格进行编号并没有什么坏处。)
这产生了一个纯粹随机且正确注释的扫雷游戏。然而,一些随机游戏可能不是有趣的游戏;选择随机但有趣的游戏是一项更具挑战性的任务。