これは 2048 ゲームを完全に模倣しており、ネチズンからの 2048 に基づいて変更されています。
ブロック.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()//値を取得します { return value } public void; setValue(int value) { this.value = value; String text = String.valueOf(value); if (value != 0) setText("");// 値が 0 の場合、表示されません setColor(); } public void setColor() //異なる値に応じて異なる背景色とラベルのフォントを設定します { switch (value) { case 0: setBackground(Color.gray); setBackground(new Color(238, 228, 218)); ケース 4: setBackground(new Color(238, 224, 198)); setBackground(new Color(243, 177, 116)); ; ケース 16: setBackground(new Color(243, 177, 116)); setBackground(new Color(248, 149, 90)); ケース 64: setBackground(new Color(249, 94, 50)); ケース 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(); } }オペレーション.java
import java.awt.event.*;import javax.swing.*;public class オペレーションは KeyListener{ Block[] block を実装します。//16 個のデータを格納するために使用されます。 public boolean up,down,left,right; //移動回数を累積するために使用されます boolean numFlag;//新しい数値を追加できるかどうかを決定するために使用されます public Operation(JFrame Frame) { 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++) addBlock() { for (int i = 0; i < 16; i++) // パネルにブロックを追加 { block[i] = new Block(); // 不透明なラベルblock[i].setOpaque(true); パネル.add(block[i]); } } public void appearedBlock() { 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;// 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) block[i].getValue()!=0) { return i; } i=i+j; } public 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) { 値 J=0; 値 I=0; if(ブロック[インデックス].getValue()==0) { t=Find(インデックス,4,0,16);ブロック[インデックス].setValue(ブロック[t].getValue()); } else { ブレーク; } if(ブロック[j] ].getValue()==0) { t=Find(j,4,0,16); if(t!=-1) {ブロック[j].setValue(ブロック[t].getValue()); } else { ブレーク; } } valueJ=block[j].getValue(); valueJ&&valueI!=0&&valueJ!=0) { block[index].setValue(valueI+valueJ); numFlag = true;インデックス = j; } } } public void downBlock() { int i=0,j=0;int t=0;int 値 J=0;int 値 I=0;int インデックス =0; 16;i++) { インデックス = i; for(j=i-4;j>=0;j-=4) { 値 J=0; if(ブロック[インデックス].getValue()==0) { t=Find(インデックス,-4,0,16); if(t!=-1) { ブロック[インデックス].setValue(ブロック[t].getValue()); } else { ブレーク; } } 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; } } } public void rightBlock() { int i=0,j=0;int t=0;int valueJ=0;int valueI=0;int インデックス=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()); } else { ブレーク; } } valueI=block[j].getValue(); ) { t=Find(j,-1,i-3,j+1); if(t!=-1) { block[j].setValue(block[t].getValue()); (0); } else { ブレーク; } } valueJ==valueJ&&valueI!=0&&valueJ!=0ブロック[インデックス].setValue(値I+値J); numFlag = true; } } } 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].setValue()); else { Break; valueI=block[インデックス].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; if(valueI==valueJ&&valueI!=0&&valueJ!=0) { block[index].setValue(valueI+valueJ) } } } numFlag; over() { if (numFlag ==false&& up==false&&down==false&&left==false&&right==false) //要素を追加できず、動かせないステップ数が36を超えた場合は負けとなります。 負けた場合はディスク中央にGAMEOVERが表示されます。 { block[4].setText block[5]; setText("A"); ブロック[6].setText("E"); "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"); と同じブロック[2].setText("U"); ブロック[13].setText("I"); 15].addMouseListener(new MouseAdapter() { public void MousePressed(MouseEvent e) { reStart(); } }); reStart()// コンストラクターと同様に、これ以上の説明はありません { numFlag=true;down=true;left=true;right=true; < 16;i++) block[i].setValue(0); for (int i = 0; i < 2; i++) } public void keyPressed(KeyEvent e) //上下左右キーの押下を判定し、move関数、判定関数、add関数、負けるかどうかを判定する関数を順に呼び出します { switch (e.getKeyCode()) { case KeyEvent.VK_UP: if(up){ upBlock() ;} subjectAppear(); over(); if(numFlag==false) { up=false; } else { up=true;down=true;right =true; } の場合KeyEvent.VK_DOWN: if(down){ downBlock();} subjectAppear(); over(); if(numFlag==false) { down=false } else { up=true;down=true; =true;right=true; } ブレーク; case KeyEvent.VK_LEFT: if(left){ leftBlock(); } if(numFlag==false) { left=false; } else { up=true;down=true;left=true;right=true; } case KeyEvent.VK_RIGHT: if(right){ rightBlock();} (); 出現ブロック(); オーバー(); if(numFlag==false) { right=true; left=true; } } } public void keyTyped(KeyEvent e) { } public void keyリリース(KeyEvent e) { } }上記は、Java での 2048 ミニ ゲームの完璧な実装についてこの記事で共有するコードのすべてです。これが Java を学習する皆さんの役に立つことを願っています。