魔板游戏课程设计报告.docx
《魔板游戏课程设计报告.docx》由会员分享,可在线阅读,更多相关《魔板游戏课程设计报告.docx(23页珍藏版)》请在冰豆网上搜索。
![魔板游戏课程设计报告.docx](https://file1.bdocx.com/fileroot1/2023-1/24/f16e6ae2-3431-42ae-9bfe-d9cf27f1bdb1/f16e6ae2-3431-42ae-9bfe-d9cf27f1bdb11.gif)
魔板游戏课程设计报告
Java与面向对象技术
课程设计报告
(2010--2011年度第1学期)
魔板游戏
专业
计算机科学与应用
学生姓名
蒋晓勇
班级
BM计算机071
学号
0751401127
指导教师
徐静
完成日期
2010年9月14日
魔板游戏
1概述
1.1课程设计目的
利用所学高级语言的语法特性,结合数据结构算法、网络知识、文件处理和数据库等知识完成综合题目的设计和代码实现,并培养锻炼分析程序、撰写报告等能力。
1.2课程设计内容
(1)设计一款经典的智力游戏,魔板游戏。
魔板由3*3或4*4个格子组成。
对于3*3魔板,在前8个格子里随即放置8个编号1-8的方块,最后一个格子是未放置方块的空格子;对于4*4的魔板,在前15格子里随即放置15编号1-15的方块,最后一个格子是未放置方块的空格子。
(2)用鼠标单击任何与空格子水平或垂直相邻的方块可以把该方块移入空格子,而当前方块移动之前所在的格子成为空格子。
通过不断地移动方块可以将方块一行一行地按数字顺序排好,例如,对于3*3格子组成的魔板,要求方块最后排列的顺序如图6.1所示。
(3)魔板游戏也可以使用图像来代替数字。
例如,对于3*3的魔板,将一幅图像分成3*3幅小图像,除去最后一幅小图像(图像的右下角),将其余各幅小图像打乱顺序后放在魔板方块上,最终目标是通过移动方块恢复原始图像(不包括图像的右下角)。
(4)当用户按要求排列好方块后,程序弹出对话框,提示用户成功的消息。
(5)魔板游戏分为两个级别,用户可以通过界面上提供的菜单来选择“初级”或“高级”两个级别。
对于“初级”级别,魔板由3*3个格子组成;对于“高级”级别,魔板由4*4个格子组成。
(6)“魔板游戏”提供一幅默认图像,用户可以使用该图像来玩魔板游戏。
用户也可以使界面提供的菜单选择一幅新图像,然后使用这个新的图像来玩魔板游戏。
2需求分析
2.1设计目标
熟悉Java语言和NetBeansIDE6.8等开发工具。
2.2主体功能
这个程序定义了一些组件,工具栏按钮,文本区和菜单。
魔板游戏程序设计通过PuzzleGame.java、PuzzlePad.java、Point.java、Block.java、HandleImage.java、VerifySuccsee.java和HandleMove.java7个类来实现魔板游戏的整体功能。
2.3开发环境
操作系统:
MicrosoftWindows98/2000/XP
硬件要求:
处理器:
2.6GHzIntelPentiumIV或具有同等性能的处理器
内存:
2GB
硬盘空间:
1GB可用硬盘空间
开发工具:
NetBeansIDE6.8
3概要设计
3.1系统的功能模块划分
在设计魔板游戏时,需要编写7个java源文件:
PuzzleGame.java、PuzzlePad.java、Point.java、Block.java、HandleImage.java、VerifySuccsee.java和HandleMove.java。
魔板游戏除了需要编写的上述7个Java源文件所给出的类外,还需要Java系统提供的一些重要的类,如JMenuItem、JButton和JRadioButton等类。
魔板游戏所用到的一些重要的类以及之间的组合关系如图1.1所示。
图1-1类之间的组合关系
3.1.1PuzzleGame.java类模块
PuzzleGame类负责创建魔板游戏的主窗口,该类含有main方法,程序从该类开始。
PuzzleGame类的成员变量中有4种重要类型的对象:
PuzzlePad、JMenu、JRadioButton和JButton。
PuzzleGame类的主要成员的作用将在后面的详细设计中阐述,PuzzleGame类创建的窗口以及其中的主要成员对象如图6.3所示。
3.1.2PuzzlePad.java类模块
PuzzlePad类创建的对象是PuzzleGame类最重要的成员之一,代表“魔板”。
该类的成员变量中有5种重要类型的对象:
Point、Block、HandleMove、HandleImage和Image。
PuzzlePad类的主要成员的作用将在后面的详细设计中阐述。
3.1.3Block.java类模块
Block类是JTextField的一个子类,创建的对象是PuzzlePad类的重要成员之一,用来表示“魔板”中的“方块”。
3.1.4Point.java类模块
Point类负责创建确定位置的对象,使用Point对象可以确定Block对象在PuzzlePad对象中的位置,即确定“方块”在“魔板”中的位置。
3.1.5HandleImage.java类模块
HandImage类所创建的对象负责处理鼠标事件。
3.1.6HandleMove.java类模块
HandMove类所创建的对象负责处理鼠标事件。
3.1.7VerifySuccess.java类模块
VerifySuccess类所创建的对象负责验证用户是否按要求成功排列魔板中的方块。
3.2系统流程图
图2-1总体功能图
根据对模板游戏的功能分析,设计得到魔板游戏总流程,如图2-2所示:
图2-2总体流程图
4详细设计
本程序实现的游戏分为初级和高级模式,可以在单机选择级别之后进行选择级别模式。
初级的话共分为9格魔板一个为空,8个魔板上下左右自由移动,直至排列完成。
该游戏初始默认为数字玩法,不过在单击图像玩法之后可以进行图像的选择也可选择默认图像(dog.jpg)单击开始,如果图像不能立刻显示,那么再单击一次就会出现图像魔板了。
如图3.1所示:
图3-1初级的图像玩法图
如果想要选择了一幅新的图像,只要单击选择图像中的选择一幅新图像就可出现如下界面,如图3.3:
图3-2图像选择界面
在选择了新图像之后单击开始按钮,就会有一张新的图片替换了刚刚所使用的默认图像了。
此时如果再选择高级的模式图像就会被分成16快随即小魔板,如图3.4所示:
图3-3高级的图像玩法图
由上图的底部可以看出还有一个计时器功能,当你开始移动魔板是它就开始计时直至完成魔板的正确排列。
5测试
5.1测试方案
我以最简单的方案初级的数字玩法进行了测试如图4.1:
图4-1测试方案图
5.2测试结果
点击开始后,经过了109秒的努力,我终于把魔板游戏给测试完成了。
我亲自验证了这神奇的一刻,如图4.2:
图4-2测试结果图
这就是魔板游戏完成后的界面,系统会提示你成功了!
以表示祝贺,并且底部还会有你完成本次游戏所用的时间。
6小结
上学期我们专业课开设了Java语言,初步了解java语言的特点及相关知识,虽然之学了很短一段时间,但还是在其中学到很多东西的。
这学期老师通知要做java课程设计之后,我就到图书馆查阅资料,借相关的书籍,在网上查找了一些资料开始了我的课程设计之旅。
在制作过程中,遇到了自己从所未有的困难,由于java学的不是那么透彻,因此在分析程序代码必然会遇到很大的困扰。
其中遇到了一个问题,就是使用图像玩法的时候选择图片选不到,一开始不知道是什么问题但是通过翻阅书籍,上网查阅资料,同学之间的相互讨论,原来是格式不对,它只能选择一些小规模的图片如dog.jpg等格式而电脑的图片都是JPEG格式,了解这点之后这些问题也就迎刃而解了。
但重要的这不是最困难的地方,难得地方在运行程序上面,当把代码输入完之后,无法运行,经受着“百般折磨”后,各种思考,才把这部分解决了,确实很不容易,还得归功于同学的团结。
这次的课程设计为我提供了一次锻炼的机会,经过开发这个系统,这不仅仅是一次课程设计,不仅仅是学会了一门开发语言,更重要的是在学习的过程中,所有的问题要自已去面对,有问题也只有靠自已去解决,在学习和解决这些困难的过程中提高了我学习的能力、解决问题的能力和实际工作的能力,学到了许多书本以外的知识
经历过这次以后,我对前面学过的许多课程有了更为深刻的理解,也是我对这三年所学的东西的一个综合体现。
然而这次设计让我感受颇深,让我真正体会到了在整个过程给我带来的无奈与快乐。
看来学好java这门语言真的要花上很大的努力,而且它的用处太大了。
回想这两周所经历的,自己所收获到的远远超越自己受到的痛苦,我体会了“不经历风雨怎么见彩虹”的真正内涵,这次课程设计让我学到了更多东西,我会更加努力的去学习java语言以及其他语言,更加充实自己的大脑,使自己更加丰富,将来成为一个有用的人,为社会作贡献的人。
参考文献
[1]耿祥义,张跃平. Java2实用教程(第三版)[M].北京:
清华大学出版社,2006
[2]耿祥义. Java课程设计(第三版)[M].北京:
清华大学出版社,2004
[3]张跃平.Java2实用教程实验指导与习题解答(第三版)[M].北京:
清华大学出版社,2004
……
附录
附录1源程序清单
附录1.1PuzzleGame模块源程序
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.*;
importjava.io.*;
importjavax.swing.filechooser.*;
publicclassPuzzleGameextendsJFrameimplementsActionListener{
PuzzlePadpuzzlePad;
JMenuBarbar;
JMenugradeMenu,choiceImage;
JMenuItemoneGrade,twoGrade,newImage,defaultImage;
JRadioButtondigitPlay,imagePlay;
ButtonGroupgroup=null;
JButtonstartButton;
Imageimage;
Toolkittool;
/**CreatesnewformPuzzleGame*/
publicPuzzleGame(){
tool=getToolkit();
bar=newJMenuBar();
gradeMenu=newJMenu("选择级别");
choiceImage=newJMenu("选择图像");
oneGrade=newJMenuItem("初级");
twoGrade=newJMenuItem("高级");
newImage=newJMenuItem("选择一幅新图像");
defaultImage=newJMenuItem("使用默认图像");
gradeMenu.add(oneGrade);
gradeMenu.add(twoGrade);
choiceImage.add(newImage);
choiceImage.add(defaultImage);
bar.add(gradeMenu);
bar.add(choiceImage);
setJMenuBar(bar);
oneGrade.addActionListener(this);
twoGrade.addActionListener(this);
newImage.addActionListener(this);
defaultImage.addActionListener(this);
startButton=newJButton("开始");
startButton.addActionListener(this);
group=newButtonGroup();
digitPlay=newJRadioButton("数字玩法",true);
imagePlay=newJRadioButton("图像玩法",false);
group.add(digitPlay);
group.add(imagePlay);
puzzlePad=newPuzzlePad();
puzzlePad.setGrade
(1);
puzzlePad.setIsDigitPlay();
add(puzzlePad,BorderLayout.CENTER);
JPanelpNorth=newJPanel();
pNorth.add(digitPlay);
pNorth.add(imagePlay);
pNorth.add(startButton);
pNorth.add(newJLabel("如果图像不能立刻显示,请再单击一次按钮"));
add(pNorth,BorderLayout.NORTH);
add(puzzlePad.getHandleMove(),BorderLayout.SOUTH);
validate();
setVisible(true);
setBounds(100,50,550,380);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
try{
image=tool.createImage(newFile("dog.jpg").toURI().toURL());
puzzlePad.setImage(image);
}
catch(Exceptionexp){}
}
publicvoidactionPerformed(ActionEvente){
if(e.getSource()==startButton){
if(digitPlay.isSelected()){
puzzlePad.setIsDigitPlay();
}
elseif(imagePlay.isSelected()){
puzzlePad.setImage(image);
puzzlePad.setIsImagePlay();
}
}
elseif(e.getSource()==oneGrade){
puzzlePad.setGrade
(1);
}
elseif(e.getSource()==twoGrade){
puzzlePad.setGrade
(2);
}
elseif(e.getSource()==newImage){
FileNameExtensionFilterfilter=newFileNameExtensionFilter("JPG&GIFImage","jpg","gif");
JFileChooserchooser=newJFileChooser();
chooser.setFileFilter(filter);
intstate=chooser.showOpenDialog(null);
Filefile=chooser.getSelectedFile();
if(file!
=null&&state==JFileChooser.APPROVE_OPTION){
try{
image=tool.createImage(file.toURI().toURL());
puzzlePad.setImage(image);
}
catch(Exceptionexp){}
}
}
elseif(e.getSource()==defaultImage){
try{
image=tool.createImage(newFile("dog.jpg").toURI().toURL());
puzzlePad.setImage(image);
}
catch(Exceptionexp){}
}
}
//
privatevoidinitComponents(){
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
javax.swing.GroupLayoutlayout=newjavax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0,400,Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0,300,Short.MAX_VALUE)
);
pack();
}//
publicstaticvoidmain(Stringargs[]){
newPuzzleGame();
}
附录1.2PuzzlePad模块源程序
importjavax.swing.*;
importjava.io.*;
importjava.util.*;
importjava.awt.*;
publicclassPuzzlePadextendsJPanel{
Point[][]point;
Block[][]block;
intdistance=56,grade,m=3,n=3;
HandleMovehandleMove;
HandleImagehandleImage;
VerifySuccessverifySuccess;
Imageimage;
booleanisDigitPlay;
publicPuzzlePad(){
setBackground(Color.gray);
setLayout(null);
handleMove=newHandleMove();
handleMove.initSpendTime();
handleImage=newHandleImage();
verifySuccess=newVerifySuccess();
handleMove.setVerifySuccess(verifySuccess);
}
publicHandleMovegetHandleMove(){
returnhandleMove;
}
publicvoidsetImage(Imageimage){
this.image=image;
}
publicvoidsetGrade(intgrade){
this.grade=grade;
if(grade==1){
m=3;
n=3;
}
elseif(grade==2){
m=4;
n=4;
}
}
publicintgetGrade(){
returngrade;
}
privatevoidneedInit(){
handleMove.initSpendTime();
removeAll();
point=newPoint[m][n];
block=newBlock[m][n];
intHspace=distance,Vspace=distance;
for(inti=0;ifor(intj=0;jpoint[i][j]=newPoint(Hspace,Vspace);
Hspace=Hspace+distance;
}
Hspace=distance;
Vspace=Vspace+distance;
}
handleMove.setPoint(point);
verifySuccess.setPoint(point);
handleMove.setVerifySuccess(verifySuccess);
intk=0;
for(inti=0;iif(ifor(intj=0;jblock[i][j]=newBlock();
block[i][j].addMouseListener(handleMove);
k++;
}
else
for(intj=0;jblock[i][j]=newBlock();
block[i][j].addMouseListener(handleMove);
k++;
}
}
for(inti=0;iif(ifor(intj=0;jadd(block[i][j]);
block[i][j].setSize(distance,distance);
block[i][j].setLocation(point[i][j].getX(),point[i][j].getY());
block[i][j].setAtPoint(point[i][j]);
point[i][j].setBlock(block[i][j]);
point[i][j].setHaveBlock(true);
}
else
for(intj=0;jadd(block[i][j]);
block[i][j].setSize(distance,distance);
block[i][j].setLocation(point[i][j].getX(),point[i][j].getY());
block[i][j].setAtPoint(point[i][j]);
point[i][j].setBlock(block[i][j]);
point[i][j].setHaveBlock(true);
}
}
}
publicvoidsetIsDigitPlay(){
needInit();
isDigitPlay=true;
ArrayListnumberList=newArrayList();
for(intk=0;knumberList.add(k+1);
}
Object[]object=numberList