java编写的窗体拼图小游戏,功能完善 完整代码 下载即可运行

   前段时间公司的事情太忙,CSDN博客停止更新快两个月。今天为大家分享一个java窗体的拼图游戏,也叫类似华容道游戏。系统由一个大图组成,分割成N*N个小图,可以是3*3,4*4,5*5等,每次游戏的时候图片都是随机打乱,只有一个空白位置,通过上下左右键来实现图片的移动,最终图片和原始一摸一样的时候,该张图片完成拼接,表示游戏完成。整个系统界面漂亮,有完整源码,希望大家可以喜欢。喜欢的帮忙点赞和关注。一起编程、一起进步.

项目背景

   拼图很快成为发展成熟的、拥有广大市场的娱乐产品,消费者在任何地方都能买到拼图。此时拼图不仅用于教育和娱乐,也用于商业广告和政治宣传。第一次世界大战(1914-1918)就是一个很好的例子。廉价的拼图上画有勇敢的战士们奋不顾身地为国王和国家而战,拼图在交战双方都很流行,卖得很好。拼图已成为靠近人们内心世界、进入家庭和传播信息的方法。拼图与报纸、收音机及即将出现的第一代电视成为一种简单而又直接的大众传媒方式。人们应该被鼓励乘火车旅游吗?许多展示雄伟火车和幸福旅游者的拼图就此出现。每一项新发明和潮流——汽船、飞机、汽车以及最新、最大胆的女式泳衣——都曾出现在拼图上。

开发环境

   开发语言为Java,开发环境Eclipse或者IDEA都可以。数据库采用:MySQL。运行主程序,或者执行打开JAR文件即可以运行本程序。

系统框架

  利用JDK自带的SWING框架开发,不需要安装第三方JAR包。MySQL数据库,纯窗体模式,直接运行Main文件即可以。运行方法直接可以run as appliaiton或者JAR --.jar

程序功能

   游戏玩法

1 设立自己的游戏昵称,自己的昵称显示在游戏的右上角

2 显示当前游戏排名TOP10,用户可以方便的看到目前此游戏玩的最好记录的玩家

3 通过上下左右键盘按键来实现图片的上下左右移动。当按下左:空格图片和其左边的图片交换,右边和上下类似操作

4 移动小图片的时候,有相应的键盘声音

5 游戏完成的时候提示游戏完成

    游戏技巧

  对刚开始接触拼图的玩家而言,所谓入门级的拼图主要是取决于图案的一些特征。那些图案内容比较丰富的,也就是说,在整幅画面的各个角落里也有内容相对完整的子画面的,且色彩和轮廓反差较大的,这样的拼图玩起来就相对容易一些。因为在拼组的局部,想要寻找合适的零片,可选的零片总能被限制在比较小的范围内。

运行效果

1  初始界面

2 运行界面

 关键代码

public void onInit() {
		setShowFPS(false);
		setSize(1100, 850);
		//setLocation(100, 100);
		setLoseFocusChangeColor(false);
		setTitle("拼图游戏");
		x = y = 3;
		matrix = new ImageObject[][]{
				{
						new ImageObject(new FileImageResource("./res/img/1.jpg"), 0, 0),
						new ImageObject(new FileImageResource("./res/img/2.jpg"), 200, 0),
						new ImageObject(new FileImageResource("./res/img/3.jpg"), 400, 0),
						new ImageObject(new FileImageResource("./res/img/4.jpg"), 600, 0)},
				{
						new ImageObject(new FileImageResource("./res/img/5.jpg"), 0, 200),
						new ImageObject(new FileImageResource("./res/img/6.jpg"), 200, 200),
						new ImageObject(new FileImageResource("./res/img/7.jpg"), 400, 200),
						new ImageObject(new FileImageResource("./res/img/8.jpg"), 600, 200)},
				{
						new ImageObject(new FileImageResource("./res/img/9.jpg"), 0, 400),
						new ImageObject(new FileImageResource("./res/img/10.jpg"), 200, 400),
						new ImageObject(new FileImageResource("./res/img/11.jpg"), 400, 400),
						new ImageObject(new FileImageResource("./res/img/12.jpg"), 600, 400)},
				{
						new ImageObject(new FileImageResource("./res/img/13.jpg"), 0, 600),
						new ImageObject(new FileImageResource("./res/img/14.jpg"), 200, 600),
						new ImageObject(new FileImageResource("./res/img/15.jpg"), 400, 600),
						new ImageObject(new FileImageResource("./res/img/0.jpg"), 600, 600)}
		};
		text = new SimpleText("step: " + step, 850, 100);
		addObject(text);
		figure = new int[][]{{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 16}};
		for (int i = 0; i < 1000; i++) {
			int a = (int) (Math.random() * 4);
			switch (a) {
				case 0:
					upMove(false);
					break;
				case 1:
					downMove(false);
					break;
				case 2:
					rightMove(false);
					break;
				case 3:
					leftMove(false);
					break;
			}
		}
		add();
		ArrayList<String> list = Rank.topTen();
		for (int i = 0; i < list.size(); i++) {
			addObject(new SimpleText(list.get(i), 825, 200 + i * 50));
		}
		addObject(new SimpleText("top10:", 825, 150));
		userName = dialogInput("输入你的姓名:", "测试用户");
		addKeyListener(null, keyEvent ->
		{
			switch (keyEvent.getKeyCode()) {
				case KeyEvent.VK_DOWN:
					downMove(true);
					break;
				case KeyEvent.VK_UP:
					upMove(true);
					break;
				case KeyEvent.VK_LEFT:
					leftMove(true);
					break;
				case KeyEvent.VK_RIGHT:
					rightMove(true);
					break;
			}
		}, keyEvent ->
		{
		});
	}

项目总结

(1)在写代码之前,在大脑里一定要把思路理清楚,不能模模糊糊,一定要把功能图和流程图画出来,然后根据它去实现每一个功能块,要多分析,培养一种良好的逻辑思维能力。

(2)在写代码的过程中,一定要采取就近原则,同一个功能,或者对同一个组件的设置一般要写在一块,这样写的程序比较清晰,不容易出错,也便于查找。

(3)要养成良好的注释习惯,一是有利于别人阅读你的程序,同时也有利于自己以后再看,就能很快的读懂程序,提高效率。

(4)把功能模块化,即把实现相同功能的代码段封装成一到一个类或者一个方法中,实现的时候调用即可,这样能提高代码的可读性

(5)养成创建包来存放不同功能的类,使系统的结构更加模块化和规范化。

(6)在编写代码的时候,一定要边写边调试,要适时的设置断点,或者把某些变量的值输出到控制台,通过观察和分析变量的值,便于判断问题所在,同时,需要捕获异常的一定要把异常信息打印出来,便于分析问题。

import java.awt.*; import java.applet.*; import java.awt.event.*; public class PPuzzle extends Applet{ Image imgPuzzle,buff; Point fifteen=new Point(3,3); int[][] map={{0,4,8,12},{1,5,9,13},{2,6,10,14},{3,7,11,15}}; int sx,sy; Canvas screen; Graphics gs,gb; boolean running=false; Button bStart= new Button("新游戏"); Button bSee=new Button("显示正确图像"); public void init(){ prepareImage(); sx=imgPuzzle.getWidth(this)/4; sy=imgPuzzle.getHeight(this)/4; setBackground(Color.blue); initScreen(); initButtons(); add(screen); add(bStart); add(bSee); } void prepareImage(){ imgPuzzle=getImage(getCodeBase(),"images/3.jpg");// MediaTracker mt=new MediaTracker(this); mt.addImage(imgPuzzle, 0); try{ mt.waitForAll(); }catch(Exception e){} //创建buffer并获取graphics对象 buff=createImage(imgPuzzle.getWidth(this),imgPuzzle.getHeight(this)); gb=buff.getGraphics(); } void initMap(){ java.util.Random rnd=new java.util.Random(); int temp,x1,x2,y1,y2; for(int i=0;i<100;i++){ x1=rnd.nextInt(4); x2=rnd.nextInt(4); y1=rnd.nextInt(4); y2=rnd.nextInt(4); temp=map[x1][y1]; map[x1][y1]=map[x2][y2]; map[x2][y2]=temp; } outer:for(int j=0;j<4;j++) for(int i=0;i<4;i++) if(map[i][j]==15){ fifteen.setLocation(i,j); break outer; } } void initScreen(){ screen=new Canvas(){ public void paint(Graphics g){ if(gs==null) gs=getGraphics(); if(running) drawScreen(); else g.drawImage(imgPuzzle,0,0,this); } }; screen.setSize(imgPuzzle.getWidth(this), imgPuzzle.getHeight(this)); screen.addMouseListener(new MouseAdapter(){ public void mousePressed(MouseEvent me){ if(!running)return; int x=me.getX()/sx,y=me.getY()/sy; int fx=(int)fifteen.getX(),fy=(int)fifteen.getY(); if (Math.abs(fx-x)+Math.abs(fy-y)>=2)return; map[fx][fy]=map[x][y]; map[x][y]=15; fifteen.setLocation(x,y); drawScreen(); } }); } void initButtons(){ //新游戏 按钮事件的处理 bStart.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent ae){ initMap(); drawScreen(); running=true; bSee.setLabel("显示正确图像"); } }); //显示正确图像 按钮事件处理 bSee.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent ae){ //bsee 按钮标题为”继续游戏“ if(bSee.getLabel().equals("继续游戏")){ drawScreen(); bSee.setLabel("继续游戏"); } else{ //bsee的标题显示为”显示正确图像“ gs.drawImage(imgPuzzle,0,0,screen); bSee.setLabel("继续游戏"); } } }); } void drawScreen(){ gb.clearRect(0, 0, sx*4, sy*4); //将指定位置的图像块绘制到Buffer中 for(int j=0;j<4;j++) for(int i=0;i<4;i++) if(map[i][j]!=15) drawSegment(map[i][j],i,j); //向Screen绘制buffer中的图像 gs.drawImage(buff,0,0,screen); } void drawSegment(int seg,int x,int y){ int dx=seg%4*sx,dy=seg/4*sy; //可能有错误 gb.drawImage(imgPuzzle, x*sx,y*sy ,x*sx+sx-1 ,y*sy+sy-1 , dx , dy,dx+sx-1,dy+sy-1 ,screen ); } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

计算机程序

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值