package _2048; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.net.URL; import javax.swing.ImageIcon; import javax.swing.JPanel; /** * 自定义面板类 * * @author zzc * */ public class MyPanel extends JPanel implements ActionListener { // 格子起始位置 每个格子的大小 int size = 100; int X0 = 20, Y0 = 30; // 每个格子对应的数字 int arr[][] = new int[4][4]; //总分数 int score=0; // 随机数字类 Randompic random = new Randompic(); // 判断游戏是否结束 boolean isover = false; //音效类 Music mu; URL url1 = MyPanel.class.getResource("1图标.png"); URL url2 = MyPanel.class.getResource("2图标.png"); URL url4 = MyPanel.class.getResource("4图标.png"); URL url8 = MyPanel.class.getResource("8图标.png"); URL url16 = MyPanel.class.getResource("16图标.png"); URL url32 = MyPanel.class.getResource("32图标.png"); URL url64 = MyPanel.class.getResource("64图标.png"); URL url128 = MyPanel.class.getResource("128图标.png"); URL url256 = MyPanel.class.getResource("256图标.png"); URL url512 = MyPanel.class.getResource("512图标.png"); URL url1024 = MyPanel.class.getResource("1024图标.png"); URL url2048 = MyPanel.class.getResource("2048图标.png"); URL urlscore = MyPanel.class.getResource("分数图标.png"); Image image1; Image image2; Image image4; Image image8; Image image16; Image image32; Image image64; Image image128; Image imagescore; Image image256; Image image512; Image image1024; Image image2048; public MyPanel() { // 初始化数组 for (int i = 0; i < arr.length; i++) for (int j = 0; j < arr[i].length; j++) arr[i][j] = -1; /* * arr[2][2] = 2; arr[2][1] = 4; arr[1][3] = 8; arr[0][2] = 16; */ // 初始化图片 image1 = new ImageIcon(url1).getImage(); image2 = new ImageIcon(url2).getImage(); image4 = new ImageIcon(url4).getImage(); image8 = new ImageIcon(url8).getImage(); image16 = new ImageIcon(url16).getImage(); image32 = new ImageIcon(url32).getImage(); image64 = new ImageIcon(url64).getImage(); image128 = new ImageIcon(url128).getImage(); image256 = new ImageIcon(url256).getImage(); image512 = new ImageIcon(url512).getImage(); image1024 = new ImageIcon(url1024).getImage(); image2048 = new ImageIcon(url2048).getImage(); imagescore=new ImageIcon(urlscore).getImage(); random.Found(arr); Point p = random.random(); arr[p.x][p.y] = 2; //初始化音效类 mu=new Music("音效.mp3"); } @Override public void paint(Graphics g) { super.paint(g); //打印数字 Print(g); //显示分数 Fontscore(g); if (isover) { Font font = new Font("华文行楷 ", Font.BOLD, 38); g.setColor(Color.ORANGE); g.setFont(font); g.drawString("游戏结束", 170, 250); } } //动作监听器 @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub String command = e.getActionCommand(); // 用于判断是否移动 合并 boolean b1 = true; boolean b2 = true; if ("up".equals(command)) { b1 = check1(0); b2 = HeBing(0); } else if ("down".equals(command)) { b1 = check1(1); b2 = HeBing(1); } else if ("left".equals(command)) { b1 = check1(2); b2 = HeBing(2); } else if ("right".equals(command)) { // 先全部向右移 返回的是 是否移动 b1 = check1(3); // 然后再合并 返回的是是否合并 b2 = HeBing(3); } // 只要移动或合并 就要随机在-1的位置出现数字 if (b1 || b2){ //播放音效 mu.start(); // 随机数字 randompic(); } // 重绘 repaint(); } // 随机数字 public void randompic() { random.Found(arr); // 得到要随机数字的位置 Point p = random.random(); if (p.x != -1) { arr[p.x][p.y] = random.randomInt(); } else isover = true; } // 遍历数组(移动时) 若都不移动 则返回false // 上 0 下 1 左 2 右3 public boolean check1(int direct) { boolean b = false; if (direct == 0 || direct == 2) { // 向上移动或向左 从下到上 从右到左 遍历 for (int i = arr.length - 1; i >= 0; i--) for (int j = arr[i].length - 1; j >= 0; j--) { if (arr[i][j] == -1) { // 当位置为空时 移动 boolean b1 = remove(i, j, direct); // 只要有一个位置移动了 就改变b的值 if (b1) b = b1; } } } else if (direct == 1 || direct == 3) { // 向下移动或向右移动 从上到下 从左到右遍历 for (int i = 0; i < arr.length; i++) { for (int j = 0; j < arr[i].length; j++) { if (arr[i][j] == -1) { boolean b1 = remove(i, j, direct); // 只要有一个位置移动了 就改变b的值 if (b1) b = b1; } } } } return b; } // 向指定方向移动 若不移动则返回false public boolean remove(int a, int b, int direct) { int count = 0; if (direct == 0) { // ***********************向上移动************************* // 先检测当前位置下边是否全为空 for (int i = a; i < arr.length - 1; i++) { if (arr[i + 1][b] == -1) // 为空时count+1 count++; } // 全为-1的话 就不需要移动 返回false if (count == 3 - a) return false; else { // 向上移动 for (int i = a; i < arr.length - 1; i++) { arr[i][b] = arr[i + 1][b]; } arr[3][b] = -1; return true; } } else if (direct == 1) { // ******************************向下移动********************** // 先检测当前位置上边是否全为空 for (int i = a; i > 0; i--) { if (arr[i - 1][b] == -1) // 为空时count+1 count++; } // 全为-1的话 就不需要移动 返回false if (count == a) return false; else { for (int i = a; i > 0; i--) { arr[i][b] = arr[i - 1][b]; } arr[0][b] = -1; return true; } } else if (direct == 2) { // ******************************向左移动*************************** // 先检测当前位置右边是否全为空 for (int i = b; i < arr.length - 1; i++) { if (arr[a][i + 1] == -1) // 为空时count+1 count++; } // 全为-1的话 就不需要移动 返回false if (count == 3 - b) return false; else { for (int i = b; i < arr.length - 1; i++) { arr[a][i] = arr[a][i + 1]; } arr[a][3] = -1; return true; } } else { // *****************************向右移动******************************** // 先检测当前位置左边是否全为空 for (int i = b; i > 0; i--) { if (arr[a][i - 1] == -1) // 为空时count+1 count++; } // 全为-1的话 就不需要移动 返回false if (count == b) return false; else { // 向右移动一格 for (int i = b; i > 0; i--) { arr[a][i] = arr[a][i - 1]; } arr[a][0] = -1; return true; } } } // 遍历数组 (合并时) 按规律合并相同的数字 如果合并了 则返回true 否则 返回false public boolean HeBing(int direct) { boolean b = false; if (direct == 0) { // 向上合并 for (int i = 0; i < arr.length - 1; i++) { for (int j = 0; j < arr.length; j++) { if (arr[i][j] != -1) { // 当前位置数字和下边的相同时 if (arr[i][j] == arr[i + 1][j]) { //分数增加 score+=(arr[i][j]*2); // 当前位置数字翻倍 arr[i][j] *= 2; // 下边的数字置空 arr[i + 1][j] = -1; // 如果下边的位置不是最后一个的话 就右移 if (i + 1 != 3) remove(i + 1, j, 0); b = true; } } } } } else if (direct == 1) { // 向下合并 for (int i = arr.length - 1; i > 0; i--) { for (int j = 0; j < arr[i].length; j++) { if (arr[i][j] != -1) { // 当前位置数字和上边的相同时 if (arr[i][j] == arr[i - 1][j]) { //分数增加 score+=(arr[i][j]*2); // 当前位置数字翻倍 arr[i][j] *= 2; // 上边的数字置空 arr[i - 1][j] = -1; // 如果下边的位置不是最后一个的话 就右移 if (i - 1 != 0) remove(i - 1, j, 1); b = true; } } } } } else if (direct == 2) { // 向左合并 for (int i = 0; i < arr.length; i++) { for (int j = 0; j < arr[i].length - 1; j++) { if (arr[i][j] != -1) { // 当前位置数字和右边的相同时 if (arr[i][j] == arr[i][j + 1]) { //分数增加 score+=(arr[i][j]*2); // 当前位置数字翻倍 arr[i][j] *= 2; // 右边的数字置空 arr[i][j + 1] = -1; // 如果左边的位置不是最后一个的话 就右移 if (j + 1 != 3) remove(i, j + 1, 2); b = true; } } } } } else if (direct == 3) { // 向右合并 for (int i = 0; i < arr.length; i++) { for (int j = arr[i].length - 1; j > 0; j--) { // 当前位置不为空时 if (arr[i][j] != -1) { // 当前位置数字和左边的相同时 if (arr[i][j] == arr[i][j - 1]) { //分数增加 score+=(arr[i][j]*2); // 当前位置数字翻倍 arr[i][j] *= 2; // 左边的数字置空 arr[i][j - 1] = -1; // 如果左边的位置不是最后一个的话 就右移 if (j - 1 != 0) remove(i, j - 1, 3); b = true; } } } } } return b; } //打印数组数字 public void Print(Graphics g){ // 打印数字 for (int i = 0; i < arr.length; i++) for (int j = 0; j < arr[i].length; j++) { if (arr[i][j] != -1) { if (arr[i][j] == 2) g.drawImage(image2, X0 + j * size, Y0 + i * size, size, size, null); else if (arr[i][j] == 4) g.drawImage(image4, X0 + j * size, Y0 + i * size, size, size, null); else if (arr[i][j] == 8) g.drawImage(image8, X0 + j * size, Y0 + i * size, size, size, null); else if (arr[i][j] == 16) g.drawImage(image16, X0 + j * size, Y0 + i * size, size, size, null); else if (arr[i][j] == 32) g.drawImage(image32, X0 + j * size, Y0 + i * size, size, size, null); else if (arr[i][j] == 64) g.drawImage(image64, X0 + j * size, Y0 + i * size, size, size, null); else if (arr[i][j] == 128) g.drawImage(image128, X0 + j * size, Y0 + i * size, size, size, null); else if (arr[i][j] == 256) g.drawImage(image256, X0 + j * size, Y0 + i * size, size, size, null); else if (arr[i][j] == 512) g.drawImage(image512, X0 + j * size, Y0 + i * size, size, size, null); else if (arr[i][j] == 1024) g.drawImage(image1024, X0 + j * size, Y0 + i * size, size, size, null); else if (arr[i][j] == 2048) g.drawImage(image2048, X0 + j * size, Y0 + i * size, size, size, null); } else g.drawImage(image1, X0 + j * size, Y0 + i * size, size, size, null); } } //显示分数 public void Fontscore(Graphics g){ g.drawImage(imagescore, X0+4*size+30, 20, size,size,null); g.setColor(Color.white); int len; int fontsize=35; if(score<10) len=70; else if(score>=10&&score<100) len=60; else if(score>=100&&score<1000) len=50; else if(score>=1000&&score<10000){ len=45; fontsize=30; }else{ len=45; fontsize=25; } Font font=new Font("楷体",Font.ITALIC|Font.BOLD,fontsize); g.setFont(font); g.drawString(Integer.toString(score), X0+4*size+len, Y0+55); } }
最近下载更多
最近浏览更多
qqqww11 LV2
6月26日
鬼屋报道 LV3
6月1日
7456321 LV1
4月22日
ClydeSon LV5
2023年12月27日
微信网友_6793785677565952 LV1
2023年12月25日
lshlsh
2023年12月25日
暂无贡献等级
bangyiyang LV2
2023年12月21日
1112WHQ LV7
2023年11月3日
jiangneng666 LV2
2023年10月20日
412836806
2023年10月13日
暂无贡献等级