Os exemplos deste artigo compartilham com você o código específico de implementação de Java Tetris para sua referência. O conteúdo específico é o seguinte
Idéias de design de tetris
Tetris está tocando desde a infância. Todo mundo conhece as regras. No passado, eu pensei que isso era muito divertido, mas eu simplesmente não conseguia vencer. Agora aprendi a escrever um sozinho e praticá -lo todos os dias!
Operação do teclado:
Chave esquerda: mova -se para a esquerda; Chave à direita: mova -se para a direita;
Chave para cima: Altere a forma e a chave inferior: acelere a queda (sem problemas, sem retificação adicional)
Se os quadrados de qualquer linha estiverem cheios, essa linha será eliminada. A eliminação de uma fileira de quadrados receberá 10 pontos. No momento, não defina os níveis. Bebês que gostam pode definir os próprios níveis;
Então, de onde vieram essas formas quadradas? É projetado por nós mesmos. As formas comuns são: Eu digito, tipo T, tipo L, tipo de grade tianzi, etc., adicione você mesmo!
Então, o que aconteceu? Na verdade, é apenas uma matriz de 4*4. Claro, você pode projetar n*n feliz, você tem a palavra final!
Então, dei um exemplo abaixo para dizer por que as formas que você vê podem ser alteradas foi projetada com antecedência, 0 está vazio e 1 é um enchimento, para que você possa criar formas no seu jogo!
Esqueça: basta colocar a imagem e ver os resultados executando os resultados primeiro:
Gosta? Se você gosta, faça -o diretamente. Talvez o código não esteja bem escrito o suficiente. Por favor me perdoe. Resumirei mais quando olhar para trás e continuarei atualizando o código;
Classe Gamepanel: classe de interface do jogo, todo o bloco é descartado e exibido, e a lógica lenta do jogo é implementada nesta classe;
pacote tetris; importar java.awt.graphics; importar java.awt.event.actionEvent; importar java.awt.event.actionListener; importar java.awt.event.keyevent; import java.awt.event.keylistener; importação java.util.random; importação; javax.swing.jpanel; importar javax.swing.timer; classe pública gamepanel estende o jpanel implementa KeyListener {private int maprow = 21; private int mapcol = 12; private int mapgame [] [] = new int [maprow] [mapCol]; // Abra um espaço de matriz bidimensional para armazenar nosso timer privado de informações do mapa; Pontuação privada int = 0; // Registre a pontuação aleatória aleatória = novo aleatório (); private int curShapeType = -1; private int curshapestate = -1; // Defina o tipo de forma atual e o status da forma atual privado int nextShapeType = -1; private int nextShapestate = -1; // Defina o tipo e o status do grupo de blocos que aparece na próxima vez privado int posx = 0; private int posy = 0; private final int shapes[][][] = new int[][]{ //T glyphs are stored in counterclockwise order { {0,1,0,0, 1,1,1,0, 0,0,0,0,0,0,0}, {0,1,0,0, 1,1,0,0,0,0,0,0,0}, //I glyphs are stored in counterclockwise order {{0,0,0,0, 1,1,1,1,1,0,0,0,0, 0,0,0,0,0}, {0,1,0,0, 0,1,0,0, 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, {0,1,1,0, 1,1,0,0, 0,0,0,0,0,0}, {1,0,0,0, 1,1,0,0,0,0,0}, //Z-shaped { {1,1,0,0,0, 0,1,1,0,0,0,0,0}, {0,1,0,0, 1,1,0,0, 1,0,0,0,0,0}, {1,1,0,0, 0,1,1,0,0,0,0,0,0}, {1,1,0,0, 0,1,1,0,0,0,0,0,0}, {0,1,0,0, 1,1,0,0, 1,0,0,0,0,0,0}, //J glyphs are stored in counterclockwise order { {0,1,0,0, 0,1,0,0, 1,1,0,0, 0,0,0,0,0,0}, {1,1,1,0, 0,0,1,0,0,0,0,0,0,0,0}, {1,1,0,0, 1,0,0,0,0,0,0,0}, {1,0,0,0, 1,1,0,0,0,0,0,0}, {1,0,0,0, 1,1,0,0,0,0,0,0,0}, //L glyphs are stored in counterclockwise order { {1,0,0,0,0, 1,0,0,0,0, 1,1,0,0,0,0,0,0,0,0}, {0,0,1,0, 1,1,0,0, 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 , 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 , 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0}, {1,1,0,0, 0,1,0,0,0,0,0,0,0}, {1,1,1,0, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0}}}}; private int rowrect = 4; Private Int Colrect = 4; // aqui consideramos a imagem armazenada como uma matriz bidimensional de 4*4. Embora usemos uma matriz unidimensional para armazená-la acima, ainda precisamos considerá-la como uma matriz bidimensional para implementar o privado int retonete = 10; public gamepanel () // construtor ---- crie um bom mapa {Createrrect (); initmap (); // inicialize este mapa setWall (); // Definir parede // createrect (); Timer = novo timer (500, novo timerListener ()); timer.start (); } classe TimerListener implementa ActionListener {public void ActionPerformed (ActionEvent E) {MODEROWN (); }} public void setWall () // A coluna 0 e 11 são ambas as paredes e a linha 20 também é paredes {for (int i = 0; i <paprow; i ++) // desenhe a coluna primeiro {mapgame [i] [0] = 2; mapGame [i] [11] = 2; } para (int j = 1; j <mapCol-1; j ++) // desenhe a última linha {mapgame [20] [j] = 2; }} public void initmap () // inicialize este mapa, o ID da parede é 2, o ID do espaço é 0 e o ID do bloco é 1 {for (int i = 0; i <paprow; i ++) {for (int j = 0; j <mapcol; j ++) {mapgame [i] [j] = 0; }}} public void Createrrect () // Crie bloco --- Se o tipo de bloco atual existir, defina da próxima vez, se não, defina o estado atual e o tipo {if (curshapetype == -1 && curshapestate == -1) // o estado de bloco atual é 1, indicando que o jogo foi iniciado apenas {CursHapTyTyTyTyTyTy. curshapestate = random.nextInt (formas [0] .Length); } else {curshapetype = nexthapetype; curshapestate = nextShapestate; } nextShapeType = Random.NextInt (shapes.length); NextShapestate = Random.NextInt (Shapes [0] .Length); Posx = 0; Posy = 1; // Crie um quadrado no canto superior esquerdo da parede if (Gameover (Posx, Posy, Curshapetype, Curshapestate))) {JoptionPane.ShowConfirmdialog (null, "Game End!", "Tip", JoptionPane.Ok_Option); System.Exit (0); }} public boolean gameover (int x, int y, int shapeType, int shapestate) // julga se o jogo termina {if (isornomove (x, y, shapeType, shapestate)) {return false; } retornar true; } Public boolean iSornomove (int x, int y, int shapeType, int shapestate) // julga se a figura atual pode ser movida. Aqui, enfatizamos que as coordenadas de x e y se referem ao alvo superior esquerdo de uma matriz bidimensional de 4*4 (a matriz que descreve a figura) {for (int i = 0; i <rowRect; i ++) {para (int j = 0; j <colrect; j ++) {if (shapeSeTypeTyTeTate] [ShapeTeState] [ShapesteTeTeTeTeTeTeTeTeTeState [Int J = 0; mapgame [x+i] [y+j] == 1 || formas [shapetype] [shapestate] [i*colrect+j] == 1 && mapgame [x+i] [y+j] == 2) {return false; }}} retorna true; } public void Turn () // girate {int temp = curapassado; Curshapestate = (Curshapestate+1) % formas [0] .Length; if (isornomove (posx, posy, curshapetype, curshapestate)) {} else {curshapestate = temp; } repaint (); } public void mudouwn () // mova -se para baixo {if (iSornomove (posx+1, posy, curapetype, curshapestate)) {posx ++; } else {addTomap (); // conserte esta linha no mapa de verificação (); Createrct (); // recriar um novo bloco} repaint (); } public void MoveleLeft () // Mova para a esquerda {if (iSornomove (POSX, POSY-1, CURSHAPETYPE, CURSHAPESTATE)) {POSY--; } repaint (); } public void moveright () // mova -se para a direita {if (iSornomove (Posx, Posy+1, Curshapetype, Curshapestate)) {posy ++; } repaint (); } public void addTOMap () // Corrija a imagem caída no mapa {for (int i = 0; i <rowrect; i ++) {for (int j = 0; j <colrect; j ++) {if (shapes [mapSapetype] [Curshapestate] [i*colrect+j] == 1) {mapGame] [mapgame] [i**colrect+j] == 1) [mapGame] [mapgame] [pS da 1) [POSTAME] [POSTAMETETETETETETEMETE] [i**colrect+j] Formas [Curshapetype] [Curshapestate] [i*colrect+j]; }}}} public void checkLine () // Verifique se existem linhas completas nessas linhas {int conting = 0; for (int i = mapRow-2; i> = 0; i--) {count = 0; for (int j = 1; j <mapCol-1; j ++) {if (mapgame [i] [j] == 1) {count ++; } mais quebrar; } if (count> = mapCol-2) {for (int k = i; k> 0; k-) {for (int p = 1; p <mapCol-1; p ++) {mapgame [k] [p] = mapgame [k-1] [p]; }} pontuação += 10; i ++; }}} public void Paint (gráficos g) // Janela de repintura {super.paint (g); para (int i = 0; i <rowrect; i ++) // desenhe o bloco em queda {for (int j = 0; j <colrect; j ++) {if (Shapes [curshapetype] [Curshapestate] [i*colrect+j] == 1) {g.fillrect ((Posy+J+1) Retwidth); }}} para (int i = 0; i <maprow; i ++) // desenhe as informações de bloco que foram fixadas no mapa {for (int j = 0; j <mapcol; j ++) {if (mapgame [i] [j] == 2) // desenhe a parede {g.drawrect (j+1)***. Retwidth); } if (mapgame [i] [j] == 1) // desenhe o quadrado pequeno {g.fillRect ((j+1)*retwidth, (i+1)*retwidth, retwidth, retwidth); }}} G.DrawString ("Score ="+ Score, 225, 15); G.DrawString ("Próximo quadrado:", 225, 50); para (int i = 0; j <colrect; j ++) {if (molda [nextShapeType] [nextShapestate] [i*colrect+j] == 1) {g.fillRect (225+ (j*retwidth), 100+ (i*retwidth), retwidth, retwidth); }}}} public void newGame () // O jogo começa novamente {score = 0; initmap (); SetWall (); Createrrect (); repintar (); } public void stopgame () // O jogo faz uma pausa {timer.stop (); } public void continuando o jogo () {timer.start (); } @Override public void KeyTyped (KeyEvent e) {} @Override public void KeyPressed (KeyEvent e) {switch (e.getKeyCode ()) {case Keyevent.vk_up: // up -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- KeyEvent.vk_right: // Right ---- Moveight (); quebrar; }} @Override public void keyreLeardeed (keyEvent e) {// TODO Method Auto-Gerated Stub}} Classe GameFrame: a porta de entrada de todo o jogo, bem, para ser franco, é uma classe com a função principal (). Esta aula implementa alguns designs da interface do jogo, que você pode entender como uma pequena interface do usuário;
pacote tetris tetris; importar java.awt.event.actionListener; importar javax.swing.jframe; importar javax.swing.jmenu; importfrtx.swing.jmenubar; import javax.swing.jmenuTem; improments.swing.jmenubar; import.swingen.jmenuTem; improments.swing.swing.swing.snubar; ActionListener {private int widthframe = 500; private int altingframe = 600; Menu Jmenu privado = novo jmenu ("Game"); // Crie um menu Private Jmenuitem newGame = MENU.ADD ("RESTART"); // Crie uma opção de menu integrada Private Jmenuitem Exitgame = Menu.add ("Game Out"); private jmenuitem stopgame = menu.add ("pausa do jogo"); private jmenuitem goongame = menu.add ("jogo continua"); Privado Jmenu Menutwo = New Jmenu ("Ajuda"); // Crie um segundo menu privado jmenuitem aboutgame = Menutwo.add ("Sobre o jogo"); Gamepanel gamepanel = new gamepanel (); public gameframe () // construtor {addKeyListener (gamepanel); newgame.addactionListener (this); exitgame.addactionListener (this); stopgame.addactionListener (isto); goongame.addactionListener (isto); Sobre Game.addactionListener (isto); this.add (gamepanel); JMENUBAR MENU = new Jmenubar (); menu.add (menuOne); menu.add (Menutwo); this.setJmenubar (menu); this.settitle ("tetris"); this.setbounds (50, 10, widthframe, hightframe); this.setVisible (true); this.setDefaultCloseoperation (jframe.exit_on_close); } public void ActionPerformed (ActionEvent E) {if (e.getSource () == newGame) // O jogo começa novamente {gamepanel.newgame (); } if (e.getSource () == exitgame) // saída de jogo {System.exit (0); } if (e.getSource () == stopgame) // pausa do jogo {gamepanel.stopgame (); } if (e.getSource () == goongame) // jogo continua {gamepanel.continueGame (); } if (e.getSource () == AboutGame) // Sobre as informações do jogo {JoptionPane.showMessagedialog (null, "Mova as teclas esquerda e direita, crie rotação para cima", "Prompt", joptionpane.ok_option); }} public static void main (string [] args) {new gameframe (); }}O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.