Java 2048 小游戏 源码



import java.awt.Color;
import java.awt.EventQueue;
//import java.awt.BorderLayout;
//import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.*;
import java.util.Random;
import javax.swing.BorderFactory;
import javax.swing.Icon;
//import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
//import javax.swing.border.*;
  1. import javax.swing.JTextField;
public class Copy2048 extends JFrame{ private JPanel scoresPane; //分数面板 private JPanel mainPane; //主面板 private JLabel labelMaxScores ; //最高分 private JLabel labelScores; //分数 private JLabel tips;         //提示操做标签 private JTextField textMaxScores; //最高分文本框 private JLabel textScores; //分数文本框 private JLabel[][] texts; //方块标签二维数组 private Icon icon2; private int times = 16; //记录剩余空方块数目 private int scores = 0;     //记录分数 private int l1,l2,l3,l4;   //用于判断游戏是否失败 Font font = new Font("", Font.BOLD,14); //设置分数面板字体类型和大小 Font font2 = new Font("", Font.BOLD,30); //设置主面板字体类型和大小 Random random = new Random();                   //获取随机数 public static void main(String[] args){ EventQueue.invokeLater(new Runnable(){ public void run(){ try{ Copy2048 frame = new Copy2048(); frame.setVisible(true); // Thread thread = new Thread(frame); // thread.start(); } catch(Exception e1){ e1.printStackTrace(); } } }); } /** * 构造方法 */ public Copy2048(){ super(); setResizable(false);                 //禁止调整窗体大小 getContentPane().setLayout(null); //设置空布局 setBounds(500, 50, 500, 615); //设置界面位置和大小 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //设置关闭 setTitle("2048PC版");                   //设置窗体标题 scoresPane = new JPanel(); //建立分数显示面板 scoresPane.setBackground(Color.green); //设置分数显示面板的背景色 scoresPane.setBounds(20, 20, 460, 40); //设置分数面板位置和大小 scoresPane.setBorder(BorderFactory.createMatteBorder(2, 2, 2, 2, Color.YELLOW));//设置得分面板的边框粗细和颜色 getContentPane().add(scoresPane); //将得分面板添加到窗体 scoresPane.setLayout(null);     //设置面板空布局 labelMaxScores = new JLabel("最高分:"); //最高分标签 labelMaxScores.setFont(font);     //设置字体类型和大小 labelMaxScores.setBounds(10, 5, 50, 30); //设置最高分标签的位置和尺寸 scoresPane.add(labelMaxScores);         //将最高分标签添加到得分容器中 textMaxScores = new JTextField("暂不可用"); //最高得分标签 textMaxScores.setBounds(60, 5, 150, 30); //设置最高分文本框的位置和尺寸 textMaxScores.setFont(font); //设置最高分字体 textMaxScores.setEditable(false);     //设置为不可编辑 scoresPane.add(textMaxScores); //将最高分标签添加到分数面板中 labelScores = new JLabel("得    分:"); labelScores.setFont(font); //设置分数标签字体类型和大小 labelScores.setBounds(240, 5, 50, 30); //设置分数标签位置和大小 scoresPane.add(labelScores); //将得分标签添加到分数面板中 textScores = new JLabel(String.valueOf(scores)); //将计算所得分数放到分数文本框 textScores.setFont(font); //设置分数字体 textScores.setBounds(290, 5, 150, 30); //设置分数位置和大小 scoresPane.add(textScores); //将得分文本框添加到分数面板中 mainPane = new JPanel();     //建立游戏主面板 mainPane.setBounds(20, 70, 460, 500); //设置主面板位置和尺寸 this.getContentPane().add(mainPane); //添加游戏主面板到容器中 mainPane.setLayout(null); //设置空布局 texts = new  JLabel[4][4]; //建立方块标签二维数组 for(int i = 0; i < 4; i++){ //遍历数组 for(int j = 0; j < 4; j++){ texts[i][j] = new JLabel();     //建立标签 texts[i][j].setFont(font2); //设置方块字体 texts[i][j].setHorizontalAlignment(SwingConstants.CENTER); //设置方块内容居中对齐 texts[i][j].setText(""); //设置方块内容为空 texts[i][j].setBounds(120 * j, 120 * i, 100, 100); //设置方块的大小位置 setColor(i, j, ""); //设置颜色为空 texts[i][j].setOpaque(true);                                   //设置控件不透明 texts[i][j].setBorder(BorderFactory.createMatteBorder(2, 2, 2, 2, Color.green));//设置方块边框颜色 mainPane.add(texts[i][j]);   //将建立的方块标签放在游戏主面板 } } tips = new JLabel("Tips:使用上、下、左、右键或者W、S、A、D键控制");//建立提示标签 tips.setFont(font); //设置提示标签字体 tips.setBounds(60,480,400,20); //设置提示标签位置和大小 mainPane.add(tips); //将提示标签放到主面板 textMaxScores.addKeyListener(new KeyAdapter(){ //为最高分标签添加按键监听器 public void keyPressed(  KeyEvent e){ do_label_keyPressed(e); //调用时间处理方法 } }); Create2(); //最开始打开游戏随机出现的两个2 Create2(); //最开始打开游戏随机出现的两个2 } /** * 按键输入事件的处理方法 * @param e */ protected  void do_label_keyPressed(final KeyEvent e){              int code = e.getKeyCode(); //获取按键代码 int a ;         //a 的引入是为了防止连加的状况出现 String str ; String str1; int num; switch(code){ //按键的四种状况 case KeyEvent.VK_LEFT: case KeyEvent.VK_A:   //若是按键代码是左方向键或者A键 for(int i = 0; i < 4; i++){ a = 5; for(int k = 0; k < 3; k++){ for(int j = 1; j < 4; j++){       //遍历16个方块 str = texts[i][j].getText();       //获取当前方块标签文本字符 str1 = texts[i][j-1].getText();       //获取当前方块左边的一个标签文本字符 if(str1.compareTo("") == 0){ //若是左边方块文本为空字符 texts[i][j-1].setText(str); //方块左移 setColor(i, j-1,str); //设置颜色 texts[i][j].setText(""); //当前方块字符置空 setColor(i, j, ""); //设置当前方块颜色 } else if((str.compareTo(str1) == 0) && (j !=a) && (j != a-1)){//避免连加 num  = Integer.parseInt(str); //获取字符串转化为整型 scores += num; //加分 times ++; //空块加一 str = String.valueOf(2 * num); //计算左边方块最终结果 texts[i][j-1].setText(str); //左边方块文本字符变为两方块之和 setColor(i, j-1, str); //设置颜色 texts[i][j].setText(""); //当前方块字符置空 setColor(i, j, ""); //设置当前方块颜色 a = j; } } } } l1 = 1; //用于判断游戏是否失败 Create2(); break; case KeyEvent.VK_RIGHT: case KeyEvent.VK_D: for(int i = 0; i < 4; i ++){ a = 5; for(int k = 0; k < 3; k++){ for(int j = 2; j >= 0; j--){ str = texts[i][j].getText(); str1 = texts[i][j + 1].getText(); if(str1.compareTo("") == 0){ texts[i][j + 1].setText(str); setColor(i, j+1, str); texts[i][j].setText(""); setColor(i, j, ""); } else if(str.compareTo(str1) == 0 && j !=a && j != a+ 1){ num  = Integer.parseInt(str); scores += num ; times ++; str = String.valueOf(2 * num); texts[i][j + 1].setText(str); setColor(i, j+1, str); texts[i][j].setText(""); setColor(i, j, ""); a = j; } } } } l2 = 1; Create2(); break; case KeyEvent.VK_UP: case KeyEvent.VK_W: for(int j = 0; j < 4; j++){ a = 5; for(int k = 0; k < 3; k++){ for(int i = 1; i < 4; i++){ str = texts[i][j].getText(); str1 = texts[i - 1][j].getText(); if(str1.compareTo("") == 0){ texts[i - 1][j].setText(str); setColor(i-1, j, str); texts[i][j].setText(""); setColor(i, j, ""); } else if(str.compareTo(str1) == 0 && i != a && i != a -1){ num  = Integer.parseInt(str); scores += num ; times ++; str = String.valueOf(2 * num); texts[i - 1][j].setText(str); setColor(i-1, j, str); texts[i][j].setText(""); setColor(i, j, ""); a = i; } } } } l3 =1; Create2(); break; case KeyEvent.VK_DOWN: case KeyEvent.VK_S: for(int j = 0; j < 4; j ++){ a = 5; for(int k = 0; k < 5; k++){ for(int i = 2; i >= 0; i--){ str = texts[i][j].getText(); str1 = texts[i + 1][j].getText(); if(str1.compareTo("") == 0){ texts[i + 1][j].setText(str); setColor(i+1, j, str); texts[i][j].setText(""); setColor(i, j, ""); } else if(str.compareTo(str1) == 0 && i != a && i != a + 1){ num  = Integer.parseInt(str); scores += num ; times ++; str = String.valueOf(2 * num); texts[i + 1][j].setText(str ); setColor(i+1, j, str); texts[i][j].setText(""); setColor(i, j, ""); a = i; } } } } l4 = 1; Create2(); break; default: break; } textScores.setText(String.valueOf(scores)); } /** * 在随机位置产生一个2号方块的方法 * @param i,j */ public void Create2(){ int i ,j; boolean r = true; String str; if(times > 0){ while(r){ i = random.nextInt(4); //随机获取整型0-4(列数) j = random.nextInt(4); //随机获取整型0-4(行数) str = texts[i][j].getText(); //获取该随机标签文本 if((str.compareTo("") == 0)){ //若是文本为空 texts[i][j].setIcon(icon2); texts[i][j].setText("2"); //将其文本内容设为2 setColor(i, j, "2"); //设置颜色 times --; //空块数目减小 r = false; l1 = l2 = l3 = l4 = 0; //重置 } } } //l1到l4同时被键盘赋值为1说明任何方向键都不能产生新的数字2,说明游戏失败 else if(l1 >0 && l2 >0 && l3 > 0 && l4 > 0){ tips.setText("                            GAME OVER !"); } } /** * 设置标签颜色 * @param i , j ,str */ public void setColor(int i, int j, String str){ switch(str){ case "2": texts[i][j].setBackground(Color.yellow); break; case "4": texts[i][j].setBackground(Color.red); break; case "8": texts[i][j].setBackground(Color.pink); break; case "16": texts[i][j].setBackground(Color.orange); break; case "32": texts[i][j].setBackground(Color.magenta); break; case "64": texts[i][j].setBackground(Color.LIGHT_GRAY); break; case "128": texts[i][j].setBackground(Color.green); break; case "256": texts[i][j].setBackground(Color.gray); break; case "512": texts[i][j].setBackground(Color.DARK_GRAY); break; case "1024": texts[i][j].setBackground(Color.cyan); break; case "2048": texts[i][j].setBackground(Color.blue); break; //case "": //case "4096": //texts[i][j].setBackground(Color.white); //break; default: texts[i][j].setBackground(Color.white); break; } } } import java.awt.Color; import java.awt.EventQueue; //import java.awt.BorderLayout; //import java.awt.FlowLayout; import java.awt.Font; import java.awt.event.*; import java.util.Random; import javax.swing.BorderFactory; import javax.swing.Icon; //import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.SwingConstants; //import javax.swing.border.*; import javax.swing.JTextField; public class Copy2048 extends JFrame{ private JPanel scoresPane; //分数面板 private JPanel mainPane; //主面板 private JLabel labelMaxScores ; //最高分 private JLabel labelScores; //分数 private JLabel tips;         //提示操做标签 private JTextField textMaxScores; //最高分文本框 private JLabel textScores; //分数文本框 private JLabel[][] texts; //方块标签二维数组 private Icon icon2; private int times = 16; //记录剩余空方块数目 private int scores = 0;     //记录分数 private int l1,l2,l3,l4;   //用于判断游戏是否失败 Font font = new Font("", Font.BOLD,14); //设置分数面板字体类型和大小 Font font2 = new Font("", Font.BOLD,30); //设置主面板字体类型和大小 Random random = new Random();                   //获取随机数 public static void main(String[] args){ EventQueue.invokeLater(new Runnable(){ public void run(){ try{ Copy2048 frame = new Copy2048(); frame.setVisible(true); // Thread thread = new Thread(frame); // thread.start(); } catch(Exception e1){ e1.printStackTrace(); } } }); } /** * 构造方法 */ public Copy2048(){ super(); setResizable(false);                 //禁止调整窗体大小 getContentPane().setLayout(null); //设置空布局 setBounds(500, 50, 500, 615); //设置界面位置和大小 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //设置关闭 setTitle("2048PC版");                   //设置窗体标题 scoresPane = new JPanel(); //建立分数显示面板 scoresPane.setBackground(Color.green); //设置分数显示面板的背景色 scoresPane.setBounds(20, 20, 460, 40); //设置分数面板位置和大小 scoresPane.setBorder(BorderFactory.createMatteBorder(2, 2, 2, 2, Color.YELLOW));//设置得分面板的边框粗细和颜色 getContentPane().add(scoresPane); //将得分面板添加到窗体 scoresPane.setLayout(null);     //设置面板空布局 labelMaxScores = new JLabel("最高分:"); //最高分标签 labelMaxScores.setFont(font);     //设置字体类型和大小 labelMaxScores.setBounds(10, 5, 50, 30); //设置最高分标签的位置和尺寸 scoresPane.add(labelMaxScores);         //将最高分标签添加到得分容器中 textMaxScores = new JTextField("暂不可用"); //最高得分标签 textMaxScores.setBounds(60, 5, 150, 30); //设置最高分文本框的位置和尺寸 textMaxScores.setFont(font); //设置最高分字体 textMaxScores.setEditable(false);     //设置为不可编辑 scoresPane.add(textMaxScores); //将最高分标签添加到分数面板中 labelScores = new JLabel("得    分:"); labelScores.setFont(font); //设置分数标签字体类型和大小 labelScores.setBounds(240, 5, 50, 30); //设置分数标签位置和大小 scoresPane.add(labelScores); //将得分标签添加到分数面板中 textScores = new JLabel(String.valueOf(scores)); //将计算所得分数放到分数文本框 textScores.setFont(font); //设置分数字体 textScores.setBounds(290, 5, 150, 30); //设置分数位置和大小 scoresPane.add(textScores); //将得分文本框添加到分数面板中 mainPane = new JPanel();     //建立游戏主面板 mainPane.setBounds(20, 70, 460, 500); //设置主面板位置和尺寸 this.getContentPane().add(mainPane); //添加游戏主面板到容器中 mainPane.setLayout(null); //设置空布局 texts = new  JLabel[4][4]; //建立方块标签二维数组 for(int i = 0; i < 4; i++){ //遍历数组 for(int j = 0; j < 4; j++){ texts[i][j] = new JLabel();     //建立标签 texts[i][j].setFont(font2); //设置方块字体 texts[i][j].setHorizontalAlignment(SwingConstants.CENTER); //设置方块内容居中对齐 texts[i][j].setText(""); //设置方块内容为空 texts[i][j].setBounds(120 * j, 120 * i, 100, 100); //设置方块的大小位置 setColor(i, j, ""); //设置颜色为空 texts[i][j].setOpaque(true);                                   //设置控件不透明 texts[i][j].setBorder(BorderFactory.createMatteBorder(2, 2, 2, 2, Color.green));//设置方块边框颜色 mainPane.add(texts[i][j]);   //将建立的方块标签放在游戏主面板 } } tips = new JLabel("Tips:使用上、下、左、右键或者W、S、A、D键控制");//建立提示标签 tips.setFont(font); //设置提示标签字体 tips.setBounds(60,480,400,20); //设置提示标签位置和大小 mainPane.add(tips); //将提示标签放到主面板 textMaxScores.addKeyListener(new KeyAdapter(){ //为最高分标签添加按键监听器 public void keyPressed(  KeyEvent e){ do_label_keyPressed(e); //调用时间处理方法 } }); Create2(); //最开始打开游戏随机出现的两个2 Create2(); //最开始打开游戏随机出现的两个2 } /** * 按键输入事件的处理方法 * @param e */ protected  void do_label_keyPressed(final KeyEvent e){              int code = e.getKeyCode(); //获取按键代码 int a ;         //a 的引入是为了防止连加的状况出现 String str ; String str1; int num; switch(code){ //按键的四种状况 case KeyEvent.VK_LEFT: case KeyEvent.VK_A:   //若是按键代码是左方向键或者A键 for(int i = 0; i < 4; i++){ a = 5; for(int k = 0; k < 3; k++){ for(int j = 1; j < 4; j++){       //遍历16个方块 str = texts[i][j].getText();       //获取当前方块标签文本字符 str1 = texts[i][j-1].getText();       //获取当前方块左边的一个标签文本字符 if(str1.compareTo("") == 0){ //若是左边方块文本为空字符 texts[i][j-1].setText(str); //方块左移 setColor(i, j-1,str); //设置颜色 texts[i][j].setText(""); //当前方块字符置空 setColor(i, j, ""); //设置当前方块颜色 } else if((str.compareTo(str1) == 0) && (j !=a) && (j != a-1)){//避免连加 num  = Integer.parseInt(str); //获取字符串转化为整型 scores += num; //加分 times ++; //空块加一 str = String.valueOf(2 * num); //计算左边方块最终结果 texts[i][j-1].setText(str); //左边方块文本字符变为两方块之和 setColor(i, j-1, str); //设置颜色 texts[i][j].setText(""); //当前方块字符置空 setColor(i, j, ""); //设置当前方块颜色 a = j; } } } } l1 = 1; //用于判断游戏是否失败 Create2(); break; case KeyEvent.VK_RIGHT: case KeyEvent.VK_D: for(int i = 0; i < 4; i ++){ a = 5; for(int k = 0; k < 3; k++){ for(int j = 2; j >= 0; j--){ str = texts[i][j].getText(); str1 = texts[i][j + 1].getText(); if(str1.compareTo("") == 0){ texts[i][j + 1].setText(str); setColor(i, j+1, str); texts[i][j].setText(""); setColor(i, j, ""); } else if(str.compareTo(str1) == 0 && j !=a && j != a+ 1){ num  = Integer.parseInt(str); scores += num ; times ++; str = String.valueOf(2 * num); texts[i][j + 1].setText(str); setColor(i, j+1, str); texts[i][j].setText(""); setColor(i, j, ""); a = j; } } } } l2 = 1; Create2(); break; case KeyEvent.VK_UP: case KeyEvent.VK_W: for(int j = 0; j < 4; j++){ a = 5; for(int k = 0; k < 3; k++){ for(int i = 1; i < 4; i++){ str = texts[i][j].getText(); str1 = texts[i - 1][j].getText(); if(str1.compareTo("") == 0){ texts[i - 1][j].setText(str); setColor(i-1, j, str); texts[i][j].setText(""); setColor(i, j, ""); } else if(str.compareTo(str1) == 0 && i != a && i != a -1){ num  = Integer.parseInt(str); scores += num ; times ++; str = String.valueOf(2 * num); texts[i - 1][j].setText(str); setColor(i-1, j, str); texts[i][j].setText(""); setColor(i, j, ""); a = i; } } } } l3 =1; Create2(); break; case KeyEvent.VK_DOWN: case KeyEvent.VK_S: for(int j = 0; j < 4; j ++){ a = 5; for(int k = 0; k < 5; k++){ for(int i = 2; i >= 0; i--){ str = texts[i][j].getText(); str1 = texts[i + 1][j].getText(); if(str1.compareTo("") == 0){ texts[i + 1][j].setText(str); setColor(i+1, j, str); texts[i][j].setText(""); setColor(i, j, ""); } else if(str.compareTo(str1) == 0 && i != a && i != a + 1){ num  = Integer.parseInt(str); scores += num ; times ++; str = String.valueOf(2 * num); texts[i + 1][j].setText(str ); setColor(i+1, j, str); texts[i][j].setText(""); setColor(i, j, ""); a = i; } } } } l4 = 1; Create2(); break; default: break; } textScores.setText(String.valueOf(scores)); } /** * 在随机位置产生一个2号方块的方法 * @param i,j */ public void Create2(){ int i ,j; boolean r = true; String str; if(times > 0){ while(r){ i = random.nextInt(4); //随机获取整型0-4(列数) j = random.nextInt(4); //随机获取整型0-4(行数) str = texts[i][j].getText(); //获取该随机标签文本 if((str.compareTo("") == 0)){ //若是文本为空 texts[i][j].setIcon(icon2); texts[i][j].setText("2"); //将其文本内容设为2 setColor(i, j, "2"); //设置颜色 times --; //空块数目减小 r = false; l1 = l2 = l3 = l4 = 0; //重置 } } } //l1到l4同时被键盘赋值为1说明任何方向键都不能产生新的数字2,说明游戏失败 else if(l1 >0 && l2 >0 && l3 > 0 && l4 > 0){ tips.setText("                            GAME OVER !"); } } /** * 设置标签颜色 * @param i , j ,str */ public void setColor(int i, int j, String str){ switch(str){ case "2": texts[i][j].setBackground(Color.yellow); break; case "4": texts[i][j].setBackground(Color.red); break; case "8": texts[i][j].setBackground(Color.pink); break; case "16": texts[i][j].setBackground(Color.orange); break; case "32": texts[i][j].setBackground(Color.magenta); break; case "64": texts[i][j].setBackground(Color.LIGHT_GRAY); break; case "128": texts[i][j].setBackground(Color.green); break; case "256": texts[i][j].setBackground(Color.gray); break; case "512": texts[i][j].setBackground(Color.DARK_GRAY); break; case "1024": texts[i][j].setBackground(Color.cyan); break; case "2048": texts[i][j].setBackground(Color.blue); break; //case "": //case "4096": //texts[i][j].setBackground(Color.white); //break; default: texts[i][j].setBackground(Color.white); break; } } }