Java拼图游戏课程设计报告.docx
《Java拼图游戏课程设计报告.docx》由会员分享,可在线阅读,更多相关《Java拼图游戏课程设计报告.docx(31页珍藏版)》请在冰豆网上搜索。
Java拼图游戏课程设计报告
《Java程序设计与应用开发》课程设计报告
设计题目
拼图大作战
学生姓名
学生班级
学生学号
指导教师
完成时间:
2016年06月21日
一、项目说明..................................................2
二、设计思路与关键数据结构.......................4
三、系统的类和结构......................................6
四、核心算法描述和相关技术说明..............8
五、总结和体会..............................................9
六、源代码清单............................................10
一.项目说明
1、项目介绍
该游戏是由以图片为主体的拼图小游戏,这个游戏是一个益智休闲的小游戏。
该类似的小游戏在我们成长的过程中,曾经疯狂的流行着,这是一个老少皆宜的小游戏,它开发人们的智力,加强我们的动手能力和我们的眼睛的洞察力。
该游戏简单方便易操作是一个很好的小游戏,也是一个经久不衰的游戏,在我们这代人中,可谓每个人都玩过这种类似的小游戏,简单易操作是其一直存在的原因之一。
游戏由简单的界面组成的,操作简单,该图像块是由12块小的小图像块构成的,其中有一个空白的小图像块,该图像块是来与别的图像块交换的,以此来实现大图像的拼凑。
在java标准环境下运行,实现通过小的图像块的移动实现大的图像的拼凑。
通过鼠标点击选取小的图像块,通过移动鼠标实现小图像的移动,使小图像块能够上下左右的移动从而完成大图像的拼凑的完成。
2、游戏展示与使用
1.主体功能
可以从多张图片中选择来进行拼图游戏
通过移动鼠标实现小图像的移动,使小图像块能够上下左右的移动从而完成大图像的拼凑的完成。
播放游戏音乐的功能
统计游戏中走的步数
游戏中体现友好性,加了数字提示的功能和一个原图预览的区域
完成后,有设置提示弹框显示,所用的步数和恭喜
2.如何使用
如下图:
可以先选择喜欢的图片来进行游戏,点击喜欢的图片后,再点击Start按钮便可以开始游戏
在游戏过程冲,可以使用数字提示的功能,数字提示会按照1,2,···9的顺序给予提示,借此降低游戏难度,增加可玩性
也可以控制游戏音乐的播放与否
在完成拼图后,会提恭喜完成的信息。
若再想继续游戏,则继续选择喜欢的图片,再点击Start按钮继续游戏
若不想玩游戏,则点击右上角叉叉,即可退出游戏。
3.基于Java技术,在Ecilpse下进行编译使用,作者使用环境SUMSUNG电脑,WIN1064位操作系统
二、设计的思路与关键数据结构
1、设计思路
主要是利用了Java中的Swing和Awt来实现界面上的静态显示和动态交互操作,播放音乐的技术使用到了Applet,在算法的实现上,利用了布局上的坐标方式,来计算每个小方格的坐标位置,进行小图片交换和判断是否复原拼图等操作。
2、实现思路
主要分为
五个类来实现总体的功能
在构思布局的过程中,想了3*4的布局,借此可以直接在面板上放置比较多的按钮来实现功能。
在显示界面的思路上,分为四个方面,主界面,图片预览区,拼图区,小平图单元格。
然后要有实现游戏总的一个类,启动类。
所以总共五个类,利用UML时序图表示如下:
3、关键算法
在决定做这个小游戏的时候,翻阅了书本,书本利用了坐标来计算每个小方块的关系,进行计算。
但是不完善,在这个基础上,上网查阅了博客和一些IT网站,最后完成了算法方面的问题。
第一个,打乱小拼图,利用第一个左上角的小方块与周围的小方块进行比较,若原理左上角的四块小方格,则表示打乱成功。
第二个,如何将点击的小方块和空方块来进行交换,将两个方块坐标进行互换即刻,在判断四个方向即刻。
利用UML时序图表示如下:
三、系统的类和结构
类结构与关系:
启动起类,负责调用空的构造方法,来启动整个游戏。
主界面类,进行界面的初始化操作,和添加组件。
预览图片类,负责绘制预览区,将图片载入预览区。
拼图图片类,关键类,实现了方格移动的算法。
拼图单元格类,关键类,实现了方格移动的算法
利用UML时序图,陈勋结构和练习,显示如下:
2、最初完成游戏界面效果如图:
此时无功能,无监听事件
3、完成监听和播放音乐功能后
完成一句游戏后效果如图所示
四、核心算法描述和相关技术说明
主要算法:
//当前方格的移动的算法
publicvoidmove(Stringdirection){//上,下,左,右
switch(direction){
case"UP":
this.setLocation(this.getBounds().x,this.getBounds().y-150);
break;
case"DOWN":
this.setLocation(this.getBounds().x,this.getBounds().y+150);
break;
case"LEFT":
this.setLocation(this.getBounds().x-150,this.getBounds().y);
break;
case"RIGHT":
this.setLocation(this.getBounds().x+150,this.getBounds().y);
break;
default:
//其他情况,不做移动处理
break;
}
}
//随机产生一个方向,进行空方格与小方法的互换
//产生0-3之间的随机数,对应空方格的上下左右移动
intdirection=(int)(Math.random()*4);//0,1,2,3
switch(direction){
case0:
//空方格向左移动,与左边的方格进行互换位置,左侧方格要向右移动
//nullX=nullX-150;
nullX-=150;
cellMove(nullX,nullY,"RIGHT");
break;
case1:
//空方格向右移动,与右边的方格进行互换位置,右侧方格要向左移动
nullX+=150;
cellMove(nullX,nullY,"LEFT");
break;
case2:
//空方格向上移动,与上边的方格进行互换位置,上侧方格要向下移动
nullY-=150;
cellMove(nullX,nullY,"DOWN");
break;
case3:
//空方格向下移动,与下边的方格进行互换位置,下侧方格要向上移动
nullY+=150;
cellMove(nullX,nullY,"UP");
break;
}
五、总结和体会
1、优缺点与自我评价
(一)、这个游戏真的太过简单,游戏功能单一,日后要完善,学新的知识
(二)、没和他人进行问题和知识上的学习交流
(三)、自己没有充分利用好时间,课程设计匆匆完成
(四)、图形交互界面不扎实,做的时候要看书,试来试去。
算法方面,这次写的两个算法相对简单,但也耗费了大量脑力,以后要多思考,学习算法。
(五)、这几天的精力都在做这个游戏中,破天荒给每行代码写好注释,以后要继续保持
2、课设与课程总结
在没上java这门课之前,我就知道java的强大,在我们生活中的重要性。
在学期开始的时候,那时我已经接触了Java,后来因为对前端方向感兴趣,所以就没怎么关心过Java,后台用的PHP多。
有空的时候放开书本,发现这本书讲了好多“复古”的内容,在日常中,我并不多见到这些知识。
在一次次地上网查询,了解相关的知识,从这些经历中,我打心底里对java有了新的了解,新的认识,从而对java产生了浓厚的兴趣以及好奇心,发现我之前太轻视这门课了。
此时Java课堂教学虽已经停止,但是我私下,今后会继续学期这门语言,认真对待,尝试自己在这个暑假就利用Java做后台。
这个小游戏挺简单的,三天的时间,没有请教别人,自己慢慢的就捣鼓出来了。
我知道团结的重要性,团队的力量。
以后做这方面的东西,开发,还是要多和他人讨论学习。
对于XX老师,很感谢您的教学付出,您在我心中是一个很负责任的老师,认真严肃的同时还能这么关心学生,贴近学生,真的打心底里佩服。
六、源代码清单
packagegamestart;
importgameui.PictureMainFrame;
/*
*启动器类
*/
publicclassMainApp{
publicstaticvoidmain(String[]args){
//创建主界面
PictureMainFrameframe=newPictureMainFrame();
//显示界面
frame.setVisible(true);
}
}
/*
*图片小方格类
*/
packagegameui;
importjavax.swing.Icon;
importjavax.swing.JButton;
/*
*图片小方格类
*/
publicclassCellextendsJButton{
//带有图片的小方格
publicCell(Iconicon){
super(icon);
//设置小方格大小
this.setSize(150,150);
}
//带有图片并且带有文字的小方格
publicCell(Stringtext,Iconicon){
super(text,icon);
//设置小方格大小
this.setSize(150,150);
this.setHorizontalTextPosition(CENTER);//文字水平居中显示
this.setVerticalTextPosition(CENTER);//文字垂直居中显示
}
//当前方格的移动
publicvoidmove(Stringdirection){//上,下,左,右
switch(direction){
case"UP":
this.setLocation(this.getBounds().x,this.getBounds().y-150);
break;
case"DOWN":
this.setLocation(this.getBounds().x,this.getBounds().y+150);
break;
case"LEFT":
this.setLocation(this.getBounds().x-150,this.getBounds().y);
break;
case"RIGHT":
this.setLocation(this.getBounds().x+150,this.getBounds().y);
break;
default:
//其他情况,不做移动处理
break;
}
}
}
/*
*拼图类
*/
packagegameui;
importjava.awt.Rectangle;
importjava.awt.event.MouseEvent;
importjava.awt.event.MouseListener;
importjavax.swing.ImageIcon;
importjavax.swing.JOptionPane;
importjavax.swing.JPanel;
/*
*拼图类
*/
publicclassPictureCanvasextendsJPanelimplementsMouseListener{
//静态变量
publicstaticintpictureID=1;//图片ID
publicstaticintstepNum=0;//步数
//成员变量
privateCell[]cell;//小方格
privatebooleanhasAddActionListener=false;//用来表示是否为方格添加了点击监听,添加了值为true,未添加值为false
privateRectanglenullCell;//指定一个空的小方格
//构造方法
publicPictureCanvas(){
//设置拼图区的布局
this.setLayout(null);//帧布局
//创建12个图片小方格,添加到拼图区
cell=newCell[12];
for(inti=0;i<4;i++){//代表的是行数
for(intj=0;j<3;j++){//代表的是列数
//加载图片
//ImageIconicon=newImageIcon("picture\\1_1.gif");
//i=0,1
//j=0,1,2
//0*3+0+1=1
//0*3+1+1=2
//0*3+2+1=3
//1*3+0+1=4
//1*3+1+1=5
ImageIconicon=newImageIcon("picture\\1_"+(i*3+j+1)+".gif");
//创建图片小方格
cell[i*3+j]=newCell(icon);
//指定图片小方格显示的位置
cell[i*3+j].setLocation(j*150+20,i*150+20);
//把图片小方格添加到拼图区显示
this.add(cell[i*3+j]);
}
}
//删除第12个图片小方格
this.remove(cell[11]);
//指定一个空的小方格
nullCell=newRectangle(300+20,450+20,150,150);
}
//重新加载图片,并添加数字提示
publicvoidreLoadPictureAddNumber(){
//获取到每一个图片小方格
for(inti=0;i<4;i++){//行数
for(intj=0;j<3;j++){//列数
//获取小方格cell[i*3+j]
//设置小方格显示的图片
ImageIconicon=newImageIcon("picture\\"+pictureID+"_"+(i*3+j+1)+".gif");
cell[i*3+j].setIcon(icon);
//设置小方格显示的数字提示
cell[i*3+j].setText(""+(i*3+j+1));
//设置小方格数字显示的位置
cell[i*3+j].setVerticalTextPosition(this.getY()/2);//设置文字垂直显示位置[居中显示]
cell[i*3+j].setHorizontalTextPosition(this.getX()/2);//设置文字水平显示位置[居中显示]
}
}
}
//重新加载图片,并去除数字提示
publicvoidreLoadPictureClearNumber(){
//获取到每一个图片小方格
for(inti=0;i<4;i++){//行数
for(intj=0;j<3;j++){//列数
//获取小方格cell[i*3+j]
//设置小方格显示的图片
ImageIconicon=newImageIcon("picture\\"+pictureID+"_"+(i*3+j+1)+".gif");
cell[i*3+j].setIcon(icon);
//设置小方格显示的数字提示
cell[i*3+j].setText("");
}
}
}
//对小方格进行重新位置排序,打乱顺序
publicvoidstart(){
//如果没有给小方格添加鼠标点击监听的话,则添加监听
if(!
hasAddActionListener){
//添加监听
for(inti=0;i<11;i++){
cell[i].addMouseListener(this);
}
//更新鼠标点击监听的状态
hasAddActionListener=true;
}
//判断当前第一个小方格距离左上交的较近时,进行方格与空方格互换
//如果第一个小方格在左上角的四个方格位置内,就不断的循环,进行方法与空方格位置的互换
while(cell[0].getBounds().x<=170&&cell[0].getBounds().y<=170){
//获取到空方格的位置
intnullX=nullCell.getBounds().x;
intnullY=nullCell.getBounds().y;
//随机产生一个方向,进行空方格与小方法的互换
//产生0-3之间的随机数,对应空方格的上下左右移动
intdirection=(int)(Math.random()*4);//0,1,2,3
switch(direction){
case0:
//空方格向左移动,与左边的方格进行互换位置,左侧方格要向右移动
//nullX=nullX-150;
nullX-=150;
cellMove(nullX,nullY,"RIGHT");
break;
case1:
//空方格向右移动,与右边的方格进行互换位置,右侧方格要向左移动
nullX+=150;
cellMove(nullX,nullY,"LEFT");
break;
case2:
//空方格向上移动,与上边的方格进行互换位置,上侧方格要向下移动
nullY-=150;
cellMove(nullX,nullY,"DOWN");
break;
case3:
//空方格向下移动,与下边的方格进行互换位置,下侧方格要向上移动
nullY+=150;
cellMove(nullX,nullY,"UP");
break;
}
}
}
/**
*方格与空方格位置互换
*@paramnullX空方格的x轴坐标
*@paramnullY空方格的y轴坐标
*@paramdirection方格要移动的方向
*/
privatevoidcellMove(intnullX,intnullY,Stringdirection){
for(inti=0;i<11;i++){
//获取到与空方格位置相同的小方格
if(cell[i].getBounds().x==nullX&&cell[i].getBounds().y==nullY){
//当前方格的移动
cell[i].move(direction);
//空方格的移动
nullCell.setLocation(nullX,nullY);
//交换位置后,结束循环
break;
}
}
}
@Override
publicvoidmouseClicked(MouseEvente){
}
@Override
publicvoidmousePressed(MouseEvente){//鼠标按下去
//获取到当前所点击的小方格
Cellbutton=(Cell)e.getSource();
//获取所点击方格的x,y坐标
intclickX=button.getBounds().x;
intclickY=button.getBounds().y;
//获取当前空方格的x,y坐标
intnullX=nullCell.getBounds().x;
intnullY=nullCell.getBounds().y;
//进行比较,如果满足条件进行位置的交换
if(clickX==nullX&&clickY-nullY==150){//点击的为空方格下面的方格
button.move("UP");//所点击的方格向上移动
}elseif(clickX==nullX&&clickY-nullY==-150){//点击的为空方格上面的方格
button.move("DOWN");//所点击的方格向下移动
}elseif(clickX-nullX==150&&clickY==nullY){//点击的为空方格右面的方格
button.move("LEFT");//所点击的方格向左移动
}elseif(clickX-nullX==-150&&clickY==nullY){//点击的为空方格左面的方格
button.move("RIGHT");//所点击的方格向右移动
}else{
return;//不满足移动条件,就不进行任何的处理
}
//更新空方格的位置
nullCell.setLocation(clickX,clickY);
//拼图区界面重新绘制
this.repaint();
//更新步数,将游戏状态区的步数更新
stepNum++;
PictureMainFrame.step.setText("步数:
"+stepNum);
//判断当前游戏是否完成,若完成,给玩家一个友好提示
if(thi