Imita perfectamente el juego 2048 y está modificado en base a un 2048 de un internauta.
bloque.java
import javax.swing.*;import java.awt.*;public class Block extiende JLabel { private int value; public Block() { value = 0;//El valor inicial es 0 setFont(new Font("font", Font . PLAIN, 40));//Establece la fuente setBackground(Color.gray);//Establece el color inicial en gris} public int getValue()//Obtiene el valor { valor de retorno } public void; setValue(int valor) { this.value = value; String text = String.valueOf(value); if (value!= 0) setText(text); else setText("");// Si el valor es 0, no se mostrará setColor() } public void setColor() // Establece diferentes colores de fondo y fuentes de etiquetas según diferentes valores { switch (valor) { case 0: setBackground(Color.gray case 2); setBackground(nuevo Color(238, 228, 218)); caso 4: setBackground(nuevo Color(238, 224, 198)); ; caso 16: setBackground(nuevo Color(243, 177, 116)); setBackground(nuevo Color(248, 149, 90)); caso 64: setBackground(nuevo Color(249, 94, 50)); ; caso 256: setBackground(nuevo Color(239, 207, 99)); 512: setBackground(nuevo Color(239, 203, 82)); caso 1024: setBackground(nuevo Color(239, 199, 57)); caso 2048: setBackground(nuevo Color(239, 195, 41)); ; romper; caso 4096: setBackground(nuevo Color(255, 60, 57)); romper; } }}Mi2048.java
import java.awt.*;import javax.swing.*;public class My2048 extends JFrame { public My2048()//Constructor { setTitle("2048");//Establecer el título setSize(400, 400);//Establecer Establecer el tamaño de la ventana setLocation(500, 200);//Establece la posición inicial de la ventana setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); getContentPane().setLayout(new GridLayout(4, 4, 5, 5));//Establece el modo de diseño en el tipo GridLayout new Operation( this); this.setVisible(true);//Establecer visible} public static void main(String args[]) //Punto de entrada del programa { try { UIManager.setLookAndFeel("org.jvnet.substance.skin.SubstanceRavenGraphiteLookAndFeel"); //Establece la interfaz de usuario } //Acepta la excepción lanzada catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e) { e .printStackTrace(); JFrame.setDefaultLookAndFeelDecoated(true);//Establece la apariencia predeterminada de Frame new My2048();Operación.java
import java.awt.event.*;import javax.swing.*;public class La operación implementa KeyListener{ Block[] block;// Se utiliza para almacenar 16 datos del panel JPanel public boolean up,down,left,right; //Se usa para acumular el número de movimientos boolean numFlag;//Se usa para determinar si se pueden agregar nuevos números public Operation(JFrame frame) { this.panel = (JPanel)frame.getContentPane();//Construir bloque de panel = new Block[16];//Construir una matriz con una longitud de 16 numFlag = true;//Inicializar moveFlag = 0; up=true;down=true; izquierda=verdadero;derecha=verdadero; addBlock(); para (int i = 0; i < 2; i++) apareceBlock(); addKeyListener(this } private void); addBlock() { for (int i = 0; i < 16; i++) //Agregar bloque al panel { block[i] = new Block(); block[i].setHorizontalAlignment(JLabel.CENTER); bloque[i].setOpaque(true); panel.add(bloque[i]); public void aparecerBlock() { while (numFlag) //Cuando se puede agregar un nuevo valor aleatorio { int index = (int) (Math.random() * 16 // Toma un número entero aleatorio de 0 a 15, y este número se agregará al disco aleatoriamente como 2); O la posición de 4 if (block[index].getValue() == 0)//Si el valor en la matriz de bloques donde se encuentra este número es 0, es decir, cuando esté vacío, agregue un número de 2 o 4 {si (Matemáticas.aleatorio() < 0.5) { block[index].setValue(2); } else { block[index].setValue(4); break;//Saltar de while } } } public void JudgeAppear() //Cuenta si la matriz de bloques contiene valores es un elemento de 0, si no, numFlag se vuelve falso { int suma = 0 for (int i = 0; i < 16; i++) { if (block[i].getValue() != 0) { suma++; } } if (suma == 16) numFlag = false } public int Find(int i,int j,int a,int b) { while(i<b&&i>=a) { if( bloque[i].getValue()!=0) { return i } i=i+j } return -1 } public void upBlock() { int i=0,j=0;int 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(block[index].getValue()==0) { t=Buscar(index,4,0,16); bloque[índice].setValue(bloque[t].getValue()); bloque[t].setValue(0); ].getValue()==0) { t=Buscar(j,4,0,16); if(t!=-1) { bloque[j].setValue(bloque[t].getValue()); bloque[t].setValue(0); valorJ&&valorI!=0&&valorJ!=0) { bloque[índice].setValue(valorI+valorJ); bloque[j].setValue(0); index=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; valorI=0; { t=Buscar(índice,-4,0,16); if(t!=-1) { bloque[índice].setValue(bloque[t].getValue()); bloque[t].setValue(0); } else { break } } valueI=block[index].getValue(); if(block[j].getValue()==0) { t=Find(j,-4,0,16); if(t!=-1) { bloque[j].setValue(bloque[t].getValue()); bloque[t].setValue(0); else { break } } valorJ=bloque[j]. getValue(); if(valorI==valorJ&&valorI!=0&&valorJ!=0) { bloque[índice].setValue(valorI+valorJ); bloque[j].setValue(0); numFlag = true; } index=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(bloque[índice].getValue()==0) { t=Buscar(índice,-1,i-3,índice+1); if(t!=-1) { bloque[índice].setValue(bloque) [t].getValue()); bloque[t].setValue(0); } else { break } } valorI=bloque[index].getValue(); ) { t=Buscar(j,-1,i-3,j+1); if(t!=-1) { bloque[j].setValue(bloque[t].getValue()); (0); else { descanso } } valorJ=bloque[j].getValue(); valorI==valorJ&&valorI!=0&&valorJ!=0) { bloque[índice].setValue(valorI+valorJ); bloque[j].setValue(0); numFlag = true } index=j } } } public void leftBlock() { int i=0,j=0;int; 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; if(bloque[índice].getValue()==0) { t=Buscar(índice,1,índice, i+4); if(t!=-1) { bloque[index].setValue(bloque[t].getValue()); bloque[t].setValue(0); valorI=bloque[índice].getValue(); if(bloque[j].getValue()==0) { t=Buscar(j,1,j,i+4); bloque[j].setValue(bloque[t].getValue()); bloque[t].setValue(0); if(valorI==valorJ&&valorI!=0&&valorJ!=0) { bloque[índice].setValue(valorI+valorJ); bloque[j].setValue(0); índice=j; over() { if (numFlag ==falso&& arriba==falso&&abajo==falso&&izquierda==falso&&derecha==falso) // Cuando no se pueden agregar elementos y el número de pasos inamovibles excede los 36, pierdes. Cuando pierdes, GAMEOVER se muestra en el centro del disco { block[4].setText("G"); setText("A "); bloque[6].setText("M"); bloque[7].setText("E"); bloque[8].setText("O"); "V") ; bloque[10].setText("E"); bloque[11].setText("R"); bloque[11].addMouseListener(new MouseAdapter() {public void mousePressed(MouseEvent e){reStart();}} ); } } public void win() //Igual que OVER { block[0].setText("Y"); bloque[2].setText("U"); bloque[13].setText("W"); bloque[14].setText("I"); bloque[15].setText("N"); 15].addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { reStart(); } } } public void); reStart()//Reinicia el juego, similar al constructor, sin más descripción { numFlag=true; moveFlag=0; up=true;down=true;left=true;right=true; < 16;i++) bloque[i].setValue(0); for (int i = 0; i < 2; i++) aparecerBlock() } public void keyPressed(KeyEvent e) // Juzgue las teclas arriba, abajo, izquierda y derecha presionadas y llame a la función de movimiento, función de juicio, función de agregar y función para juzgar si se debe perder en secuencia { switch (e.getKeyCode()) { case KeyEvent.VK_UP: if(arriba){ upBlock() ;} juezAppear(); aparecerBlock(); over(); if(numFlag==false) { up=false } else { arriba=verdadero;abajo=verdadero;izquierda=verdadero;derecha =verdadero; } caso de ruptura; KeyEvent.VK_DOWN: if(down){ downBlock();} juezAppear(); aparecerBlock(); if(numFlag==false) { down=false } else { up=true;down=true;left; =verdadero;derecho=verdadero; } romper; caso KeyEvent.VK_LEFT: if(izquierda){ leftBlock();} juezAppear(); aparecerBlock(); if(numFlag==false) { left=false } else { up=true;down=true;left=true;right=true } break case KeyEvent.VK_RIGHT: if(right){ rightBlock();} juezAparecer (); aparecerBlock(); over(); if(numFlag==false) { derecha=false } else { arriba=verdadero;abajo=verdadero;izquierda=verdadero;derecha=verdadero; } } public void keyTyped(KeyEvent e) { } public void keyReleased(KeyEvent e) { } }Lo anterior es todo el código que este artículo comparte con usted sobre la implementación perfecta del minijuego 2048 en Java. Espero que sea útil para todos en el aprendizaje de Java.