首页>代码>java swing开发的2048小游戏>/2048游戏/src/_2048/MyPanel.java
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);
	}

}
最近下载更多
1112WHQ  LV7 2023年11月3日
双方各何必呢  LV13 2023年5月31日
huangzy  LV12 2023年4月6日
liangge2115  LV27 2021年12月14日
选了了  LV7 2021年12月13日
Demo1111  LV30 2021年12月8日
123aa21a  LV5 2021年6月23日
misamjsds  LV9 2021年6月3日
快乐小贝  LV4 2021年2月1日
段朝洪  LV15 2020年11月21日
最近浏览更多
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日
暂无贡献等级
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友