2010-08-26 26 views
15

Bueno, he estado en muchos sitios enseñando cómo resolverlo, pero me preguntaba cómo crearlo. No me interesan demasiado los aspectos de codificación, pero quería saber más sobre los algoritmos que lo respaldan. Por ejemplo, cuando la cuadrícula se genera con 10 minas más o menos, usaría cualquier función aleatoria para distribuirse a través de la cuadrícula, pero nuevamente ¿cómo establezco los números asociados a ella y decido qué casilla abrir? No pude enmarcar ningún algoritmo genérico sobre cómo iba a hacer eso.¿Cuál es el algoritmo detrás de la generación de buscaminas

+1

Cada mina debería simplemente incrementar cada celda vecina que no sea una mina. – cthom06

+0

que resuelve para todos los ... pero qué pasa con 3 y 4. ¿Cómo incorporaré esos dígitos? si el modo en que lo analizo solo funciona para los únicos – Rahul

+0

posible duplicado de [algoritmo Buscaminas] (http: // stackoverflow.com/questions/1738128/minesweeper-algorithm) – BoltClock

Respuesta

13

Tal vez algo en la línea de:

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 

Eso es más o menos lo ...

** ** EDITAR

Debido a que este algoritmo podría plomo en la creación de una tablero con algunas minas agrupadas demasiado juntas, o peor muy dispersas (por lo tanto aburrido de resolver), puede agregar validación adicional al generar mine_x y mine_y número. Por ejemplo, para asegurar que por lo menos 3 células vecinas no son minas, o incluso tal vez a favor de limitar el número de minas que están demasiado lejos unos de otros, etc.

** ** ACTUALIZACIÓN

I Me he tomado la libertad de jugar un poco con JS bin aquí se le ocurrió un funcional Minesweeper game demo. Esto es simplemente para demostrar el algoritmo descrito en esta respuesta. No optimicé la aleatoriedad de la posición de la mina generada, por lo tanto, algunos juegos podrían ser imposibles o demasiado fáciles. Además, no hay ninguna validación en cuanto a la cantidad de minas que hay en la cuadrícula, por lo que puedes crear una cuadrícula de 2 por 2 con 1000 minas ... pero eso solo conducirá a un ciclo infinito :) ¡Disfruta!

+2

Esto se incrementaría sobre las minas ya colocadas, por lo que querría que las minas estuvieran representadas por un número que fue lo suficientemente negativo como para no aumentarse hasta cero, como el mío = -20. Entonces, cada número negativo es una mina. –

+0

respuesta modificada para ser más preciso –

+0

No tengo problemas para colocar las minas, pero ¿cómo puedo generar esos números que son pistas para identificar las minas? No tengo ni idea en ese – Rahul

4

Simplemente siembras las minas y luego atraviesas cada celda y cuentas las minas vecinas.

O establece cada contador a 0 y con cada mina con semilla, incrementa todos los contadores de celdas vecinas.

2

Si desea colocar m minas en N cuadrados, y tiene acceso a un generador de números aleatorios, simplemente caminar a través de los cuadrados restantes y para cada cálculo cuadrado (# minas restantes)/(# plazas restantes) y lugar una mina si su número aleatorio es igual o inferior a ese valor.

Ahora, si usted quiere etiquetar cada cuadrado con el número de minas adyacentes, sólo puede hacerlo directamente:

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 
) 

o si lo prefiere, puede comenzar con una serie de ceros y de incrementar cada por uno en el cuadrado 3x3 que tiene una mina en el centro. (No hace daño numerar los cuadrados con minas.)

Esto produce un juego de buscaminas totalmente aleatorio y correctamente anotado. Sin embargo, algunos juegos aleatorios pueden no ser juegos divertidos; seleccionar juegos aleatorios pero divertidos es una tarea mucho más desafiante.

+0

puedo crear la cuadrícula y usar cualquier función aleatoria para colocar las minas, pero el desafío está por venir, cuando intento asociar los números con esas minas, no tengo ni idea de cómo hacerlas. – Rahul

+0

Proporcioné pseudocódigo (sin comprobación de límites) que hace exactamente eso. (Preste atención a la suma: agrega 9 valores que son 1 o 0 dependiendo de si hay una mina allí). –

Cuestiones relacionadas