`
VIP庚
  • 浏览: 223901 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

自己制作的 java 版 2048游戏

 
阅读更多

游戏运行界面:





1. 主窗体
/**
 * 2048游戏主界面
 * @author zzc
 *
 */
public class GamePlay extends JFrame {
	URL url11 = GamePlay.class.getResource("上1.png");
	URL url12 = GamePlay.class.getResource("上2.png");
	URL url13 = GamePlay.class.getResource("上3.png");
	
	URL url21 = GamePlay.class.getResource("下1.png");
	URL url22 = GamePlay.class.getResource("下2.png");
	URL url23 = GamePlay.class.getResource("下3.png");
	
	URL url31 = GamePlay.class.getResource("左1.png");
	URL url32 = GamePlay.class.getResource("左2.png");
	URL url33 = GamePlay.class.getResource("左3.png");
	
	URL url41 = GamePlay.class.getResource("右1.png");
	URL url42 = GamePlay.class.getResource("右2.png");
	URL url43 = GamePlay.class.getResource("右3.png");
	
	public static void main(String[] args) {
		GamePlay play=new GamePlay();
		play.Init();
	}
	
	public void Init(){
		this.setSize(590, 500);
		this.setLocation(300, 160);
		this.setTitle("2048");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		MyPanel mypanel=new MyPanel();
		mypanel.setLayout(null);
		mypanel.setBackground(Color.white);
		this.add(mypanel);
		
		//方向按钮
		JButton bt1=new JButton();
		bt1.setBounds(480,290, 35, 35);
		bt1.setBackground(Color.white);
		bt1.setIcon(new ImageIcon(url11));
		bt1.setRolloverIcon(new ImageIcon(url12));
		bt1.setPressedIcon(new ImageIcon(url13));
		bt1.setBorderPainted(false);
		bt1.setActionCommand("up");
		bt1.addActionListener(mypanel);
		mypanel.add(bt1);
		
		JButton bt2=new JButton();
		bt2.setBounds(480,390, 35, 35);
		bt2.setBackground(Color.white);
		bt2.setIcon(new ImageIcon(url21));
		bt2.setRolloverIcon(new ImageIcon(url22));
		bt2.setPressedIcon(new ImageIcon(url23));
		bt2.setBorderPainted(false);
		bt2.setActionCommand("down");
		bt2.addActionListener(mypanel);
		mypanel.add(bt2);
		
		JButton bt3=new JButton();
		bt3.setBounds(435,340, 35, 35);
		bt3.setBackground(Color.white);
		bt3.setIcon(new ImageIcon(url31));
		bt3.setRolloverIcon(new ImageIcon(url32));
		bt3.setPressedIcon(new ImageIcon(url33));
		bt3.setBorderPainted(false);
		bt3.setActionCommand("left");
		bt3.addActionListener(mypanel);
		mypanel.add(bt3);
		
		JButton bt4=new JButton();
		bt4.setBounds(525,340, 35, 35);
		bt4.setBackground(Color.white);
		bt4.setIcon(new ImageIcon(url41));
		bt4.setRolloverIcon(new ImageIcon(url42));
		bt4.setPressedIcon(new ImageIcon(url43));
		bt4.setBorderPainted(false);
		bt4.setActionCommand("right");
		bt4.addActionListener(mypanel);
		mypanel.add(bt4);
		
		
		this.setVisible(true);
	}
	
}

2  主面板类

/**
 * 自定义面板类
 * 
 * @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);
	}

}


3.随机图片类
/**
 * 用来随机出现图片的类
 * 
 * @author zzc
 * 
 */
public class Randompic {
	Random r;
	ArrayList<Point> list = new ArrayList<Point>();

	public Randompic() {
		r = new Random();
	}

	// 根据传入数组 为arr添加项
	public void Found(int arr[][]) {
		// 先清空数组
		list.removeAll(list);
		for (int i = 0; i < arr.length; i++)
			for (int j = 0; j < arr[i].length; j++) {
				if (arr[i][j] == -1) {
					Point p = new Point(i, j);
					list.add(p);
				}
			}
	}

	// 随机一个坐标 返回point
	public Point random() {
		if (list.size() > 0) {
			int n = r.nextInt(list.size());
			return list.get(n);
		} else
			return new Point(-1, -1);

	}

	// 随机一个数字 2或4
	public int randomInt() {
		int n = r.nextInt(12);
		if (n % 5 == 0)
			return 4;
		else
			return 2;
	}
}

4 音效类

/**
 * 音效类
 * @author zzc
 *
 */
public class Music {
	// 播放器 jmf提供的
	Player p;
	String path;
	File f;

	public Music(String path) {
		f = new File(path);
	}

	public void start() {

		// 1.构建一个文件
		try {
			// 2.创建播放器
			p = Manager.createPlayer(new MediaLocator((f).toURI().toURL()));
			p.prefetch();//预读文件
			// 3.播放器已经准备好
			//p.realize();
			// 4.开始播放
			p.start();

		} catch (NoPlayerException e) {
			e.printStackTrace();
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
  • 大小: 132.7 KB
分享到:
评论
1 楼 啊嘞嘞勒 2017-11-30  
游戏结束无法显示

相关推荐

    java小游戏 2048

    java小游戏 2048java小游戏 2048java小游戏 2048java小游戏 2048java小游戏 2048java小游戏 2048java小游戏 2048java小游戏 2048java小游戏 2048java小游戏 2048java小游戏 2048java小游戏 2048java小游戏 2048java...

    java制作2048小游戏源码.rar

    Java制作的2048小游戏源码是一个非常适合初学者学习的项目,它涵盖了Java SE(标准版)的基础知识,特别是Java Swing组件库的使用。Java Swing是Java AWT(抽象窗口工具包)的扩展,提供了丰富的图形用户界面(GUI)...

    java课程设计大作业-基于Java构建的的2048小游戏(源码+资源文件)

    java课程设计大作业——基于Java构建的的2048小游戏(源码+资源文件)java课程设计大作业——基于Java构建的的2048小游戏(源码+资源文件)java课程设计大作业——基于Java构建的的2048小游戏(源码+资源文件)java...

    java + mysql 的一个2048非网页版的小游戏

    【标题】"java + mysql 的一个2048非网页版的小游戏"涉及到的主要知识点是Java编程语言和MySQL数据库在游戏开发中的应用。这是一款基于2048游戏规则的桌面应用程序,它不依赖于浏览器,而是通过Java实现图形用户界面...

    Java实现2048小游戏(附带源码)

    源码见附件,下载下来直接可运行,亲测可用,每一步都详细做了注释,特别适合新手学习 源码见附件,下载下来直接可运行,亲测可用,每一步都详细做了注释,特别适合新手学习 源码见附件,下载下来直接可运行,亲测...

    Java 2048.jar

    java的2048小游戏,简单使用swing制作的,直接打包成了jar包,查看源代码需要解析,java的2048小游戏

    一个java fx 做的 麻将小游戏.zip

    java游戏开发 小游戏 经典游戏 游戏源码 课程设计 java游戏开发 小游戏 经典游戏 游戏源码 课程设计 java游戏开发 小游戏 经典游戏 游戏源码 课程设计 java游戏开发 小游戏 经典游戏 游戏源码 课程设计 java游戏开发...

    Github基于Java的Rpg游戏

    【标题】:“Github基于Java的Rpg游戏”指的是在GitHub上可以找到的一种使用Java编程语言开发的角色扮演游戏(Role-Playing Game,简称RPG)。这种类型的游戏通常包含丰富的剧情、角色发展和互动元素,而通过使用...

    java小游戏 (源码)swing五子棋源代码

    java小游戏 (源码)swing五子棋源代码java小游戏 (源码)swing五子棋源代码java小游戏 (源码)swing五子棋源代码java小游戏 (源码)swing五子棋源代码java小游戏 (源码)swing五子棋源代码java小游戏 (源码)swing五子棋源...

    2048游戏安卓和PC端

    利用Unity引擎制作的2048小游戏,规则是: 在 4 × 4 大小的棋盘上,玩家可以选择向“上,下,左,右”四个方向滑动方块,每次滑动成功,所有方块向滑动的方向靠拢。 相邻的且数字相同的方块会合并成一个新的方块,...

    喜洋洋大战灰太狼JAVA版小游戏

    《喜洋洋大战灰太狼JAVA版小游戏》是一个由个人开发者使用Java编程语言制作的简单游戏。这款游戏的主题基于经典的儿童动画片“喜羊羊与灰太狼”,为玩家提供了一个互动娱乐的平台。从描述来看,它可能是一个轻量级的...

    java小游戏源码集合

    Java小游戏源码集合是一个丰富的资源库,包含了八款经典的Java编程实现的小游戏,这些游戏能够帮助初学者理解和学习Java编程语言以及游戏开发的基本原理。以下是这些游戏的详细讲解: 1. **五子棋**:五子棋是一款...

    java小游戏开发代码

    Java小游戏开发是一个很好的实践项目,尤其适合初学者熟悉编程语言特性和面向对象设计。这个压缩包包含了一个基于Java实现的小游戏源代码,可以为初学者提供一个实际操作的平台,帮助他们更好地理解和应用Java编程...

    (原创)过去自己做的java小游戏源代码(可做参考)

    【标题】:“(原创)过去自己做的java小游戏源代码(可做参考)”揭示了这是一个包含作者个人开发的Java编程语言实现的小游戏源代码集合。这些游戏可能具有简单的图形界面和基本的游戏逻辑,旨在帮助初学者理解Java...

    Java做游戏学习.zip

    Java做游戏学习.zipJava做游戏学习.zipJava做游戏学习.zip Java做游戏学习.zipJava做游戏学习.zipJava做游戏学习.zip Java做游戏学习.zipJava做游戏学习.zipJava做游戏学习.zip Java做游戏学习.zipJava做游戏学习....

    java程序设计-基于Java 构建的棋牌游戏框架,支持单台游戏服务器一到两千人同时在线

    Java 棋牌游戏框架 WG棋牌包网项目, java服务器.支持单台游戏服务器一到两千人同时在线. 包含: 1.游戏基础框架 2.网关,路由通信模块 3.游戏机器人框架 4.大厅,房间,桌子流程 5.完善的统一棋牌控制库存框架,支持游戏...

    Java版的植物大战僵尸游戏完整项目源码(含图片素材)

    首先,让我们了解一下Java游戏开发的基础。Java中的游戏开发通常涉及图形用户界面(GUI)、事件处理、动画制作、物理模拟等多个方面。在这个项目中,开发者会用到Java Swing或JavaFX来创建游戏界面,利用线程控制...

    2048网页版小游戏代码

    2048小游戏

    java小游戏源码2021版

    在Java游戏开发中,主要涉及以下几个关键知识点: 1. **Java基础知识**:所有游戏都基于Java语言编写,因此对Java的基本语法、类与对象、异常处理、输入/输出流、多线程等基础概念有扎实的理解是必要的。开发者需要...

Global site tag (gtag.js) - Google Analytics