`
VIP庚
  • 浏览: 223275 次
  • 性别: 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游戏开发...

    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的基本语法、类与对象、异常处理、输入/输出流、多线程等基础概念有扎实的理解是必要的。开发者需要...

    采用java制作的手机小游戏

    【Java手机小游戏开发详解】 Java作为一种跨平台的编程语言,被广泛应用于移动设备上的应用程序开发,包括手机小...通过学习和分析这样的项目,开发者可以深入理解Java在游戏开发中的实际应用,提升自己的编程技能。

Global site tag (gtag.js) - Google Analytics