package my2048;
import javax.swing.*;
import java.awt.*;
@SuppressWarnings("serial")
public class Block
extends JLabel {
private int value;
public Block() {
value = 0;
setFont
(new Font("font",
Font.
PLAIN,
40));
setBackground
(Color.
gray);
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
if (value != 0)
setText(text);
else
setText("");
setColor();
}
public void setColor() {
switch (value) {
case 0:
setBackground
(Color.
gray);
break;
case 2:
setBackground
(new Color(238,
228,
218));
break;
case 4:
setBackground
(new Color(238,
224,
198));
break;
case 8:
setBackground
(new Color(243,
177,
116));
break;
case 16:
setBackground
(new Color(243,
177,
116));
break;
case 32:
setBackground
(new Color(248,
149,
90));
break;
case 64:
setBackground
(new Color(249,
94,
50));
break;
case 128:
setBackground
(new Color(239,
207,
108));
break;
case 256:
setBackground
(new Color(239,
207,
99));
break;
case 512:
setBackground
(new Color(239,
203,
82));
break;
case 1024:
setBackground
(new Color(239,
199,
57));
break;
case 2048:
setBackground
(new Color(239,
195,
41));
break;
case 4096:
setBackground
(new Color(255,
60,
57));
break;
}
}
package my2048;
import java.awt.event.*;
import javax.swing.*;
Block[] block;
int moveFlag;
boolean numFlag;
this.
panel = (JPanel)frame.
getContentPane();
block = new Block[16];
numFlag = true;
moveFlag = 0;
addBlock();
for (int i = 0; i < 2; i++)
appearBlock();
frame.addKeyListener(this);
}
private void 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 appearBlock() {
while (numFlag) {
int index
= (int) (Math.
random() * 16);
if (block[index].getValue() == 0) {
block[index].setValue(2);
else
block[index].setValue(4);
break;
}
}
}
public void judgeAppear() {
int sum = 0;
for (int i = 0; i < 16; i++) {
if (block[i].getValue() != 0)
sum++;
}
if (sum == 16)
numFlag = false;
}
public void upBlock() {
for (int i = 12; i < 16; i++) {
int index = i;
for (int j = i - 4; j >= i - 12; j -= 4) {
int valueI = block[index].getValue(), valueJ = block[j]
.getValue();
if (valueJ == 0) {
block[index].setValue(0);
block[j].setValue(valueI);
} else {
if (valueI == valueJ) {
block[index].setValue(0);
block[j].setValue(valueI + valueJ);
if (valueI + valueJ == 4096)
win();
numFlag = true;
moveFlag = 0;
if(j>i-12)
if(block[j-4].getValue()==(valueI+valueJ))
break;
} else if (numFlag == false)
moveFlag += 1;
}
index = j;
}
}
}
public void downBlock() {
for (int i = 0; i < 4; i++) {
int index = i;
for (int j = i + 4; j <= i + 12; j += 4) {
int valueI = block[index].getValue(), valueJ = block[j]
.getValue();
if (valueJ == 0) {
block[index].setValue(0);
block[j].setValue(valueI);
} else {
if (valueI == valueJ) {
block[index].setValue(0);
block[j].setValue(valueI + valueJ);
if (valueI + valueJ == 4096)
win();
numFlag = true;
moveFlag = 0;
if(j<i+12)
if(block[j+4].getValue()==(valueI+valueJ))
break;
} else if (numFlag == false)
moveFlag += 1;
}
index = j;
}
}
}
public void rightBlock() {
for (int i = 0; i <= 12; i += 4) {
int index = i;
for (int j = i + 1; j <= i + 3; j++) {
int valueI = block[index].getValue(), valueJ = block[j]
.getValue();
if (valueJ == 0) {
block[index].setValue(0);
block[j].setValue(valueI);
} else {
if (valueI == valueJ) {
block[index].setValue(0);
block[j].setValue(valueI + valueJ);
if (valueI + valueJ == 4096)
win();
numFlag = true;
moveFlag = 0;
if(j<i+3)
if(block[j+1].getValue()==(valueI+valueJ))
break;
} else if (numFlag == false)
moveFlag += 1;
}
index = j;
}
}
}
public void leftBlock() {
for (int i = 3; i <= 15; i += 4) {
int index = i;
for (int j = i - 1; j >= i - 3; j--) {
int valueI = block[index].getValue(), valueJ = block[j]
.getValue();
if (valueJ == 0) {
block[index].setValue(0);
block[j].setValue(valueI);
} else {
if (valueI == valueJ) {
block[index].setValue(0);
block[j].setValue(valueI + valueJ);
if (valueI + valueJ == 4096)
win();
numFlag = true;
moveFlag = 0;
if(j<i-3)
if(block[j-1].getValue()==(valueI+valueJ))
break;
} else if (numFlag == false)
moveFlag += 1;
}
index = j;
}
}
}
public void over() {
if (!numFlag && moveFlag >= 36) {
block[4].setText("G");
block[5].setText("A");
block[6].setText("M");
block[7].setText("E");
block[8].setText("O");
block[9].setText("V");
block[10].setText("E");
block[11].setText("R");
@Override
reStart();
}
});
}
}
public void win() {
block[0].setText("Y");
block[1].setText("O");
block[2].setText("U");
block[13].setText("W");
block[14].setText("I");
block[15].setText("N");
@Override
reStart();
}
});
}
public void reStart(){
numFlag=true;
moveFlag=0;
for(int i=0;i<16;i++)
block[i].setValue(0);
for (int i = 0; i < 2; i++)
appearBlock();
}
@Override
switch (e.getKeyCode()) {
upBlock();
judgeAppear();
appearBlock();
over();
break;
downBlock();
judgeAppear();
appearBlock();
over();
break;
leftBlock();
judgeAppear();
appearBlock();
over();
break;
rightBlock();
judgeAppear();
appearBlock();
over();
break;
}
}
@Override
}
@Override
}
}
package my2048;
import java.awt.*;
import javax.swing.*;
@SuppressWarnings("serial")
public class My2048
extends JFrame {
public My2048() {
setTitle("2048");
setSize(400, 400);
setLocation(500, 200);
setDefaultCloseOperation
(JFrame.
EXIT_ON_CLOSE);
getContentPane
().
setLayout(new GridLayout(4,
4,
5,
5));
this.setVisible(true);
}
public static void main
(String args
[]) {
try {
.setLookAndFeel("org.jvnet.substance.skin.SubstanceRavenGraphiteLookAndFeel");
e.printStackTrace();
}
JFrame.
setDefaultLookAndFeelDecorated(true);
new My2048();
}
}