tetris java
importar java.awt.*;
importar java.awt.event.*;
//clase Tetris
clase pública Mytest extiende Frame{
público estático booleano isPlay=false;
público estático int nivel=1, puntuación=0
público estático TextField ScoreField, LevelField;
temporizador MyTimer estático público;
GameCanvas gameScr;
public static void main(String[] argus){
Mytesters = new Mytest("Juego de Tetris");
WindowListener win_listener = new WinListener();
ers.addWindowListener(win_listener);
}
p>//Método de construcción de la clase Tetris
Mytest(String title){
super(title);
setSize(600, 480 )
setLayout(new GridLayout(1, 2));
gameScr = new GameCanvas();
gameScr.addKeyListener(gameScr); >
p>
temporizador = nuevo MyTimer(gameScr);
timer.setDaemon(true
timer.start(); > timer.suspend ();
add(gameScr);
Panel rightScr = nuevo Panel();
rightScr.setLayout(new GridLayout(2, 1, 0, 30));
rightScr.setSize(120, 500);
add(rightScr);
//Diseño de la información correcta. formulario
MyPanel infoScr = new MyPanel();
infoScr.setLayout(new GridLayout(4, 1, 0, 5)); (120, 300 );
rightScr.add(infoScr);
//Definir etiqueta y valor inicial
Puntuación de etiquetap = new Etiqueta("Puntuación: ", Etiqueta. IZQUIERDA);
Nivel de etiquetap = nueva Etiqueta("Nivel:", Etiqueta.LEFT);
puntajeField = nuevo Campo de texto(8);
camponivel=nuevo
TextField(8);
coreField.setEditable(false);
levelField.setEditable(false);
infoScr.add(puntuación); >
infoScr.add(scoreField);
infoScr.add(levelp);
infoScr.add(levelField);
scorep.setSize( nueva Dimensión(20,60));
scoreField.setSize(nueva Dimensión(20,60));
levelp.setSize(nueva Dimensión(20,60));
levelField.setSize(nueva dimensión(20, 60));
scoreField.setText("0");
levelField.setText("1") ;
//Diseño del formulario del botón de control derecho
MyPanel controlScr = new MyPanel();
controlScr.setLayout(new GridLayout(5, 1, 0, 5));
rightScr.add(controlScr);
//Definir botón de reproducción
Botón play_b = new Botón("Iniciar juego") ;
play_b.setSize(new Dimension(50, 200));
play_b.addActionListener(new Command(Command.button_play, gameScr)); //Definir botón Nivel ARRIBA
Botón nivel_up_b = nuevo Botón("Aumentar nivel");
nivel_up_b.setSize(nueva Dimensión(50, 200));
level_up_b.addActionListener(new Command(Command.button_levelup, gameScr));
//Definir botón Nivel hacia abajo
Botón level_down_b =new Botón("Nivel inferior") ;
level_down_b.setSize(new Dimension(50, 200));
level_down_b.addActionListener(new Command(Command.button_leveldown, gameScr)); Definir botón Nivel Pausa
Botón pausa_b =nuevo Botón("Pausa del juego");
pausa_b.setSize(nueva Dimensión(50, 200));
pausa_b.addActionListener (nuevo comando (C
ommand.button_pause, gameScr));
//Definir botón Salir
Botón quit_b = new Botón("Salir del juego");
quit_b.setSize( nueva Dimensión(50, 200));
quit_b.addActionListener(new Command(Command.button_quit, gameScr));
controlScr.add(play_b); p> controlScr.add(level_up_b);
controlScr.add(level_down_b);
controlScr.add(pause_b);
controlScr.add(quit_b); ;
setVisible(true);
gameScr.requestFocus();
}
}
/ /Reescribe la clase MyPanel para dejar espacio alrededor del Panel
clase MyPanel extends Panel{
public Insets getInsets(){
return new Insets(30, 50 , 30, 50);
}
}
//Clase de lienzo de juego
clase GameCanvas extiende Canvas implementa KeyListener{< / p>
final int unitSize = 30; //Longitud del lado del cuadrado pequeño
int rowNum; //Número de filas cuadradas
int columnNum; //Square El número de columnas en la cuadrícula
int maxAllowRowNum; //Cuántas filas se permiten sin cortar
int blockInitRow //La coordenada de fila inicial del nuevo bloque
int blockInitCol; // Coordenadas de la columna de inicio del nuevo bloque
int [][] scrArr; //Matriz de pantalla
Bloque b //Referencia a la otra parte
//Método de construcción de la clase canvas
GameCanvas(){
rowNum = 15
columnNum = 10; > maxAllowRowNum = número de fila - 2;
b = nuevo bloque (este);
blockInitRow = número de fila - 1
blockInitCol = número de columna/2 - 2;
scrArr = new int [32][32];
}
// Método para inicializar la pantalla y borrar la matriz de pantalla
void initScr(){
for (int i=0; ilt; rowNum; i )
for (int j=0; jlt; columnNum; j )
scrArr[i][j]=0;
b.r
eset();
repaint();
}
//Actualizar método de lienzo
public void paint(Gráficos g) {
for(int i = 0; i lt; rowNum; i )
for(int j = 0; j lt; columnNum; j )
drawUnit (i,j,scrArr[i][j]);
}
//Método para dibujar cuadrados
public void drawUnit(int row, int col, int tipo){
scrArr[row][col] = tipo;
Gráficos g = getGraphics()
switch(tipo){ / /Método que expresa la velocidad de dibujo
caso 0: g.setColor(Color.black); //Usa el fondo como color para dibujar
caso 1: g .setColor( Color.blue); //Dibuja el bloque que cae
caso 2: g.setColor(Color.magenta); }
g.fill3DRect(col*unitSize, getSize().height-(fila 1)*unitSize, unitSize, unitSize, true
g.dispose(); /p>
p>
}
public Block getBlock(){
return b; //Devuelve una referencia a la instancia del bloque
}
//Devuelve el valor del atributo en la posición (fila, columna) en la matriz de pantalla
public int getScrArrXY(int fila, int col){
if (fila lt; 0 || fila gt;= númerofila || col lt; 0 || col gt;= númerocolumna)
return(-1);
else
return(scrArr[ fila][col]);
}
// Devuelve el método de coordenadas de fila inicial del nuevo bloque
public int getInitRow(){
return(blockInitRow); //Devuelve las coordenadas de la fila inicial del nuevo bloque
}
//Devuelve el coordenadas de columna inicial del nuevo bloque
public int getInitCol(){
return(blockInitCol // Devuelve las coordenadas de columna inicial del nuevo bloque
}
// Método de eliminación de fila completa
void deleteFullLine(){
int full_line_num = 0
int k = 0;
for (int i=0; ilt; rowNum; i ){
booleano isfull = true;
L1: for(int j=0; jlt; columnNum; j )
if(scrArr[i][j] == 0){
k ;
isfull = false;
romper L1;
}
if(isfull) full_line_num
if(k!=0 amp; amp; k-1!=i amp; !isfull)
for(int j = 0; j lt; columnNum; j){
si ( scrArr[ i][j] == 0)
drawUnit(k-1, j, 0
else
drawUnit(k-1, j, 2);
scrArr[k-1][j] = scrArr[i][j];
}
}
for(int i = k-1; i lt; rowNum; i){
for(int j = 0; j lt; columnNum; j){
drawUnit (i , j, 0);
scrArr[i][j]=0;
}
}
Mi prueba. score = full_line_num;
Mytest.scoreField.setText("" Mytest.score);
}
// Método para determinar si el juego ha terminado
booleano isGameEnd(){
for (int col = 0; col lt; columnNum; col){
if(scrArr[maxAllowRowNum][col] ! =0) p>
devuelve verdadero;
}
devuelve falso
}
clave nula pública escrita ( KeyEvent e){
}
public void keyReleased(KeyEvent e){
}
// Método para procesar la entrada del teclado
public void keyPressed(KeyEvent e){
if(!Mytest.isPlay)
return;
switch(e.getKeyCode( )){ p>
caso KeyEvent.VK_DOWN: b.fallDown(); descanso
caso KeyEvent.VK_LEFT: b.leftMove(); caso KeyEvent.VK_RIGHT: b.rightMove(); descanso;
caso KeyEvent.VK_SPACE: b.leftTurn(); /pag
>
}
//Clase de control de procesamiento
class El comando implementa ActionListener{
static final int button_play = 1 //Asigna un número al botón
static final int button_levelup = 2
static final int button_leveldown = 3
static final int button_quit = 4; static final int button_pause = 5;
static boolean pause_resume = true;
int curButton; //Botón actual
GameCanvas scr; >/ /Método de construcción de la clase de botón de control
Command(int button, GameCanvas scr){
curButton = button;
this.scr=scr;
}
//Método de ejecución del botón
public void actionPerformed (ActionEvent e){
switch(curButton){
case button_play: if(!Mytest.isPlay){
scr.initScr();
Mytest.isPlay = true; = 0 ;
Mytest.scoreField.setText("0");
Mytest.timer.resume();
}
scr .requestFocus();
break;
case button_levelup: if(Mytest.level lt; 10){
Mytest.level;
Mytest.levelField.setText("" Mytest.level);
Mytest.score = 0;
Mytest.scoreField.setText("" Mytest.score);
p>
}
scr.requestFocus();
break;
caso button_leveldown: if (Mytest.level gt; 1){ p>
Mytest.level--;
Mytest.levelField.setText("" Mytest.level);
Mytest.score = 0 ;
Mytest.scoreField.setText("" Mytest.score
}
scr.requestFocus()
break); ;
caso bu
tton_pause: if(pause_resume){
Mytest.timer.suspend();
pausa_resume = false
}else{
Mytest.timer.resume();
pausa_resume = true;
}
scr.requestFocus(); /p>
caso button_quit: System.exit(0);
}
}
}
//bloque Clase
clase Bloque {
static int[][] patrón = {
{0x0f00, 0x4444, 0x0f00, 0x4444}, //Usar hexadecimal para significa , esta línea representa cuatro estados de barras largas
{0x04e0, 0x0464, 0x00e4, 0x04c4},
{0x4620, 0x6c00, 0x4620, 0x6c00},
{0x2640, 0xc600, 0x2640, 0xc600},
{0x6220, 0x1700, 0x2230, 0x0740},
{0x6440, 0x0e20, 0x44c0, 0x8e00},
{0x0660, 0x0660, 0x0660, 0x0660}
};
int blockType; //Número de modo del bloque (0-6)
int turnState ; // El estado de volteo del bloque (0-3)
int blockState; // Estado de caída rápida
int row, col // Las coordenadas del bloque en el canvas
GameCanvas scr;
//Método de construcción de la clase de bloque
Block(GameCanvas scr){
this.scr = scr ;
tipo de bloque = (int)(Math.random() * 1000)7
turnState = (int)(Math.random() * 1000)4; >
blockState = 1;
fila = scr.getInitRow();
col = scr.getInitCol()
}
//Reinicializa el bloque y muestra el nuevo bloque
public void reset(){
blockType = (int)(Math.random() * 1000)7;
turnState = (int)(Math.random() * 1000)4;
blockState = 1
fila = scr.getInitRow(); p>
col = scr.getInitCol();
dispBlock(1);
}
// Método para implementar el cambio de "bloque"
público vacío giro a la izquierda
(){
if(assertValid(blockType, (turnState 1)4, fila, col)){
dispBlock(0);
turnState = ( turnState 1)4;
dispBlock(1);
}
}
// Implementar el desplazamiento hacia la izquierda de "bloque" Método
public void leftMove(){
if(assertValid(blockType, turnState, fila, col-1)){
dispBlock(0);
col--;
dispBlock(1);
}
}
// Bloque de implemento Mover derecha
public void rightMove(){
if(assertValid(blockType, turnState, fila, col 1)){
dispBlock(0);< / p>
col;
dispBlock(1);
}
}
// Implementar el método de operación de eliminación de bloques
public boolean fallDown(){
if(blockState == 2)
return(false);
if(asserValid(blockType) , turnState, fila-1, columna)){
dispBlock(0);
fila--;
dispBlock(1);
return(verdadero);
}else{
blockState = 2;
dispBlock(2); false);
}
}
//Método para determinar si es correcto
booleano afirmarValid(int t, int s , int fila, int col){
int k = 0x8000
for(int i = 0; i lt; 4; i){
for (int j = 0; j lt; 4; j ){
if((int)(patrón[t][s]amp;k) != 0){
int temp = scr.getScrArrXY(fila-i, col j);
if (templt;0||temp==2)
devuelve falso;
}
k = k gt;
}
}
devuelve verdadero; > }
//Método de visualización sincronizado
público sincronizado void dispBlock(int s){
int
k = 0x8000;
para (int i = 0; i lt; 4; i ){
para (int j = 0; j lt; 4; j ){ p>
if(((int)pattern[blockType][turnState]amp;k) != 0){
scr.drawUnit(row-i,col j,s); p> p>
}
k=kgt;
}
}
}
}
//Hilo de sincronización
clase MyTimer extiende Thread{
GameCanvas scr;
public MyTimer(GameCanvas scr ){
this.scr = scr;
}
public void run(){
while(true){ p>
intentar{
dormir((10-Mytest.level 1)*100);
}
capturar(InterruptedException e){} p>
if(!scr.getBlock().fallDown()){
scr.deleteFullLine();
if(scr.isGameEnd()){ p>
Mytest.isPlay = false
suspender();
}else
scr.getBlock().reset();
p>
}
}
}
}
clase WinListener extiende WindowAdapter{
cierre de ventana vacía pública (WindowEvent l){
System.exit(0);
}
}