import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
@SuppressWarnings("serial")
public class AWTGame2048 extends JApplet {
@SuppressWarnings("unused")
private static final int UP = 0, DOWN = 1, LEFT = 2, RIGHT = 3;
private static final int WID = 150, SP = 10;
@SuppressWarnings("unused")
private int scores = 0;
private static JLabel scoreLabel;
private boolean change, CheckMode = false, gameOverFlag = false, successFlag = false;
private int[] label = {2, 4, 8, 16, 32, 64, 128};
private Color[] clo = {
new Color(200, 200, 200), new Color(228, 228, 160), new Color(214, 163, 92),
new Color(234, 124, 72), new Color(240, 84, 77), new Color(255, 68, 53), new Color(200, 200, 64)
};
@SuppressWarnings("rawtypes")
private Map cmap = new HashMap();
public static RectObject[][] rset = new RectObject[4][4];
public RectObject[][] list = new RectObject[4][4];
private My2048Panel myp;
@SuppressWarnings("rawtypes")
private LinkedList saveList = new LinkedList();
private JButton goBackButton;
KeyListener kl = new KeyListener() {
public void keyPressed(KeyEvent e) {
saveTheStep();
goBackButton.setVisible(true);
if (gameOverFlag == true) {
return;
}
if (!aDirAble()) {
gameOver();
}
int key = e.getKeyCode();
switch (key) {
case KeyEvent.VK_UP:
change = false;
moveUp(true);
if (change == true) {
getARandomRect();
//saveTheStep();
}
break;
case KeyEvent.VK_DOWN:
change = false;
moveDown(true);
if (change == true) {
getARandomRect();
//saveTheStep();
}
break;
case KeyEvent.VK_LEFT:
change = false;
moveLeft(true);
if (change == true) {
getARandomRect();
//saveTheStep();
}
break;
case KeyEvent.VK_RIGHT:
change = false;
moveRight(true);
if (change == true) {
getARandomRect();
//saveTheStep();
}
break;
}
//saveTheStep();
}
public void keyTyped(KeyEvent e) {
}
public void keyReleased(KeyEvent e) {
}
};
class RectObject {
private int value;
public RectObject() {
value = 0;
}
public RectObject(RectObject obj) {
value = obj.value;
}
public boolean equals(Object inobj) {
RectObject obj = (RectObject) inobj;
if (obj.value == value) {
return true;
}
return false;
}
}
class Point {
int x;
int y;
public Point(int i, int j) {
x = i;
y = j;
}
}
class My2048Panel extends JPanel {
private int[] xindex = {SP, 2 * SP + WID, 3 * SP + 2 * WID, 4 * SP + 3 * WID};
private int[] yindex = {SP, 2 * SP + WID, 3 * SP + 2 * WID, 4 * SP + 3 * WID};
@SuppressWarnings("deprecation")
public void paintComponent(Graphics g) {
//background
super.paintComponent(g);
for (int i = 0; i < xindex.length; i++) {
for (int j = 0; j < yindex.length; j++) {
g.setColor(Color.WHITE);
g.drawRoundRect(xindex[i], yindex[j], WID, WID, WID / 5, WID / 5);
g.setColor(new Color(197, 183, 129));
g.fillRoundRect(xindex[i], yindex[j], WID, WID, WID / 5, WID / 5);
}
}
//paint rectangle
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (rset[i][j] != null) {
g.setColor(Color.WHITE);
g.drawRoundRect(yindex[j], xindex[i], WID, WID, WID / 5, WID / 5);
if (rset[i][j].value < 128) {
g.setColor((Color) cmap.get(rset[i][j].value));
} else {
g.setColor((Color) cmap.get(128));
}
g.fillRoundRect(yindex[j], xindex[i], WID, WID, WID / 5, WID / 5);
g.setColor(Color.BLACK);
Font font = new Font("TimesRoman", Font.BOLD, 50);
g.setFont(font);
FontMetrics fm = Toolkit.getDefaultToolkit().getFontMetrics(font);
int len = fm.stringWidth("" + rset[i][j].value);
int hg = fm.getHeight();
g.drawString("" + rset[i][j].value, yindex[j] + WID / 2 - len / 2, xindex[i] + WID / 2 + hg / 4);
if (rset[i][j].value == 2048 && successFlag == false) {
successFlag = true;
gameSuccess();
}
}
}
}
}
}
class GameOverPane extends JPanel {
public GameOverPane(int w, int h) {
setSize(w, h);
//setOpaque(false);
}
@SuppressWarnings("deprecation")
public void paintComponent(Graphics g) {
super.paintComponent(g);
Font font = new Font("TimesRoman", Font.BOLD, 80);
g.setFont(font);
FontMetrics fm = Toolkit.getDefaultToolkit().getFontMetrics(font);
int width = fm.stringWidth("Game Over");
int height = fm.getHeight();
g.setColor(new Color(255, 0, 0));
g.drawString("Game Over!", getWidth() / 2 - width / 2, getHeight() / 2 - height / 2);
}
}
class SuccessPane extends JPanel {
public SuccessPane(int w, int h) {
setSize(w, h);
//setOpaque(false);
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Font font = new Font("TimesRoman", Font.BOLD, 80);
g.setFont(font);
@SuppressWarnings("deprecation")
FontMetrics fm = Toolkit.getDefaultToolkit().getFontMetrics(font);
int width = fm.stringWidth("Success!");
int height = fm.getHeight();
g.setColor(new Color(255, 0, 0));
g.drawString("Success!", getWidth() / 2 - width / 2, getHeight() / 2 - height / 2);
}
}
class LOGO extends JPanel {
public LOGO(int w, int h) {
setSize(w, h);
}
@SuppressWarnings("unused")
public void paintComponent(Graphics g) {
super.paintComponent(g);
Font font = new Font("TimesRoman", Font.BOLD, 60);
g.setFont(font);
@SuppressWarnings("deprecation")
FontMetrics fm = Toolkit.getDefaultToolkit().getFontMetrics(font);
int width = fm.stringWidth("2048");
int height = fm.getHeight();
g.setColor(new Color(255, 0, 0));
g.drawString("2048", 20, getHeight() / 2 + 20);
}
}
public class goBackListener implements ActionListener {
@SuppressWarnings("rawtypes")
public void actionPerformed(ActionEvent e) {
if (saveList.size() == 0) {
goBackButton.setVisible(false);
return;
}
ArrayList arr = (ArrayList) saveList.getLast();
scoreLabel.setText("" + arr.get(0));
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
int num = (int) arr.get(4 * i + j + 1);
if (num != 0) {
rset[i][j] = new RectObject();
rset[i][j].value = num;
} else {
rset[i][j] = null;
}
}
}
saveList.removeLast();
repaint();
}
}
public class resetListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
refreshBest();
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
rset[i][j] = null;
}
}
scoreLabel.setText("0");
repaint();
getARandomRect();
getARandomRect();
}
}
//the applet init
public void init() {
Container cp = getContentPane();
cp.setLayout(null);
cp.setFocusable(true);
cp.addKeyListener(kl);
Font font = new Font("TimesNewman", Font.BOLD, 30);
JLabel sl = new JLabel();
sl.setLayout(new GridLayout(2, 1));
JLabel sllb = new JLabel("Scores");
sllb.setFont(font);
scoreLabel = new JLabel("0");
scoreLabel.setFont(font);
sl.add(sllb);
sl.add(scoreLabel);
int best = 0;
try {
File file = new File("BestRecord");
if (file.exists()) {
RandomAccessFile f = new RandomAccessFile(file, "rw");
best = f.readInt();
f.close();
}
} catch (FileNotFoundException e) {
best = 0;
e.printStackTrace();
} catch (IOException e) {
best = 0;
e.printStackTrace();
}
JLabel bsl = new JLabel();
bsl.setLayout(new GridLayout(2, 1));
JLabel jl = new JLabel("Best");
jl.setFont(font);
JLabel jl1 = new JLabel("" + best);
jl1.setFont(font);
bsl.add(jl);
bsl.add(jl1);
myp = new My2048Panel();
LOGO logo = new LOGO(0, 0);
goBackButton = new JButton("UNDO");
goBackButton.setFont(font);
goBackButton.addActionListener(new goBackListener());
goBackButton.addKeyListener(kl);
JButton jb = new JButton("RESET");
jb.setFont(font);
jb.addActionListener(new resetListener());
jb.addKeyListener(kl);
sl.setBounds(500, 20, 200, 80);
bsl.setBounds(300, 20, 200, 80);
logo.setBounds(0, 0, 600, 100);
myp.setBounds(0, 90, 700, 700);
goBackButton.setBounds(700, 250, 150, 60);
jb.setBounds(700, 450, 150, 60);
cp.add(sl);
cp.add(bsl);
cp.add(logo);
cp.add(myp);
cp.add(goBackButton);
cp.add(jb);
File f = new File("LASTRECORD");
if (f.exists()) {
try {
RandomAccessFile file = new RandomAccessFile(f, "rw");
int num = file.readInt();
scoreLabel.setText("" + num);
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
num = file.readInt();
if (num != 0) {
rset[i][j] = new RectObject();
rset[i][j].value = num;
}
}
}
file.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} else {
getARandomRect();
getARandomRect();
}
}
@SuppressWarnings("unchecked")
public AWTGame2048() {
//saveTheStep();
for (int i = 0; i < 7; i++) {
cmap.put(label[i], clo[i]);
}
}
//moveLeft
public void moveLeft(boolean flag) {
clearList(list);
for (int i = 0; i < 4; i++) {
int k = 0;
for (int j = 0; j < 4; j++) {
if (rset[i][j] != null) {
list[i][k++] = new RectObject(rset[i][j]);
}
}
}
for (int i = 0; i < 4 && flag; i++) {
for (int j = 0; j < 3; j++) {
if (list[i][j] != null && list[i][j + 1] != null && list[i][j].value == list[i][j + 1].value) {
list[i][j].value *= 2;
if (CheckMode == false) {
int sum = Integer.parseInt(scoreLabel.getText());
sum += list[i][j].value;
scoreLabel.setText("" + sum);
}
list[i][j + 1] = null;
j++;
}
}
}
if (isChange()) {
if (CheckMode == false) {
copySet(rset, list);
repaint();
moveLeft(false);
}
change = true;
} else {
repaint();
}
}
//moveRight
public void moveRight(boolean flag) {
clearList(list);
for (int i = 0; i < 4; i++) {
int k = 3;
for (int j = 3; j > -1; j--) {
if (rset[i][j] != null) {
list[i][k--] = new RectObject(rset[i][j]);
}
}
}
for (int i = 0; i < 4 && flag; i++) {
for (int j = 3; j > 0; j--) {
if (list[i][j] != null && list[i][j - 1] != null && list[i][j].value == list[i][j - 1].value) {
list[i][j].value *= 2;
if (CheckMode == false) {
int sum = Integer.parseInt(scoreLabel.getText());
sum += list[i][j].value;
scoreLabel.setText("" + sum);
}
list[i][j - 1] = null;
j--;
}
}
}
if (isChange()) {
if (CheckMode == false) {
copySet(rset, list);
repaint();
moveRight(false);
}
change = true;
} else {
repaint();
}
}
//moveup
public void moveUp(boolean flag) {
clearList(list);
for (int j = 0; j < 4; j++) {
int k = 0;
for (int i = 0; i < 4; i++) {
if (rset[i][j] != null) {
list[k++][j] = new RectObject(rset[i][j]);
}
}
}
for (int j = 0; j < 4 && flag; j++) {
for (int i = 0; i < 3; i++) {
if (list[i][j] != null && list[i + 1][j] != null && list[i][j].value == list[i + 1][j].value) {
list[i][j].value *= 2;
if (CheckMode == false) {
int sum = Integer.parseInt(scoreLabel.getText());
sum += list[i][j].value;
scoreLabel.setText("" + sum);
}
list[i + 1][j] = null;
i++;
}
}
}
if (isChange()) {
if (CheckMode == false) {
copySet(rset, list);
repaint();
moveUp(false);
}
change = true;
} else {
repaint();
}
}
//movedown
public void moveDown(boolean flag) {
clearList(list);
for (int j = 0; j < 4; j++) {
int k = 3;
for (int i = 3; i > -1; i--) {
if (rset[i][j] != null) {
list[k--][j] = new RectObject(rset[i][j]);
}
}
}
for (int j = 0; j < 4 && flag; j++) {
for (int i = 3; i > 0; i--) {
if (list[i][j] != null && list[i - 1][j] != null && list[i][j].value == list[i - 1][j].value) {
list[i][j].value *= 2;
if (CheckMode == false) {
int sum = Integer.parseInt(scoreLabel.getText());
sum += list[i][j].value;
scoreLabel.setText("" + sum);
}
list[i - 1][j] = null;
i--;
}
}
}
if (isChange()) {
if (CheckMode == false) {
copySet(rset, list);
repaint();
moveDown(false);
}
change = true;
} else {
repaint();
}
}
//other functions
private void copySet(RectObject[][] dst, RectObject[][] src) {
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
dst[i][j] = src[i][j];
}
}
}
//detect whether rset is different from list or not
private boolean isChange() {
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (rset[i][j] != null && list[i][j] != null && !rset[i][j].equals(list[i][j])) {
return true;
}
if (rset[i][j] != null && list[i][j] == null) {
return true;
}
if (rset[i][j] == null && list[i][j] != null) {
return true;
}
}
}
return false;
}
private void clearList(RectObject[][] s) {
for (int i = 0; i < s.length; i++) {
for (int j = 0; j < s[i].length; j++) {
s[i][j] = null;
}
}
}
//get a random rectangle
@SuppressWarnings({"unchecked", "rawtypes"})
public void getARandomRect() {
ArrayList list = new ArrayList();
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (rset[i][j] == null) {
list.add(new Point(i, j));
}
}
}
if (list.size() == 0 && !aDirAble()) {
gameOver();
return;
}
Random rand = new Random();
int index = rand.nextInt(list.size());
Point loc = (Point) list.get(index);
index = rand.nextInt(2);
rset[loc.x][loc.y] = new RectObject();
if (index == 1) {
rset[loc.x][loc.y].value = 4;
} else {
rset[loc.x][loc.y].value = 2;
}
}
//detect whether there are other steps or not
public boolean aDirAble() {
CheckMode = true;
change = false;
moveLeft(true);
moveRight(true);
moveDown(true);
moveUp(true);
CheckMode = false;
if (change == true) {
return true;
} else {
return false;
}
}
public void gameOver() {
gameOverFlag = true;
JPanel jl = new GameOverPane(myp.getWidth(), myp.getHeight());
jl.setBounds(0, 0, 700, 700);
JButton jb1 = new JButton("Again");
Font font = new Font("TimesRoman", Font.BOLD, 30);
jb1.setOpaque(false);
jb1.setFont(font);
JButton jb2 = new JButton("Close");
jb2.setSize(jb1.getSize());
jb2.setOpaque(false);
jb2.setFont(font);
jb1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
scoreLabel.setText("0");
myp.remove(jl);
clearList(rset);
myp.validate();
getARandomRect();
getARandomRect();
repaint();
gameOverFlag = false;
refreshBest();
}
});
jb2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
refreshBest();
File f = new File("LASTRECORD");
if (f.exists()) {
f.delete();
}
System.exit(0);
}
});
jl.add(jb1);
jl.add(jb2);
myp.add(jl);
jl.validate();
}
public void gameSuccess() {
JPanel jl = new SuccessPane(myp.getWidth(), myp.getHeight());
jl.setOpaque(false);
jl.setBounds(0, 0, 700, 700);
JButton jb1 = new JButton("Continue");
Font font = new Font("TimesRoman", Font.BOLD, 30);
jb1.setOpaque(false);
jb1.setFont(font);
JButton jb2 = new JButton("Close");
jb2.setSize(jb1.getSize());
jb2.setOpaque(false);
jb2.setFont(font);
jb1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
myp.remove(jl);
myp.validate();
repaint();
}
});
jb2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
refreshBest();
System.exit(0);
}
});
jl.add(jb1);
jl.add(jb2);
myp.add(jl);
jl.validate();
}
@SuppressWarnings("unchecked")
public void saveTheStep() {
if (saveList.size() < 20) {
@SuppressWarnings("rawtypes")
ArrayList arr = new ArrayList();
int score = Integer.parseInt(scoreLabel.getText());
arr.add(score);
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (rset[i][j] != null) {
arr.add(rset[i][j].value);
} else {
arr.add(0);
}
}
}
saveList.addLast(arr);
} else {
saveList.removeFirst();
saveTheStep();
}
}
public static String title(Object o) {
String t = o.getClass().toString();
if (t.indexOf("class") != -1) {
t = t.substring(6);
}
return t;
}
public static void refreshBest() {
try {
int best = 0;
File f = new File("BestRecord");
RandomAccessFile file;
if (f.exists()) {
file = new RandomAccessFile(f, "rw");
best = file.readInt();
file.seek(0);
} else {
file = new RandomAccessFile(f, "rw");
}
//System.out.println("The Best score is "+best);
int cur = Integer.parseInt(scoreLabel.getText());
if (cur > best) {
file.writeInt(cur);
}
file.close();
} catch (FileNotFoundException e1) {
e1.printStackTrace();
} catch (IOException e2) {
e2.printStackTrace();
}
}
@SuppressWarnings("resource")
public static void saveRecord() {
try {
RandomAccessFile file = new RandomAccessFile(new File("LASTRECORD"), "rw");
int score = Integer.parseInt(scoreLabel.getText());
file.writeInt(score);
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (rset[i][j] != null) {
file.writeInt(rset[i][j].value);
} else {
file.writeInt(0);
}
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void run(JApplet applet, int width, int height) {
JFrame frame = new JFrame(title(applet));
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
refreshBest();
saveRecord();
//System.out.println("The score is "+scoreLabel.getText());
}
});
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(applet);
frame.setSize(width, height);
applet.init();
applet.start();
frame.setVisible(true);
}
public static void main(String[] args) {
run(new AWTGame2048(), 900, 800);
}
}
最近下载更多
微信网友_6793785677565952 LV1
2023年12月25日
jkjfdgbkl LV2
2023年11月1日
去死吧aaa LV1
2023年6月20日
wxqxhm LV1
2022年12月21日
总有人间一两风 LV8
2022年12月12日
xixiwoaini LV3
2022年11月30日
微信网友_6004879537377280 LV3
2022年9月13日
cheng1127 LV1
2022年7月31日
1937291320 LV1
2022年3月5日
522484651 LV1
2021年11月16日

最近浏览
