好吧,我已经通过许多网站教授如何解决它,但想知道如何创建它。我对它的编码方面不太感兴趣,但想更多地了解它背后的算法。例如,当网格由大约 10 个地雷生成时,我会使用任何随机函数将自身分布在网格中,但我又该如何设置与其关联的数字并决定打开哪个盒子?我无法制定任何通用算法来说明我将如何去做。
3 回答
也许是这样的:
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_x
和mine_y
编号时添加额外的验证。例如,确保至少 3 个相邻单元不是地雷,或者甚至可能倾向于限制彼此相距太远的地雷数量等。
**更新**
我冒昧地玩了一点 JS bin 在这里想出了一个功能性扫雷游戏演示。这只是为了演示此答案中描述的算法。我没有优化生成地雷位置的随机性,因此有些游戏可能是不可能的或太容易了。此外,没有关于网格中有多少地雷的验证,因此您实际上可以创建一个包含 1000 个地雷的 2 x 2 网格......但这只会导致无限循环 :) 享受吧!
您只需播种地雷,然后遍历每个单元格并计算相邻的地雷。
或者,您将每个计数器设置为 0,并使用每个播种的地雷,递增所有相邻单元格计数器。
如果你想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 正方形中将每个零递增。(用地雷给方格编号并没有什么坏处。)
这产生了一个纯粹随机且正确注释的扫雷游戏。然而,一些随机游戏可能不是有趣的游戏;选择随机但有趣的游戏是一项更具挑战性的任务。