El código fuente del juego es compartido.
Código fuente uno * * *Dos archivos: Mine.java, MGame.java y algunas imágenes.
Cree un nuevo proyecto en JBuilder, copie los dos archivos fuente al directorio src\mine en el directorio del proyecto y copie todas las imágenes al directorio src\images.
Análisis de puntos
Estructura de datos
Primero debemos explicar la cuadrícula de matriz utilizada para almacenar información minera.
Grid es una matriz bidimensional, el primer dígito corresponde a la fila de la tabla y el segundo dígito corresponde a la columna de la tabla. Por ejemplo, grid[y][x] significa fila y y columna x. El significado de cada byte se divide en tres secciones: 0-9 significa que ha sido excavado; 10-19 significa que todavía está enterrado; 20-29 significa que está marcado; En cada párrafo: 0-8 representa el número de minas alrededor; 9 representa la mía.
Función NewGame()
Se utiliza para iniciar un nuevo juego.
Porque cada vez que se entierra una mina de forma aleatoria, se debe generar nueva información de la mina para comenzar una nueva partida.
El primer paso es inicializar la cuadrícula y configurar todo en 10, ya que inicialmente todas las cuadrículas están enterradas.
for(I = 0; i lt alto; i )
{
for(j = 0; j lt ancho; j )
grid[j]= 10;
}
El segundo paso es generar minas aleatoriamente. Por supuesto, se deben evitar las zonas donde se han producido minas.
for(I = 0; IltMINECOUNTi)
{
mientras(verdadero)
{
x = math . ABS(rand . nextint()) Ancho;
y = math . ABS(rand . nextint()) Alto;
if (grid[y][x ] ! = 19)
{
cuadrícula[y][x]= 19;
Romper;
}
}
}
Finalmente, cuenta el número de minas alrededor del área libre de minas. ¿Cómo calcular? Simplemente agréguelos uno por uno.
Minería y marcado
Echemos un vistazo a la función keypress(int kcode). Presionar el botón 1 es una acción de excavación.
La primera mitad significa que si el foco actual está en una celda enterrada (el valor está entre 10 y 19), entonces el valor se reduce en 10, lo que significa que ahora está excavada. Por supuesto, si no hay minas subterráneas ni minas alrededor (el valor es igual a 0), entonces debe desplegarse automáticamente. Aquí se llama a expand() y (selx, sely) son las coordenadas de la tabla del foco actual.
La segunda mitad significa que si el foco actual está en una cuadrícula minada (el valor es menor que 10), entonces se llama a SafeExp() para minar automáticamente las cuadrículas circundantes no excavadas.
Pulsar la tecla 3 es una acción de marcado. Si la cuadrícula actual es una cuadrícula enterrada, márquela (valor más 10); si la celda actual ya está marcada, elimine la marca (valor menos 10);
Expansión automática
Expand() es una función anidada que extrae todos los bloques que no están rodeados de minas. Si todavía hay bloques sin minas alrededor de la parte excavada, repita la operación anterior para estos bloques hasta que todos los bloques relevantes estén excavados. El orden de excavación es izquierda, arriba, derecha, izquierda, derecha, izquierda, abajo, abajo, derecha. Si encuentra una malla sin minas circundantes (valor 0), anide inmediatamente y llame a Expand() para procesar la malla.
SafeExp() es una función que extrae automáticamente la malla sin cortar circundante.
Por supuesto, existe una condición para realizar esta función, es decir, el número de cuadrados marcados a su alrededor debe ser igual al número de cuadrados marcados en la cuadrícula actual, es decir, el jugador ha marcado todas las minas circundantes ( independientemente de que estén mal marcados). La primera parte de la función es juzgar las condiciones anteriores.
La segunda parte consiste en excavar las rejillas enterradas circundantes. Sin embargo, debido a errores del jugador, las cuadrículas sin minas pueden estar marcadas y las cuadrículas con minas omitidas, por lo que es necesario verificar primero las cuadrículas sin minas y las cuadrículas con marcas incorrectas. Si no tiene estos errores, puede abrirlo de forma segura. También verifica si cavaste una cuadrícula sin minas a su alrededor. Si es así, llame a Expandir().
El valor de retorno de SafeExp() indica si la mina ha sido detonada, es decir, está marcado como un error. Verdadero significa sí, falso significa no. Esto se usa principalmente para determinar si el juego es. va a terminar.
Introducción a la clase
Imagen extendida de caché de imagen
ExtendedImage es una clase especial extendida por el propio Siemens y solo existe en Java de Siemens.
Esta clase se utiliza principalmente para el almacenamiento en caché de imágenes. No sabemos si tenemos alguna impresión. En el pasado, al programar en una PC, a menudo se abría un caché de pantalla debido a la baja velocidad de visualización. Primero dibuje el contenido real en este caché y luego muéstrelo todo a la vez. La clase ExtendedImage desempeña este papel. De hecho, la clase Image que viene con Java también puede lograr funciones similares, pero la velocidad de visualización parece no ser satisfactoria. ExtendedImage es más fácil de usar, así que básicamente uso esta clase. Por supuesto, esto va en detrimento de la generalidad.
Las funciones principales de ExtendImage son:
eliminar vacío (color de byte);
rellenar toda el área de gráficos con el color dado.
void blitToScreen(int x, int y);
Pegue el contenido almacenado en caché en la pantalla, donde (x, y) es la coordenada de la esquina superior izquierda de la pantalla.
image getImage();
Devuelve la clase de imagen estándar. Los objetos gráficos relacionados con él se pueden obtener a través de extensinimage. obtener imagen(). getgraphics(), usa extensinimage para hacer dibujos en él.