Código fuente de estado
Utilice una matriz bidimensional para guardar el mapa del juego:
//? Cuadrícula del mapa del juego, cada cuadrícula guarda un cuadro y el La matriz registra el estado de la caja.
¿Privado? ¿estado? Mapa[][]? =?¿Nuevo? Estado [fila][columna]; 123
Inicializar todas las cuadrículas del mapa para vaciarlas antes de comenzar el juego:
/*?¿Inicializar todas las casillas para vaciarlas? */
¿Para qué? (int?i?=?0;?i?lt?map.length;?i)? {
¿Para qué? (int?j?=?0;?j?lt?map[i].length;?j)? {
mapa[i][j]? =?estado. Vacío;
}
}1234567
Durante el juego, podemos ver los cuadrados en la interfaz, por lo que necesitamos Los cuadrados están dibujados. Por supuesto, además de dibujar cuadrados, también debes dibujar puntuaciones y cadenas del juego al final del juego si es necesario:
/**
* ¿Dibujar el contenido de? el formulario, incluyendo cajas de juego, puntos de juego o cadena final.
*/
@cover
¿Público? ¿Vacío? ¿Pintar (gráfico? g)? {
super.paint(gram);
¿Para qué? (int?i?=?0;?i?lt?ok;?i)? {
¿Para qué? (int?j?=?0;?j?lt?columna;?j)? {
¿Y si? (Imagen [i] [j]? ==? Estado.Activo)? {?//?Dibujar bloque activo
g.set color(color activo);
g.fillRoundRect(j?*?Block size?i?*?BLOCK_SIZE? ?25 ,
BLOCK_SIZE?-?1,?BLOCK_SIZE?/?5);
} ?¿De lo contrario? ¿si? (Imagen [i] [j]? ==? Estado. DETENIDO)? {?//?Dibujar un bloque estacionario
g . set color(color detenido);
g.fillRoundRect(j?*?Block size?i?*?BLOCK_SIZE? ? 25,
BLOCK_SIZE?-?1,?BLOCK_SIZE?/?5);
}
}
}
/*?Imprimir partitura? */
g . set color(color de partitura);
g.setFont(new?Font("Times?New?Roman",?Font.Bold,?30) ) ;
g.drawString("Puntuación?:?"? Puntuación total,?5,?70);
//?El juego termina y se imprime la cadena final.
¿Y si? (! en curso)? {
g.setColor(Color.Red);
g.setFont(New?Font("Times?New?Roman",?Font.
Atrevido,? 40));
g.drawString("¿Juego? ¡¿Se acabó?!",?this.getWidth()?/?2?-?140,
this.getHeight( ) /?2);
}
}123456789101112131415161718192021222324252627282930313233343536
Varios gráficos compuestos de bloques se generan mediante números aleatorios, generalmente siete tipos de gráficos: forma de barra, forma de campo, forma de 7 regular, forma de 7 invertida, forma de T, forma de Z, forma de Z invertida.
¿Mapa[0][randPos]? =?Mapa[0][randPos? -?1]?=?Mapa[0][randPos? ?1]?
=?Map[0][randPos? ?2]?=?Estado. Activo; 123
Después de generar los gráficos, se implementa la operación de caída. Si encuentras obstáculos, no puedes seguir cayendo:
isFall? =?Verdadero;? //¿Se puede reducir?
//?Comienza a comprobar desde la línea actual y deja de caer cuando encuentres obstáculos.
¿Para qué? (int?i?=?0;?i?lt?blockRows?i)? {
¿Para qué? (int?j?=?0;?j?lt?columna;?j)? {
//?Si el bloque de esta fila es un bloque activo y el bloque de la siguiente fila es un bloque estático, encontrarás un obstáculo.
¿Y si? (map[rowIndex?-?i][j]?==?status.active
amp amp?map[rowIndex?-?i??1][j]?==?status. DETENIDO )? {
¿Es otoño? =?Falso;? //Dejar de caer
Romper;
}
}
¿Si? (!isFall)
Romper;
}123456789101112131415
Si no hay obstáculos, la forma cuadrada se moverá hacia abajo una línea entera al caer:
//?El número se redujo en una línea.
¿Para qué? (int?i?=?0;?i?lt?blockRows?i)? {
¿Para qué? (int?j?=?0;?j?lt?columna;?j)? {
¿Y si? (¿Gráfico[rowIndex?-?I][j]?==?Status.Active)? {?//?El bloque activo baja una línea.
mapa[rowIndex? -?Yo][j]? =?estado. Vacío;? ///?El bloque activo original queda vacío.
mapa[rowIndex? -?¿I? ?1][j]? =?estado. activo;? ///?El siguiente bloque se convierte en el bloque activo.
}
}
}12345678910
Mover hacia la izquierda y hacia la derecha son operaciones similares:
/**
*?Gire a la izquierda
*/
¿Privado? ¿Vacío? Izquierda()? {
//?Marca si hay obstáculos en el lado izquierdo.
¿Booleano? tieneBlock? =?False;
/*?Determina si hay un obstáculo en el lado izquierdo. */
¿Para qué? (int?i?=?0;?i?lt?blockRows?i)? {
¿Y si? (¿Gráfico[rowIndex?-?I][0]?==?Status.Active)? {?//?Determina si el lado izquierdo es una pared.
tieneBlock? =?Verdadero;
Rompiendo;? //Si hay obstáculos, no es necesario reciclar la línea de juicio.
}? {
¿Para qué? (int?j?=?1;?j?lt?columna;?j)? {?//?Determina si hay otros bloques a la izquierda.
¿Y si? (map[rowIndex?-?i][j]?==?status.active
amp amp?map[rowIndex?-?i][j?-?1]?==?status . ¿PARADO)? {
¿tieneBloquear? =?Verdadero;
Romper;? //Si hay obstáculos, no es necesario reciclar la columna de juicio.
}
}
¿Y si? (hasBlock)
Romper;? //Si hay obstáculos, no es necesario reciclar la línea de juicio.
}
}
/*?Si no hay ningún obstáculo a la izquierda, ¿mover la forma un bloque hacia la izquierda? */
¿Y si? (!tieneBloque)? {
¿Para qué? (int?i?=?0;?i?lt?blockRows?i)? {
¿Para qué? (int?j?=?1;?j?lt?columna;?j)? {
¿Y si? (¿Gráfico[rowIndex?-?I][j]?==?Status.Active)? {
mapa[rowIndex? -?Yo][j]? =?estado. Vacío;
mapa[rowIndex? -?I][j? -?1]?=?estado. Activo;
}
}
}
//?Repintar
repintar();< / p>
}
}1234567891011121314151617181920212223242526272829303132333435363738394041
Al acelerar el movimiento descendente, es para reducir el intervalo de tiempo entre cada caída normal:
/**
*?Seguir recto
*/
¿Privado? ¿Vacío? abajo()? {
//?La marca acelerará la caída.
¿Resultados inmediatos? =?True;
}12345678
Cómo cambiar la dirección de los gráficos, aquí solo se utiliza un método muy simple para cambiar la dirección. Por supuesto, puede haber mejores algoritmos para lograr operaciones de cambio de dirección, puedes estudiarlo tú mismo:
/**
*?Rotar gráficos cuadrados
* /
¿Privado? ¿Vacío? girar()? {
¿Intentarlo? {
¿Y si? (¿Forma?==?4)?{?//?Cuadrado, la forma es la misma antes y después de la rotación.
¿Devolver;
}? ¿si? (Shape?==?0)?{?//?Deprived
//?Matriz temporal utilizada para colocar formas rotadas.
¿Estado[][]? ¿tmp? =?¿Nuevo? Estado[4][4];
int? ¿Columna de inicio? =?0;
//?Encuentra la posición del primer cuadro al comienzo de la forma.
¿Para qué? (int?i?=?0;?i?lt?columna;?i)? {
¿Y si? (mapa[rowIndex][i]?==?status.active)? {
¿Iniciar columna? =?I;
Romper;
}
}
//?Busque obstáculos después de girar. Si hay obstáculos, no gire.
¿Para qué? (int?i?=?0;?i?lt?4;?i)? {
¿Para qué? (int?j?=?0;?j?lt?4;?j)? {
¿Y si? (Figura [rowIndex?-?3??i][j??startColumn)? ==?Estado. ¿DETENIDO)? {
Devolver;
}
}
}
¿Si? (mapa[rowIndex][startColumn??1]?==?status.Active)? {?//?Barras horizontales, convertir a barras verticales
¿Para qué? (int?i?=?0;?i?lt?4;?i)? {
tmp[i][0]? =?estado. Activo;
¿Para qué? (int?j?=?1;?j?lt?4;?j)? {
tmp[i][j]? =?estado. Vacío;
}
}
¿Bloquear filas? =?4;
}?¿En caso contrario? {?//?Líneas verticales, convertidas en líneas horizontales
¿Para qué? (int?j?=?0;?j?lt?4;?j)? {
tmp[3][j]? =?estado. Activo;
¿Para qué? (int?i?=?0;?i?lt?3;?i)? {
tmp[i][j]? =?estado. Vacío;
}
}
¿Bloquear filas? =?1;
}
//?Modifica los gráficos del mapa original a los gráficos transformados.
¿Para qué? (int?i?=?0;?i?lt?4;?i)? {
¿Para qué? (int?j?=?0;?j?lt?4;?j)? {
mapa[rowIndex? -?3??I][inicioColumna? ?j]? =?tmp[I][j];
}
}
} ¿De lo contrario? {
//?Matriz temporal utilizada para colocar gráficos giratorios.
¿Estado[][]? ¿tmp? =?¿Nuevo? Estado[3][3];
int? ¿Columna de inicio? =?Columna;
//?Encuentra la posición del primer cuadro al comienzo de la forma.
¿Para qué? (int?j?=?0;?j?lt?3;?j)? {
¿Para qué? (int?i?=?0;?i?lt?columna;?i)? {
¿Y si? (Figura [rowIndex?-?j][i]?==?Status.Active)? {
¿Iniciar columna? =?Yo? ¿Es? ¿Columna de inicio? ¿I? :?startColumn
}
}
}
//? Determine si habrá obstáculos después de la transformación.
¿Para qué? (int?i?=?0;?i?lt?3;?i)? {
¿Para qué? (int?j?=?0;?j?lt?3;?j)? {
¿Y si? (Figura[rowIndex?-?2?j][startColumn??2?-?i]?==?status.
Detener)
Volver;
}
}
//?Cambiar
¿Para qué? (int?i?=?0;?i?lt?3;?i)? {
¿Para qué? (int?j?=?0;?j?lt?3;?j)? {
tmp[2? -?j][yo]? =?mapa[rowIndex? -?2??I][inicioColumna? ?j];
}
}
//?Modifica los gráficos del mapa original a los gráficos transformados.
¿Para qué? (int?i?=?0;?i?lt?3;?i)? {
¿Para qué? (int?j?=?0;?j?lt?3;?j)? {
mapa[rowIndex? -?2??I][inicioColumna? ?j]? =?tmp[I][j];
}
}
//?Repintar
repintar();< / p>
//?Modifica el puntero de fila.
¿Para qué? (int?i?=?0;?i?lt?3;?i)? {
¿Para qué? (int?j?=?0;?j?lt?3;?j)? {
¿Y si? (mapa [rowIndex?-?I][startColumn? ?j]?!=?empty
||?map[rowIndex?-?I][startColumn? ?j]?!=?status. nulo)? {
¿índice de filas? =?índice de fila? -?i;
bloquearFilas? =?3;
Devolver;
}
}
}
}
}?Atrapar? (¿Excepción?e)? {
//?Cuando el subíndice de la matriz está fuera de los límites, significa que la forma del gráfico no se puede cambiar sin ningún procesamiento.
}
}123456789101112131415161718192021222324252627282930313233343536373 83940414243444546474849505152535455565758 Cuando El descenso del gráfico se detiene cuando está bloqueado, debemos juzgar si hay una determinada línea o líneas que se pueden eliminar. En este momento, primero podemos obtener el número de cuadrados en cada fila y luego juzgar:
int[]? ¿Cuenta de bloques? =?¿Nuevo? entre[filas];? //Registre el número de filas con cuadros en cada fila.
int? ¿Eliminar filas? =?0;? ///?Número de filas eliminadas
/*?¿Calcular el número de bloques en cada fila? */
¿Para qué? (int?I?=?0;?I?lt?OK;?i)? {
bloquesCount[i]? =?0;
¿Para qué? (int?j?=?0;?j?lt?columna;?j)? {
¿Y si? (Figura[i][j]?==?estado.
Detener)
los bloques cuentan[I];
}
}1234567891011
Si hay una fila completa de cuadros, entonces el Se elimina la casilla:
/*? ¿Realizas la eliminación de casillas en filas completas? */
¿Para qué? (int?I?=?0;?I?lt?OK;?i)? {
¿Y si? (bloquesCount[i]?==?columna)? {
//?Limpiar la línea
¿Para qué? (int?m?=?i;?m?gt=?0;?m-)? {
¿Para qué? (int?n?=?0;?n?lt?columna;?n)? {
mapa[m][n]? =?(m?==?0)?estado. ¿Vacío? :?mapa[m? -?1][n];
}
}
eliminar filas;? //Registra el número de líneas eliminadas
}
}12345678910111213
Finalmente, podemos volver a dibujar y mostrar los puntos.
Repita las operaciones anteriores de generar gráficos, soltar gráficos, moverse hacia la izquierda y hacia la derecha y juzgar y eliminar líneas, y se completará un Tetris simple.