Los ejemplos en este artículo comparten con usted el código específico de implementación de Java Tetris para su referencia. El contenido específico es el siguiente
Guarde el mapa del juego usando una matriz 2D:
// Game Map Grid, cada cuadrícula guarda un cuadrado, registro de matriz el estado de estado de estado de estado [] [] = nuevo estado [filas] [columnas];
Inicialice todas las cuadrículas en el mapa para vaciar antes del juego:
/* Inicializar todos los bloques para vaciar*/for (int i = 0; i <map.length; i ++) {for (int j = 0; j <map [i] .length; j ++) {map [i] [j] = state.empty; }}Durante el juego, podemos ver los bloques en la interfaz, por lo que tenemos que dibujar todos los bloques en el mapa. Por supuesto, además de dibujar los bloques, los puntos del juego y el final del juego también deben dibujarse cuando sea necesario:
/*** Dibuja el contenido del formulario, incluidos los bloques de juego, los puntos de juego o la cadena final*/@overridePublic Void Paint (Graphics g) {super.paint (g); for (int i = 0; i <shows; i ++) {for (int j = 0; j <columnas; j ++) {if (map [i] [j] == state.active) {// dibujar el bloque activo g.setColor (activeColor); G.FillRoundrect (j * block_size, i * block_size + 25, block_size - 1, block_size - 1, block_size / 5, block_size / 5); } else if (map [i] [j] == state.stoped) {// dibujar un bloque estático G.SetColor (StopedColor); G.FillRoundrect (j * block_size, i * block_size + 25, block_size - 1, block_size - 1, block_size / 5, block_size / 5); }}} /* Imprimir puntaje* / G.SetColor (Scorecolor); G.SetFont (New Font ("Times New Roman", Font.Bold, 30)); G.DrawString ("Score:" + TotalScore, 5, 70); // El juego termina, imprima la cadena final if (! IsoRingon) {g.setColor (color.red); G.SetFont (New Font ("Times New Roman", Font.Bold, 40)); G.DrawString ("Juego Over!", this.getWidth () / 2 - 140, this.getheight () / 2); }}Varios tipos de gráficos compuestos de cuadrados son generados por números aleatorios. En general, siete tipos de gráficos: barra, campo, regular 7, reverso 7, en forma de T, en forma de Z y en forma de Z inversa, como generar barras:
MAP [0] [RandPOS] = MAP [0] [RandPos - 1] = MAP [0] [Randpos + 1] = MAP [0] [Randpos + 2] = State.Active;
Después de generar los gráficos, se implementan el paradero. Si te encuentras con obstáculos, no puedes continuar cayendo:
isfall = verdadero; // Whether it can fall// Check from the current line, stop the fall if an obstacle is encountered for (int i = 0; i < blockRows; i++) { for (int j = 0; j < columns; j++) { // If the block in the line is an active block, the block is a static block, the block is encountered if (map[rowIndex - i][j] == State.ACTIVE && map[rowIndex - i + 1] [j] == state.stoped) {isfall = false; // Detener las vacaciones de otoño; }} if (! isfall) break;}Si no se encuentra ningún obstáculo, el diagrama de bloques se moverá por una línea en su conjunto:
// El gráfico cae una fila para (int i = 0; i <blockrows; i ++) {para (int j = 0; j <columnas; j ++) {if (map [rowIndex - i] [j] == state.active) {// El bloque activo se reduce un mapa de fila [rowIndex - i] [j] = state.empty; // El bloque activo original se convierte en un mapa de bloque vacío [rowIndex - i + 1] [j] = state.active; // La siguiente línea de bloque se convierte en un bloque activo}}}Una operación similar es cuando se mueve hacia la izquierda y la derecha:
/*** Vete a la izquierda*/private void izquierdo () {// Marque si hay un obstáculo en el booleano izquierdo Hasblock = false; /* Compruebe si hay un obstáculo en la izquierda*/ for (int i = 0; i <blockrows; i ++) {if (map [rowIndex - i] [0] == state.active) {// verifique si la izquierda es un muro hasblock = true; romper; // Hay un obstáculo, no es necesario que se acumule para juzgar la fila} else {for (int j = 1; j <columnas; j ++) {// verifique si hay otros bloques en el if izquierdo (map [rowIndex - i] [j] == state.active && map [rowIndex - i] [j - 1] == state.poped) {hablock = verdad; verdadero; romper; // Hay un obstáculo, no es necesario reciclar la columna de juicio}} if (hasblock) ruptura; // Hay un obstáculo, no es necesario reciclar la fila del juicio}}/* no hay obstáculo a la izquierda, mueva la figura a la izquierda por la distancia de un bloque*/ if (! Hasblock) {for (int i = 0; i <blockrows; i ++) {para (int j = 1; j <columns; j ++) {if (map [rowindex - i] [j] = state.eMe. i] [j - 1] = state.active;Cuando se mueve hacia abajo, reduce el intervalo de tiempo para cada estado normal cae:
/*** Ve directamente*/private void down () {// Las marcas pueden acelerar la caída inmediatamente = verdadero;}Cómo cambiar la dirección del gráfico, solo se usa un método muy simple aquí para lograr la transformación de la dirección. Por supuesto, puede haber un mejor algoritmo para implementar operaciones de transformación de dirección. Puedes estudiarlo tú mismo:
/*** Gire la forma cuadrada*/private void rotar () {try {if (shape == 4) {// cuadrado, la misma forma se devuelve antes y después de la rotación; } else if (shape == 0) {// Strip // matriz temporal, coloque la figura después del estado de rotación [] [] tmp = nuevo estado [4] [4]; int startcolumn = 0; // Encuentre la primera posición cuadrada al comienzo de la figura para (int i = 0; i <columnas; i ++) {if (map [rowIndex] [i] == state.active) {startColumn = i; romper; }} // Descubre si hay un obstáculo después de la rotación. Si hay un obstáculo, no gire para (int i = 0; i <4; i ++) {for (int j = 0; j <4; j ++) {if (map [rowIndex - 3+i] [j+startColumn] == state.stoped) {return; }}}} if (map [rowIndex] [startColumn+1] == state.active) {// barra horizontal, transformar en una barra vertical para (int i = 0; i <4; i ++) {tmp [i] [0] = state.active; para (int j = 1; j <4; j ++) {tmp [i] [j] = state.empty; }} blockrows = 4; } else {// barra vertical, transformar en barra horizontal para (int j = 0; j <4; j ++) {tmp [3] [j] = state.active; para (int i = 0; i <3; i ++) {tmp [i] [j] = state.empty; }} blockrows = 1; } // Modifique el gráfico en el mapa original a un gráfico transformado para (int i = 0; i <4; i ++) {for (int j = 0; j <4; j ++) {map [rowIndex - 3+i] [startColumn+j] = tmp [i] [j]; }}} else {// matriz temporal, coloque la rotación del estado de la figura [] [] tmp = nuevo estado [3] [3]; int startColumn = columnas; // Encuentre la primera posición de bloque al comienzo de la figura para (int j = 0; j <3; j ++) {para (int i = 0; i <columnas; i ++) {if (map [rowIndex - j] [i] == state.active) {startColumn = i <startColumn? I: StartColumn; }}} // Determine si habrá obstáculos después de la transformación para (int i = 0; i <3; i ++) {para (int j = 0; j <3; j ++) {if (map [rowIndex - 2+j] [startColumn+2 - i] == state.pent) return; }} // transformar para (int i = 0; i <3; i ++) {for (int j = 0; j <3; j ++) {tmp [2 - j] [i] = map [rowIndex - 2+i] [startColumn+j]; }} // Modifique el gráfico en el mapa original al gráfico transformado para (int i = 0; i <3; i ++) {para (int j = 0; j <3; j ++) {map [rowIndex - 2+i] [startColumn+j] = tmp [i] [j]; }} // repintear repint (); // Eliminar el puntero de línea para (int i = 0; i <3; i ++) {for (int j = 0; j <3; j ++) {if (map [rowIndex - i] [startcolumn+j]! = Null || map [rowIndex - i] [startcolumn+j]! = State.empty) {rowIndex = rowIndex - i; Blockrows = 3; devolver; }}}}}} Catch (Exception e) {// Si se encuentra un subíndice de matriz, significa que la forma del gráfico no se puede cambiar y no se realiza ningún procesamiento}}Cuando la figura cae y se detiene cuando encuentra obstáculos, debemos determinar si hay una cierta línea o varias líneas que pueden eliminarse. En este momento, primero podemos obtener el número de cuadrados en cada línea y luego hacer un juicio:
int [] blocksCount = new int [filas]; // Registre el número de columnas con bloques por fila int Eliminaterows = 0; // Número de filas eliminadas/* Calcule el número de bloques por fila*/for (int i = 0; i <filas; i ++) {blocksCount [i] = 0; for (int j = 0; j <columnas; j ++) {if (map [i] [j] == state.stoped) blocksCount [i] ++; }}Si hay una fila completa de bloques, se eliminará la fila de bloques:
/* Implementar la operación de eliminación de bloque con filas completas*/for (int i = 0; i <shows; i ++) {if (blocksCount [i] == columnas) {// clara una línea para (int m = i; m> = 0; m--) {for (int n = 0; n <columnas; n ++) {map [m] [n] = (m == 0)? State.Epty: mapa [m - 1] [n]; }} EliminAtows ++; // Registre el número de filas eliminadas}}Finalmente, podemos volver a pintar los puntos y mostrarlos.
Repita las operaciones anteriores de generar gráficos, descendientes gráficos, moverse hacia la izquierda y hacia la derecha, y juzgar la línea de eliminación, y se completará un tetris simple.
Efecto de ejecución:
Código de muestra completo: Tetris
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.