Ele imita perfeitamente o jogo de 2048 e é modificado com base no 2048 de um internauta.
Bloco.java
import javax.swing.*;import java.awt.*;public class Block estende JLabel { private int value; public Block() { value = 0;//O valor inicial é 0 setFont(new Font("font", Font . PLAIN, 40));//Definir a fonte setBackground(Color.gray);//Definir a cor inicial para cinza} public int getValue()//Obter o valor { return value } public void; setValue(int valor) { this.value = value; String text = String.valueOf(value); if (value != 0) setText(text); else setText("");//Se o valor for 0, é não será exibido setColor(); } public void setColor() //Definir diferentes cores de fundo e fontes de rótulos de acordo com diferentes valores { switch (valor) { case 0: setBackground(Color.gray); setBackground(new Color(238, 228, 218)); break case 4: setBackground(new Color(238, 224, 198)); ; caso 16: setBackground(new Color(243, 177, 116)); setBackground(new Color(248, 149, 90)); break case 64: setBackground(new Color(249, 94, 50)); ; case 256: setBackground(new Color(239, 207, 99)); 512: setBackground(new Color(239, 203, 82)); break; case 1024: setBackground(new Color(239, 199, 57)); ; quebra; caso 4096: setBackground(new Color(255, 60, 57)); pausa;Meu2048.java
import java.awt.*;import javax.swing.*;public class My2048 estende JFrame { public My2048()//Constructor { setTitle("2048");//Define o título setSize(400, 400);//Set Definir tamanho da janela setLocation(500, 200);//Define a posição inicial da janela setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); getContentPane().setLayout(new GridLayout(4, 4, 5, 5));//Define o modo de layout para GridLayout type new Operation( this ); this.setVisible(true);//Definir visível} public static void main(String args[]) //Ponto de entrada do programa { try { UIManager.setLookAndFeel("org.jvnet.substance.skin.SubstanceRavenGraphiteLookAndFeel"); //Definir a UI } //Aceitar a captura de exceção lançada (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e) { e .printStackTrace(); JFrame.setDefaultLookAndFeelDecorated(true);//Definir a aparência padrão do Frame new My2048();Operação.java
import java.awt.event.*;import javax.swing.*;public class Operation implements KeyListener{ Block[] block;//Usado para armazenar 16 dados JPanel panel; //Usado para acumular o número de movimentos boolean numFlag;//Usado para determinar se novos números podem ser adicionados public Operation(JFrame frame) { this.panel = (JPanel)frame.getContentPane();//Construct panel block = new Block[16];//Constrói um array com comprimento de 16 numFlag = true;//Initialize moveFlag = 0; esquerda=true;direita=true; addBlock(); for (int i = 0; i < 2; i++) aparecerBlock(); addBlock() { for (int i = 0; i < 16; i++) //Adicionar bloco ao painel { block[i] = new Block();setHorizontalAlignment(JLabel.CENTER); bloco[i].setOpaque(true); painel.add(bloco[i]); //Quando um novo valor aleatório pode ser adicionado { int index = (int) (Math.random() * 16); // Pegue um número inteiro aleatório de 0 a 15 e esse número será adicionado ao disco aleatoriamente como 2; Ou a posição de 4 if (block[index].getValue() == 0)//Se o valor no array de blocos onde este número está localizado for 0, ou seja, quando estiver vazio, adicione um número de 2 ou 4 { if (Math.random() < 0.5) { block[index].setValue(2 } else { block[index].setValue(4); //Saltar do while } } } public void juizAppear() //Conta se a matriz do bloco contém valores é um elemento de 0, caso contrário, numFlag torna-se falso { int sum = 0 for (int i = 0; i < 16; i++) { if (block[i].getValue() != 0) { soma++ } } if (soma == 16) numFlag = false } public int Find(int i,int j,int a,int b) { while(i<b&&i>=a) { if( bloco[i].getValue()!=0) { return i } i=i+j } return -1; t=0;int valorJ=0;int valorI=0;int índice=0; for(i=0;i<4;i++) { índice=i; 4) { valorJ=0; valorI=0; if(bloco[índice].getValue()==0) { t=Encontrar(índice,4,0,16); bloco[índice].setValue(bloco[t].getValue()); bloco[t].setValue(0); .getValue()==0) { t=Encontrar(j,4,0,16); bloco[j].setValue(bloco[t].getValue()); bloco[t].setValue(0); valorJ&&valorI!=0&&valorJ!=0) { bloco[índice].setValue(valorI+valorJ); índice=j; } } } public void downBlock() { int i=0,j=0;int t=0;int valorJ=0;int valorI=0;int índice=0; 16;i++) { índice=i; for(j=i-4;j>=0;j-=4) { valorJ=0; { t=Find(index,-4,0,16); if(t!=-1) { bloco[index].setValue(bloco[t].getValue()); } else { break; } } valorI=bloco[index].getValue(); if(t!=-1) { bloco[j].setValue(bloco[t].getValue()); bloco[t].setValue(0 } else { break; getValue(); if(valorI==valorJ&&valorI!=0&&valorJ!=0) { bloco[índice].setValue(valorI+valorJ bloco[j].setValue(0); numFlag = true; } índice=j; } } } public void rightBlock() { int i=0,j=0;int t=0;int valorJ=0;int valorI=0;int índice=0; =3;i<16;i+=4) { índice=i; for(j=i-1;j>i-4;j--) { valorJ=0; if(bloco[índice].getValue()==0) { t=Find(índice,-1,i-3,índice+1); { bloco[índice].setValue(bloco). [t].getValue()); bloco[t].setValue(0); else { break; } valorI=bloco].getValue(); ) { t=Find(j,-1,i-3,j+1); if(t!=-1) { bloco[j].setValue(bloco[t].getValue bloco[t].setValue()); (0); else { break; } valorJ=bloco[j].getValue(); bloco[índice].setValue(valorI+valorJ); bloco[j].setValue(0); t=0;int valorJ=0;int valorI=0;int índice=0; for(i=0;i<16;i+=4) { índice=i; for(j=i+1;j<i+4;j++) { valorJ=0; valorI=0; i+4); if(t!=-1) { bloco[index].setValue(bloco[t].getValue()); valorI=bloco[índice].getValue(); if(bloco[j].getValue()==0) { t=Encontrar(j,1,j,i+4); bloco[j].setValue(bloco[t].getValue()); bloco[t].setValue(0); if(valorI==valorJ&&valorI!=0&&valorJ!=0) { bloco[índice].setValue(valorI+valorJ); over() { if (numFlag ==false&& up==false&&down==false&&left==false&&right==false) //Quando os elementos não podem ser adicionados e o número de passos imóveis excede 36, você perde. Quando você perde, GAMEOVER é exibido no centro do disco { block[4].setText("G"); setText("A "); bloco[6].setText("M"); bloco[7].setText("E"); "V"); bloco[10].setText("E"); bloco[11].setText("R"); bloco[11].addMouseListener(new MouseAdapter() {public void mousePressed(MouseEvent e){reStart();}} ); } } public void win() //Igual a OVER { block[0].setText("Y"); bloco[2].setText("U"); bloco[13].setText("W"); bloco[14].setText("I"); 15].addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { reStart(); } }); reStart()//Reinicia o jogo, semelhante ao construtor, sem mais descrição { numFlag=true; up=true;down=true;left=true;right=true for(int i=0;i; < 16;i++) bloco[i].setValue(0); for (int i = 0; i < 2; i++) apareceBlock(); // Julgue as teclas para cima, para baixo, esquerda e direita pressionadas e chame a função de movimento, função de julgamento, função de adição e função para julgar se deve perder na sequência { switch (e.getKeyCode()) { case KeyEvent.VK_UP: if(up){ upBlock() ;} juizAppear(); aparecerBlock over(); =verdadeiro; } quebra; KeyEvent.VK_DOWN: if(down){ downBlock();} juizAppear(); aparecerBlock(); =true;right=true } break; case KeyEvent.VK_LEFT: if(left){ leftBlock();} juizAppear(); if(numFlag==false) { left=false } else { up=true;down=true;left=true;right=true } break; (); aparecerBlock(); over(); if(numFlag==false) { right=false } else { up=true;down=true;left=true;right=true; } } public void keyTyped(KeyEvent e) { } public void keyReleased(KeyEvent e) { } }O texto acima é todo o código que este artigo compartilha com você sobre a implementação perfeita do minijogo 2048 em Java. Espero que seja útil para todos no aprendizado de Java.