魔板游戏开发说明Word文档格式.docx
《魔板游戏开发说明Word文档格式.docx》由会员分享,可在线阅读,更多相关《魔板游戏开发说明Word文档格式.docx(11页珍藏版)》请在冰豆网上搜索。
![魔板游戏开发说明Word文档格式.docx](https://file1.bdocx.com/fileroot1/2023-1/2/187535bc-ce69-4368-b276-09177614b9b8/187535bc-ce69-4368-b276-09177614b9b81.gif)
该程序共包含着几个类源文件:
CreayImage.java,ActionEvent.java,ImageIcon.java,CountTime.java,Resize.java,CutImage.java包含接口:
IDealImage.java,Direction.java.。
其中CreayImage为主类,主要布局整个游戏界面的GUI,以及各类事件,ActionEvent类为一个侦听器用来处理鼠标点击事件,实现了MouseListener接口,ImageIcon类继承了javax.swing.ImageIcon类,里面定义了id属性,用于最后判断游戏是否胜利完成。
CountTime类为一个线程类,实现java.lang.Runnable接口,用于游戏开始时计时用。
Resize类是一个工具类,用于处理加载进来的图片,将其处理成制定大小weidth*height像素的图像,便于将处理后的图片加载相应的空间之上。
CutImage类也是一个工具类,用于将Resize类处理后的图片进行切割成制定的大小图片组,并将切割好的图片存放于容器之中。
接口IDealImage中定义了getImageList方法,由CutImage来实现,调用接口可以减低程序的耦合度,加强程序的灵活性。
Direction接口中指定义了几个方向属性UP,DOWN,LEFT,RIGHT分别用于指定鼠标点击label时,图片移动的方向。
另外:
源文件中还包含一个img.ini二进制文件,里面存放一个预先写进去的图片二进制数。
用于程序一开始运行时,从中读取图片。
结构图如下:
四、主类说明(15分)
用表格的形式说明主类中各成员变量(成员变量的名称、变量类型、变量的描述)、方法(名称、功能、备注)。
1、CreayImage类
成员变量
成员变量的名称
变量类型
变量的描述
rows
Int
模板游戏矩阵行数
cols
模板游戏矩阵列数
width
游戏矩阵列每个小图像的宽度
height
游戏矩阵列每个小图像的高度
steps
图像移动的步数
path
String
加载图像图像的路径
imagelist
ArrayList
存放被切割的小图像的容器
所用方法
方法名称
功能
备注
Init()
初始化魔方游戏的界面部分
initLabelImage()
用于处理图像,把图像切割后并加载到panel容器的label上
initLabelScan()
把加载的原图像加载到魔方游戏的右下角的区域中
actionPerformed()
监听界面发出的操作指令,实现各种操作(比如点击开始,选择图片等)
五、其他各类的描述和说明。
(15分)
1、ActionEvent
变量
cutRow
鼠标点击的图像所在列
cutCol
鼠标点击的图像所在行
图像的列数
Cols
direction
移动的方向
方法
ActionEvent(introws,intcols…)
带参数的构造方法,用于传递参数
initStep()
设置移动图像的标签
mouseClicked()
鼠标点击事件
checkSuccess()
检查图像是否与原图匹配的方法
checkImageCanMove()
检查图像是否可以移动
moveLabelImage()
设置图像移动方向
moveUp()
图像上移的方法
moveDown()
图像下移的方法
moveLeft()
图像左移的方法
moveRight()
图像右移的方法
2、CutImage
getImageList()
返回加载的图片切割后的图像列表
2、Resize
Resize()
Rize()
重置图像大小的方法,把图像的大小更改为400*300
3.CountTime
成员变量:
IsSuccess
Boolean
定义游戏是否胜利
Time
定义游戏所进行的时间
Run
游戏点击开始时开始计时
4.Direction接口变量
UP
方向向上
DOWN
方向向下
LEFT
方向向左
RIGHT
方向向右
六、附主要源代码(60分)
CreayImage类中主要代码:
1.初始化,游戏主面板代码:
publicvoidinitLabelImage(){
this.imagePane.removeAll();
//先除去面板上的控件
this.imagePane.setLayout(newGridLayout(this.getRows(),this.getCols(),1,1));
//对面板进行重新布局
//定义标签移动步数num
this.total=this.getRows()*this.getCols();
this.imageLabel=newJLabel[this.total];
try{
IDealImagedealImage=newCutImage();
//定义接口,实例化CutImage类
this.imageList=dealImage.getImageList(this.getPaht(),this.rows,
this.cols,this.weight,this.height);
}catch(Exceptione){
e.printStackTrace();
}
//调用方法,获得对图片进行分割后的小图片容器
for(inti=0;
i<
this.rows;
i++){
for(intj=0;
j<
this.cols;
j++){
//用双重循环,将图片加载到面板的Label上
ImageIconimgIcon=newImageIcon(this.imageList.get(i*cols
+j));
imgIcon.setId(i*cols+j);
this.imageLabel[i*this.cols+j]=newJLabel(imgIcon);
this.imageLabel[i*this.cols+j].setSize(imgIcon
.getIconWidth(),imgIcon.getIconHeight());
this.imagePane.add(this.imageLabel[i*this.cols+j]);
//给没个label添加一个鼠标单击事件侦听
this.imageLabel[i*this.cols+j]
.addMouseListener(newActionEvent(this.imageLabel,this
.getRows(),this.getCols(),i,j,this.steps,
this.labelStep,this.btnStart,this.ct));
}
this.imageLabel[this.total-1].setIcon(null);
}
2单击“选择图片”按钮响应代码:
JFileChooserfileChoser=newJFileChooser();
//弹出选择文件对话框
fileChoser.setFileSelectionMode(JFileChooser.FILES_ONLY);
intresult=fileChoser.showOpenDialog(null);
if(result==JFileChooser.OPEN_DIALOG){
this.paht=fileChoser.getSelectedFile().getAbsolutePath();
//获取选择文件的路径
this.initLabelScan();
//重新布局面板,更爱图片
this.initLabelImage();
//重新布局小图片浏览面板
3.单击开始按钮代码:
Randomr=newRandom();
//定义随机类变量
intranNum1;
intranNum2;
//循环打乱面板上的图片
for(inti=0;
30;
i++){
ranNum1=r.nextInt(rows*cols-1);
ranNum2=r.nextInt(rows*cols-1);
if(ranNum1==ranNum2){
i--;
continue;
}
ImageIconii=(ImageIcon)this.imageLabel[ranNum1]
.getIcon();
this.imageLabel[ranNum1]
.setIcon((ImageIcon)imageLabel[ranNum2].getIcon());
this.imageLabel[ranNum2].setIcon(ii);
}
this.btnStart.setText("
重来"
);
this.btnChooseImage.setEnabled(false);
this.labelStep.setVisible(true);
this.labelStep.setText("
0"
System.out.println();
//this.ct=newCountTime(this.labelTime);
//ct=newCountTime(this.labelTime);
ct.setTime(0);
ct.setSuccess(false);
Threadt=newThread(ct);
t.start();
4.Resize.java调整图像像素大小的代码:
BufferedImagebufTarget=null;
doublesx=(double)width/srcBufImage.getWidth();
doublesy=(double)height/srcBufImage.getHeight();
inttype=srcBufImage.getType();
if(type==BufferedImage.TYPE_CUSTOM){
ColorModelcm=srcBufImage.getColorModel();
WritableRasterraster=cm.createCompatibleWritableRaster(width,
height);
booleanalphaPremultiplied=cm.isAlphaPremultiplied();
bufTarget=newBufferedImage(cm,raster,alphaPremultiplied,null);
}else
bufTarget=newBufferedImage(width,height,type);
Graphics2Dg=bufTarget.createGraphics();
g.setRenderingHint(RenderingHints.KEY_RENDERING,
RenderingHints.VALUE_RENDER_QUALITY);
g.drawRenderedImage(srcBufImage,AffineTransform.getScaleInstance(sx,sy));
g.dispose();
5.切割图片部分代码:
BufferedImagebufferedImg2=ImageIO
.read(newFileInputStream(path));
//加载图片
BufferedImagebufferedImg=Resize.rize(bufferedImg2,400,300);
width=bufferedImg.getWidth()/cols;
height=bufferedImg.getHeight()/rows;
for(inti=0;
rows;
for(intj=0;
cols;
//将切割的图片存放到容器中
imageList.add(bufferedImg.getSubimage(width*j,
height*i,width,height));
七、小结
差不多做完了这个实验,才感觉到这个游戏其实还挺有意思的,以前一直在网上玩游戏,从没想过自己来把这个游戏给做出来,现在回过头来,真的感觉很不一样,从中学到不少东西。
玩游戏时感觉很简单,只要鼠标点点,开始,移动即可,在做的时候却遇到了不少的问题,比如把一个很大的图片加载到面板上,又如何将它的大小进行转化,以及后面如何将转化后图片进行切割,再到后面,如何点击图片时发生移动,怎么移动,最终判断游戏胜利,一路走来,感觉经历了一番,现在回过头来想想其实挺简单的,也感觉到一点成就感。
这学期也快结束了,java的基础学习也意味着将暂告一段落,但我知道java的博大之处,还有很多比如j2ee,所以还有很多知识等着我们去学。