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);
	}
}
 最近下载更多
最近下载更多
                 最近浏览更多
最近浏览更多
                
                2354593759    
                2024年12月31日
            
            
                    暂无贡献等级
            
        
                qqqww11     LV2
                2024年6月26日
            
            
        
                鬼屋报道     LV3
                2024年6月1日
            
            
        
                7456321     LV1
                2024年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日
            
            
        
 
                 
                 
                