Возможно, что-то в строках:
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, здесь я получил функциональную демоверсию игры Minesweeper .Это просто для демонстрации алгоритма, описанного в этом ответе.Я не оптимизировал случайность сгенерированной шахты, поэтому некоторые игры могут быть невозможными или слишком легкими.Кроме того, нет никакой проверки того, сколько мин в сетке, поэтому вы можете создать сетку 2 на 2 с 1000 мин ... но это приведет только к бесконечному циклу :) Наслаждайтесь!