Utiliza JAVA para escribir el código fuente del juego Tetris.

Tetris: el código fuente de Java proporciona import java.awt.*; import java.awt.event.*; //Clase Tetris public class ERS_Block extends Frame{ public static boolean isPlay=false; =1, puntuación = 0; campo de puntuación de campo de texto estático público, campo de nivel; temporizador MyTimer estático público; GameCanvas gameScr; principal vacío estático público (String[] argus){ ERS_Block ers = new ERS_Block("Autor del juego Tetris V1.0: Vincent") ; WindowListener win_listener = new WinListener(); ers.addWindowListener(win_listener); } //Método de construcción de la clase Tetris ERS_Block(String title){ setSize(600, 480); )); gameScr = nuevo GameCanvas(); gameScr.addKeyListener(gameScr); temporizador = nuevo MyTimer(gameScr); rightScr = new Panel(); rightScr.setLayout(new GridLayout(2, 1, 0, 30)); rightScr.setSize(120, 500); //El formulario de información en el diseño derecho MyPanel = new MyPanel(); infoScr.setLayout(new GridLayout(4, 1, 0, 5)); infoScr.setSize(120, 300); rightScr.add(infoScr); Etiqueta("Puntuación:", Etiqueta.LEFT); Etiqueta nivelp = nueva Etiqueta("Nivel:", Etiqueta.LEFTField = nuevo Campo de texto (8); campo de nivel = nuevo Campo de texto (8); ; nivelCampo.setEditable(falso); infoScr.add(puntuación); infoScr.add(nueva dimensión(20, 60)); .setSize(nueva Dimensión

(20, 60)); nivelp.setSize(nueva Dimensión(20, 60)); nivelCampo.setSize(nueva Dimensión(20, 60)); puntuaciónField.setText("0"); ; //Diseño del botón de control derecho de MyPanel controlScr = new MyPanel(); controlScr.setLayout(new GridLayout(5, 1, 0, 5)); //Definir botón de reproducción Button play_b = new Button("Iniciar juego"); play_b.setSize(new Dimension(50, 200)); play_b.addActionListener(new Command(Command.button_play, gameScr)); //Definir botón Subir nivel Level_up_b = new Button(" Aumentar el nivel"); level_up_b.setSize(new Dimension(50, 200)); level_up_b.addActionListener(new Command(Command.button_levelup, gameScr)); //Definir el botón Botón de bajar nivel level_down_b =new Button("Reducir el nivel "); nivel_down_b.setSize(nueva Dimensión(50, 200)); nivel_down_b.addActionListener(nuevo Comando(Command.button_leveldown, gameScr)); //Definir el nivel del botón Botón de pausa pausa_b =nuevo Botón("Pausa del juego") ; pausa_b .setSize(new Dimension(50, 200)); pausa_b.addActionListener(new Command(Command.button_pause, gameScr)); //Definir botón Salir Botón quit_b = new Botón("Salir del juego"); nueva Dimensión (50, 200)); quit_b.addActionListener(new Command(Command.button_quit, gameScr)); controlScr.add(play_b); ); controlScr.add(quit_b); setVisible(true); gameScr.requestFocus(); } } //Reescribe la clase MyPanel para dejar espacio alrededor de la clase Panel MyPanel extends Panel{ public Insets getInsets(){ return new Insets(30); , 50, 30, 50); } } // Clase de lienzo de juego clase G

ameCanvas extiende Canvas implements KeyListener{ final int unitSize = 30; // La longitud del lado del cuadrado pequeño int rowNum; // El número de filas en el cuadrado int columnNum // El número de columnas en el cuadrado int maxAllowRowNum; Cuántas filas se permiten int blockInitRow; // La coordenada de la fila inicial del bloque recién aparecido int blockInitCol; // La coordenada de la columna inicial del bloque recién aparecido int [][] scrArr // Matriz de pantalla Block b; a la otra parte //Método de construcción de la clase Canvas GameCanvas(){ rowNum = 15; columnNum = 10; maxAllowRowNum = rowNum - 2; b = new block(this); 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[j]=0; b.reset(); 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[j] } //Método para dibujar un cuadrado public void drawUnit(int row, int col, int type){ scrArr[ fila][col] = tipo; Gráficos g = getGraphics(); tch(tipo){ //Método para expresar el dibujo rápido caso 0: g.setColor(Color.black); : g.setColor (Color.blue); //Dibuja el bloque que cae caso 2: g.setColor(Color.magenta break; //Dibuja el bloque que cae} g.fill3DRect(col*unitSize, getSize()); .height -(row 1)*unitSize, unitSize, unitSize, true); g.dispose(); } public Block getBlock(){ return b; //Devuelve una referencia a la instancia del bloque} //Regresa a la matriz de pantalla (fila, col) El valor del atributo de la posición public int getScrArrXY(int fila, int col){ if (fila lt; 0 || fila gt; = filaNum || col lt; 0 || col gt; = columnaNum) return (-1); else return (scrArr[row][col]); // Devuelve las coordenadas de la fila inicial del nuevo método de bloque public int getInitRow(){ return(blockInit).

Row); //Devuelve las coordenadas de la fila inicial del nuevo bloque} //Devuelve las coordenadas de la columna inicial del nuevo método de bloque public int getInitCol(){ return(blockInitCol); //Devuelve las coordenadas de la 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 ){ boolean isfull = true; ; columnNum; j ) if (scrArr[j] == 0){ k; isfull = false; k-1!=i ​​​​amp; amp; !isfull) for (int j = 0; j lt; columnNum; j ){ if (scrArr[j] == 0) drawUnit(k-1, j, 0); j, 2); scrArr[k -1][j] = scrArr[j]; } } for(int i = k-1; i lt; rowNum; i){ for(int j = 0; j lt; columnNum ; j){ drawUnit(i, j, 0); scrArr[j]=0; } } ERS_Block.score = full_line_num; ERS_Block.scoreField.setText("" ERS_Block.score); ha terminado boolean isGameEnd(){ for (int col = 0; col lt; columnNum; col ){ if(scrArr[maxAllowRowNum][col]!=0) return true } return false } public void keyTyped(KeyEvent e) { } public void keyReleased(KeyEvent e){ } //Método para manejar la entrada del teclado public void keyPressed(KeyEvent e){ if(!ERS_Block.isPlay) return tch(e.getKeyCode()){ case KeyEvent.VK_DOWN: b .fallDown(); caso KeyEvent.VK_LEFT: b.leftMove(); caso KeyEvent.VK_RIGHT: b.rightMove(); caso KeyEvent.VK_SPACE: b.leftTurn(); / Clase de control de procesamiento class Command implementa ActionListener{ static final int button_play = 1; //Asigna un número al botón static final int button_levelup = 2;

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 del botón de control (int button, GameCanvas scr) { curButton = button; = scr; } // Método de ejecución del botón public void actionPerformed (ActionEvent e){ tch(curButton){ case button_play: if(!ERS_Block.isPlay){ scr.initScr(); ; ERS_Block.scoreField.setText("0"); ERS_Block.timer.resume(); } scr.requestFocus(); break; caso button_levelup: if(ERS_Block.level lt; 10){ ERS_Block.levelField. setText ("" ERS_Block.level); ERS_Block.score = 0; ERS_Block.scoreField.setText("" ERS_Block.level); } scr.requestFocus(); ERS_Block.level--; ERS_Block.levelField.setText("" ERS_Block.level); ERS_Block.scoreField.setText("" ERS_Block.score); if (pause_resume){ ERS_Block.timer.suspend(); pausa_resume = false; }else{ ERS_Block.timer.resume(); pausa_resume = verdadero } scr.requestFocus(); ; } } } // Clase de bloque class Block { static int[][] patrón = { {0x0f00, 0x4444, 0x0f00, 0x4444}, // Use hexadecimal para representar, esta línea representa los cuatro estados de la barra larga {0x04e0, 0x0464 , 0x00e4, 0x04c4}, {0x4620, 0x6c00, 0x4620, 0x6c00}, {0x2640, 0xc600, 0x2640, 0xc600}, {0x6220, 0x1700, 0x2230, 0x0740}, 40, 0x0e20, 0 x44c0, 0x8e00}, {0x0660, 0x0660, 0x0660, 0x0660} }; int tipo de bloque;

// El número de modo del bloque (0-6) int turnState; // El estado de inversión del bloque (0-3) int blockState; // El estado de caída rápida int row, col; en el lienzo GameCanvas scr; // Método de construcción de la clase de bloque Block(GameCanvas scr){ this.scr = scr; blockType = (int)(Math.random() * 1000)7; () * 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(); col = scr.getInitCol(); ; } //Implementación del método de inversión "Bloque" public void leftTurn(){ if(assertValid(blockType, (turnState 1)4, fila, col)){ dispBlock(0); ); } } //Método para implementar el desplazamiento a la izquierda del "bloque" public void leftMove(){ if(assertValid(blockType, turnState, row, col-1)){ dispBlock(0); ; } } // Implementar el movimiento correcto del bloque public void rightMove(){ if(assertValid(blockType, turnState, row, col 1)){ dispBlock(0); para implementar la operación de caída de bloques public boolean fallDown(){ if(blockState == 2) return(false); if(assertValid(blockType, turnState, fila-1, col)){ dispBlock(0); dispBlock(1); return(true); }else{ blockState = 2; dispBlock(2); return(false } } //Método para determinar si es correcto booleanasserValid(int t, int s, int row, int col){ int k = 0x8000; for (int i = 0; i lt; 4; i ){ for(int j = 0; j lt; 4; j ){ si((int)(patrón[t][ s]amp;k) != 0) { int temp = scr.getScrArrXY(row-i, col j); if (templt; 0||temp==2) return false } k = k gt;

1; } } return true; } //Método de visualización sincronizado public sincronizado void dispBlock(int s){ int k = 0x8000; for (int i = 0; i lt; 4; i){ for (int j = 0; j lt; 4; j ){ if(((int)pattern[blockType][turnState]amp; k) != 0){ scr.drawUnit(row-i, col j, s } k=kgt; 1; } } } } // La clase de hilo de tiempo MyTimer extiende Thread{ GameCanvas scr; public MyTimer(GameCanvas scr){ this.scr = scr } public void run(){ while(true){ try{ sleep((10 - ERS_Block.level 1)*100); } catch(InterruptedException e){} if(!scr.getBlock().fallDown()){ scr.deleteFullLine(); if(scr.isGameEnd()){ ERS_Block.isPlay = false; suspender(); }else scr.getBlock().reset(); } } } } clase WinListener extiende WindowAdapter{ public void windowClosing (WindowEvent l){ System.exit(0);