views:

264

answers:

3

Well I have been through many sites teaching on how to solve it, but was wondering how to create it. I am not interested much in the coding aspects of it, but wanted to know more on the algorithms behind it. For example, when the grid is generated with 10 mines or so, I would use any random function to distribute itself across the grid, but then again how do I set the numbers associated to it and decide which box to be opened? I couldn't frame any generic algorithm on how would I go about doing that.

+5  A: 

You just seed the mines and after that, you traverse every cell and count the neighbouring mines.

Or you set every counter to 0 and with each seeded mine, you increment all neighbouring cells counters.

phimuemue
+7  A: 

Perhaps something in the lines of :

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

That's pretty much it...

** EDIT **

Because this algorithm could lead into creating a board with some mines grouped too much together, or worse very dispersed (thus boring to solve), you can then add extra validation when generating mine_x and mine_y number. For example, to ensure that at least 3 neighboring cells are not mines, or even perhaps favor limiting the number of mines that are too far from each other, etc.

** UPDATE **

I've taken the liberty of playing a little with JS bin here came up with a functional Minesweeper game demo. This is simply to demonstrate the algorithm described in this answer. I did not optimize the randomness of the generated mine position, therefore some games could be impossible or too easy. Also, there are no validation as to how many mines there are in the grid, so you can actually create a 2 by 2 grid with 1000 mines.... but that will only lead to an infinite loop :) Enjoy!

Yanick Rochon
This would increment on top of mines already placed, so you'd want mines to be represented by a number that was negative enough that it wouldn't get incremented up to zero, like mine = -20. Then, every negative number is a mine.
Spencer Nelson
modified answer to be more precised
Yanick Rochon
i dont have problem placing the mines , but how to i get generate those numbers which are clues to identify the mines ? i aint have ne idea on that
Rahul
the algorithm will place the numbers giving the identity of the mines
Yanick Rochon
+2  A: 

If you want to place m mines on N squares, and you have access to a random number generator, you just walk through the squares remaining and for each square compute (# mines remaining)/(# squares remaining) and place a mine if your random number is equal to or below that value.

Now, if you want to label every square with the number of adjacent mines, you can just do it directly:

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
)

or if you prefer you can start off with an array of zeros and increment each by one in the 3x3 square that has a mine in the center. (It doesn't hurt to number the squares with mines.)

This produces a purely random and correctly annotated minesweeper game. Some random games may not be fun games, however; selecting random-but-fun games is a much more challenging task.

Rex Kerr
i can create the grid and use any random function to place the mines , but the challenge lies ahead , it when i try associating the numbers with those mines , i aint have an idea on how to go about doing them .
Rahul
I provided pseudocode (without bounds checking) that does exactly that. (Pay attention to the sum--you add up 9 values that are either 1 or 0 depending on whether there's a mine there.)
Rex Kerr