2048 게임을 완벽하게 모방했으며 네티즌의 2048을 기반으로 수정되었습니다.
Block.java
import javax.swing.*;import java.awt.*;public class Block extends JLabel { private int value; public Block() { value = 0;//초기 값은 0입니다. setFont(new Font("font", Font) . PLAIN, 40));//글꼴 설정 setBackground(Color.gray);//초기 색상을 회색으로 설정} public int getValue()//값 가져오기 { 반환 값 } public void; setValue(int value) { this.value = value; String text = String.valueOf(value); if (value != 0) setText(text); //값이 0이면 표시되지 않습니다. setColor(); } public void setColor() //다른 값에 따라 다른 배경색과 레이블 글꼴을 설정합니다. { switch (value) { 사례 0: setBackground(Color.gray) 사례 2: setBackground(new Color(238, 228, 218)); break; 사례 4: setBackground(new Color(238, 224, 198)); break; 사례 8: setBackground(new Color(243, 177, 116)); ; 사례 16: setBackground(new Color(243, 177, 116)) 사례 32: setBackground(new Color(248, 149, 90)); break; 케이스 64: setBackground(new Color(249, 94, 50)); break; 케이스 128: setBackground(new Color(239, 207, 108)); ; 케이스 256: setBackground(new Color(239, 207, 99)); 512: setBackground(new Color(239, 203, 82)); 케이스 1024: setBackground(new Color(239, 199, 57)); 케이스 2048: setBackground(new Color(239, 195, 41)) ; 중단; 사례 4096: setBackground(new Color(255, 60, 57));My2048.java
import java.awt.*;import javax.swing.*;public class My2048 extends JFrame { public My2048()//Constructor { setTitle("2048");//제목 설정 setSize(400, 400);//Set 창 크기 설정 setLocation(500, 200);//창의 시작 위치 설정 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); getContentPane().setLayout(new GridLayout(4, 4, 5, 5));//레이아웃 모드를 GridLayout 유형으로 설정 new Operation( this ); this.setVisible(true);//표시 설정} public static void main(String args[]) //프로그램 진입점 { try { UIManager.setLookAndFeel("org.jvnet.substance.skin.SubstanceRavenGraphiteLookAndFeel"); //UI 설정 } //발생된 예외 허용 catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e) { e .printStackTrace() } JFrame.setDefaultLookAndFeelDecorated(true);//프레임의 기본 모양 설정 new My2048() } }Operation.java
import java.awt.event.*;import javax.swing.*;public class Operation Implements KeyListener{ Block[] 블록;//16개 데이터를 저장하는 데 사용 JPanel 패널; public boolean up,down,left,right; //이동 횟수를 누적하는 데 사용됩니다. boolean numFlag;//새 숫자를 추가할 수 있는지 여부를 결정하는 데 사용됩니다. public Operation(JFrame 프레임) { this.panel = (JPanel)frame.getContentPane();//패널 블록 구성 = new Block[16];//길이가 16인 배열 구성 numFlag = true;//moveFlag 초기화 = 0; left=true;right=true; addBlock(); for (int i = 0; i < 2; i++) 나타나는 프레임.addKeyListener(this); addBlock() { for (int i = 0; i < 16; i++) //패널에 블록 추가 { block[i] = new Block(); block[i].setHorizontalAlignment(JLabel.CENTER); block[i].setOpaque(true); panel.add(block[i]) } } public void discoverBlock() { while (numFlag) //새로운 임의의 값을 추가할 수 있는 경우 { int index = (int) (Math.random() * 16); // 0부터 15까지 임의의 정수를 취하고 이 숫자는 디스크에 무작위로 2로 추가됩니다. 또는 4의 위치 if (block[index].getValue() == 0)//이 숫자가 위치한 블록 배열의 값이 0인 경우, 즉 비어 있는 경우 2 또는 4 { if (수학 .random() < 0.5) { block[index].setValue(2); } else { block[index].setValue(4); } break;//Jump out of while } } } public void JudgeAppear() //블록 배열 여부 계산 값이 포함되어 있으면 0의 요소이고, 그렇지 않은 경우 numFlag는 false가 됩니다. { int sum = 0; for (int i = 0; i < 16; i++) { if (block[i].getValue() != 0) { sum++; } } if (sum == 16) numFlag = false } public int Find(int i,int j,int a,int b) { while(i<b&&i>=a) { if( block[i].getValue()!=0) { return i; } i=i+j } return -1 } 공개 void upBlock() { int i=0,j=0;int t=0;int 값J=0;int 값I=0;int 인덱스=0; for(i=0;i<4;i++) { 인덱스=i; for(j=i+4;j<16;j+= 4) { valueJ=0; valueI=0; if(block[index].getValue()==0) { t=Find(index,4,0,16); block[index].setValue(block[t].getValue()); block[t].setValue(0) } else { break } } valueI=block[index].getValue(); ].getValue()==0) { t=Find(j,4,0,16) if(t!=-1) { block[j].setValue(block[t].getValue()); block[t].setValue(0) } else { break } } valueJ=block[j].getValue(); valueJ&&valueI!=0&&valueJ!=0) { block[index].setValue(valueI+valueJ) block[j].setValue(0); index=j; } } } 공개 무효 downBlock() { int i=0,j=0;int t=0;int valueJ=0;int valueI=0;int index=0; 16;i++) { 인덱스=i; for(j=i-4;j>=0;j-=4) { valueJ=0; valueI=0; if(block[index].getValue()==0) { t=Find(index,-4,0,16); if(t!=-1) { block[index].setValue(block[t].getValue()); } else { break; } } valueI=block[index].getValue(); if(block[j].getValue()==0) { t=Find(j,-4,0,16); if(t!=-1) { block[j].setValue(block[t].getValue()); block[t].setValue(0) } else { break; getValue(); if(valueI==valueJ&&valueI!=0&&valueJ!=0) { block[index].setValue(valueI+valueJ); numFlag = true; } 인덱스=j; } } } 공개 void rightBlock() { int i=0,j=0;int t=0;int valueJ=0;int valueI=0;int index=0; =3;i<16;i+=4) { 인덱스=i; for(j=i-1;j>i-4;j--) { 값J=0; if(block[index].getValue()==0) { t=Find(index,-1,i-3,index+1); if(t!=-1) { block[index].setValue(block [t].getValue()); block[t].setValue(0); } else { break } } valueI=block[index].getValue(); ) { t=Find(j,-1,i-3,j+1); if(t!=-1) { block[j].setValue(block[t].getValue()); (0); } else { 중단; } } valueJ=block[j].getValue(); block[index].setValue(valueI+valueJ); numFlag = true } index=j } } } public void leftBlock() { int i=0,j=0;int t=0;int 값J=0;int 값I=0;int 인덱스=0 for(i=0;i<16;i+=4) { 인덱스=i; for(j=i+1;j<i+4;j++) { valueJ=0; valueI=0; if(block[index].getValue()==0) { t=Find(index,1,index, i+4); if(t!=-1) { block[index].setValue(block[t].getValue()); block[t].setValue(0) } else; valueI=block[index].getValue(); if(block[j].getValue()==0) { t=Find(j,1,j,i+4); if(t!=-1) block[j].setValue(block[t].getValue()); block[t].setValue(0) } else { break } } valueJ=block[j].getValue(); if(valueI==valueI!=0&&valueJ!=0) { block[index].setValue(valueI+valueJ); block[j].setValue(0) } index=j; over() { if (numFlag ==false&& up==false&&down==false&&left==false&&right==false) //요소를 추가할 수 없고 이동할 수 없는 단계 수가 36개를 초과하면 패배합니다. 패배하면 디스크 중앙에 GAMEOVER가 표시됩니다. { block[4].setText("G"); setText("A "); block[6].setText("M"); block[8].setText("O"); "V") ; block[10].setText("E"); block[11].setText("R"); block[11].addMouseListener(new MouseAdapter() {public void mousePressed(MouseEvent e){reStart();}} ); } } public void win() //OVER { block[0].setText("Y") block[1].setText("O"); block[2].setText("U"); block[14].setText("I"); 15].addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { reStart(); } }) public void reStart()//생성자와 유사하게 게임을 다시 시작합니다. 더 이상 설명이 없습니다. { numFlag=true; moveFlag=0; left=true;right=true; < 16;i++) block[i].setValue(0); for (int i = 0; i < 2; i++)appearBlock() } public void keyPressed(KeyEvent e) //상하좌우 키를 눌렀는지 판단하고, 이동함수, 판단함수, 추가함수, 패전함수를 순서대로 호출하는 함수 { switch (e.getKeyCode()) { case KeyEvent.VK_UP: if(up){ upBlock() ;} JudgeAppear(); over(); if(numFlag==false) { up=false; } else { up=true;down=true;left=true; =true } 중단; KeyEvent.VK_DOWN: if(down){ downBlock();} JudgeAppear(); over(); if(numFlag==false) { down=false } else { up=true;down=true; =true;right=true; } break; 케이스 KeyEvent.VK_LEFT: if(left){ leftBlock();} JudgeAppear(); if(numFlag==false) { left=false; } else { up=true;down=true;left=true;right=true; } break; 케이스 KeyEvent.VK_RIGHT: if(right){ rightBlock();} JudgeAppear ();appear(); if(numFlag==false) { right=false; } else { up=true;down=true;left=true;right=true; } } 공개 무효 keyTyped(KeyEvent e) { } 공개 무효 keyReleased(KeyEvent e) { } }위 내용은 이 기사에서 Java로 2048 미니 게임을 완벽하게 구현하는 방법에 대해 공유하는 모든 코드입니다. Java를 배우는 모든 사람에게 도움이 되기를 바랍니다.