2048小游戏

xiaoxiao2021-02-27  517

代码:

import java.awt.Color; import java.awt.EventQueue; import java.awt.Font; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.util.Random; import javax.swing.BorderFactory; import javax.swing.Icon; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.SwingConstants; public class Copy2048 extends JFrame { private static final long serialVersionUID = -1019108309790740156L; 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, 16);// 设置字体类型和大小 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(700, 220, 500, 600); // 设置在桌面上的位置和大小 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, 70, 30);// 设置最高分标签的位置尺寸 scoresPane.add(labelMaxScores); // 将最高分标签添加到得分容器中 textMaxScores = new JTextField(" 暂不可用");// 得分标签 textMaxScores.setBounds(80, 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(28, 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(110 * j, 110 * i, 109, 109);// 设置方块的大小位置 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(10, 450, 430, 20); mainPane.add(tips); /* * 为最高分标签添加按键监听器 */ textMaxScores.addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent e) { do_label_keyPressed(e);// 调用时间处理方法 } }); Create2(); Create2(); } /** * 按键输入事件的处理方法 * * @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(); // 获取当前左1方块标签文本字符 if (str1.compareTo("") == 0) { // 如果左1方块文本为空字符 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)) {// 如果当前方块和左1方块文本字符相等 num = Integer.parseInt(str); scores += num; times++; str = String.valueOf(2 * num); texts[i][j - 1].setText(str); // 左1方块文本字符变为两方块之和 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: // 如果按键代码是右方向键或者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: // 如果按键代码是上方向键或者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: // 如果按键代码是下方向键或者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 = false; String str; if (times > 0) { while (!r) { i = random.nextInt(4); j = random.nextInt(4); str = texts[i][j].getText(); if ((str.compareTo("") == 0)) { texts[i][j].setIcon(icon2); texts[i][j].setText("2"); setColor(i, j, "2"); times--; r = true; l1 = l2 = l3 = l4 = 0; } } } else if (l1 > 0 && l2 > 0 && l3 > 0 && l4 > 0) {// l1到l4同时被键盘赋值为1说明任何方向键都不能产生新的数字2,说明游戏失败 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: break; } } }

结果示意图:

转载请注明原文地址: https://www.6miu.com/read-2117.html

最新回复(0)