De un traductor: esta publicaci贸n es una traducci贸n del
art铆culo original de Maki Chiz, un codificador experimentado que no solo escribe excelentes programas, sino que tambi茅n demuestra las capacidades de varios idiomas a sus colegas, tanto principiantes como profesionales.
Buscaminas es un juego divertido, muchos de nosotros lo jugamos. 驴Tal vez quieres hacer Buscaminas t煤 mismo?
Skillbox recomienda: La profesi贸n en l铆nea "Profesi贸n de desarrollador web" .
Le recordamos: para todos los lectores de "Habr": un descuento de 10.000 rublos al registrarse en cualquier curso de Skillbox con el c贸digo de promoci贸n "Habr".
La singularidad del juego es que es muy simple y al mismo tiempo muy emocionante. No hay una mec谩nica de juego astuta en Buscaminas, solo tienes que hacer clic en los cuadrados, con la esperanza de que no haya minas debajo de ellos.
Sugiero tratar de escribir "Buscaminas" en Procesamiento. Esta es una gran herramienta que le permite crear aplicaciones gr谩ficas en Java. Enlace a esto
aqu铆 .
Antes de comenzar, dir茅 que este tutorial est谩 dirigido a aquellos que ya conocen Java. La experiencia con el procesamiento es opcional.
Entonces aqu铆 vamos. El primer paso es determinar el estado del juego. Decid铆 implementarlo as铆.
int gridW;
Aqu铆 todo parece tener sentido, excepto esta secci贸n:
int [] [] mines . 驴Por qu茅 la cuadr铆cula de la mina es un n煤mero entero y no un booleano? El hecho es que esto hace que sea f谩cil calcular cu谩ntas minas hay cerca de una determinada posici贸n.
int calcNear(int x, int y) { int i=0; for (int offsetX=-1; offsetX<=1; offsetX++) { for (int offsetY=-1; offsetY<=1; offsetY++) { i+=mines[offsetX+x][offsetY+y]; } } return i; }
Este c贸digo determina cu谩ntas minas se encuentran cerca de un sitio espec铆fico. Despu茅s de eliminar las excepciones, obtenemos algo similar a esto:
boolean outBounds(int x,int y){ return x<0||y<0||x>=gridW||y>=gridH; } int calcNear(int x, int y) { if(outBounds(x,y))return 0; int i=0; for (int offsetX=-1; offsetX<=1; offsetX++) { for (int offsetY=-1; offsetY<=1; offsetY++) { if (outBounds(offsetX+x, offsetY+y))continue; i+=mines[offsetX+x][offsetY+y]; } } return i; }
La tarea principal del juego en s铆 es revelar los cuadrados que comienzan en el punto x, y.
void reveal(int x, int y){ if(outBounds(x,y))return; if(revealed[x][y])return; revealed[x][y]=true; if(calcNear(x,y)!=0)return; reveal(x-1,y-1); reveal(x-1,y+1); reveal(x+1,y-1); reveal(x+1,y+1); reveal(x-1,y); reveal(x+1,y); reveal(x,y-1); reveal(x,y+1); }
Como resultado, tenemos el siguiente algoritmo:
- Si la posici贸n est谩 fuera del campo, finalice;
- Si se revela la posici贸n, finalice;
- Abrimos la posici贸n actual;
- Si tenemos una bomba cerca de la posici贸n actual, finalice;
- Si llegamos a este punto durante la ejecuci贸n de la funci贸n, se encontr贸 la posici贸n actual dentro del campo de juego y no hay bombas al lado, abre cuadrados adyacentes.
B谩sicamente, el resto del juego es el mismo. El c贸digo completo se puede encontrar haciendo clic en
este enlace .
Si quieres saber sobre visualizaci贸n, sigue leyendo.
Visualizaci贸nAqu铆 todo deber铆a quedar claro, pero explicar茅 las partes dif铆ciles.
Entonces, tenemos una variable cellSize, que determina el n煤mero de p铆xeles en cada cuadrado.
void settings(){ size(gridW*cellSize, gridH*cellSize); }
Por lo tanto, creamos un campo con lados gridW x gridH, donde los tama帽os de cada cuadrado ser谩n iguales al valor de cellSize.
Luego devolvemos las variables a su estado original.
void setup(){
Para inicializar un campo:
Y luego active la respuesta a los clics del mouse.
Y la funci贸n de visualizaci贸n, la llamamos una vez para cada cuadro.
void draw() { background(0);
Y eso es todo, aqu铆 est谩 nuestro Buscaminas.
El juego parece simple, pero en general es completamente funcional. Y recuerda: 隆Buscaminas es adictivo!
Skillbox recomienda: