魔板游戏
Java课程设计
设计(论文)题目:魔板游戏
所在院:信息工程学院专业班级:
学生姓名
学号:
指导教师:
年月日
课程设计(论文)任务书
设计题目:魔板游戏
专业班级:
学号:姓名:
主要内容
设计一个java语言的魔板游戏,主要包含:魔板游戏主窗口模块、游戏魔板模块、魔板中“方块”定位模块。
此游戏运用的是非常直观易操作的图形用户界面,通过对界面上的菜单、子菜单、以及单选按钮进行操作即可使本游戏顺利进行。编辑平台选用Eclipse 。其中用到了图形用户界面、异常处理、类的构成以及继承等java知识点。
基本要求:
能够使所设计的游戏正常的运行,要保证无差错现象。而且使用户更加方便去操作,要有一定的功能来体现java语言的精简性、稳固性、兼容性强等特性。
完成期限: 2013年1月6日
指导教师签名:
评审小组负责人签名:
目录
1 概述 (1)
1.1 课程设计目的 (1)
1.2 课程设计内容 (1)
2 系统需求分析 (1)
2.1 系统目标 (1)
2.2 主体功能 (2)
2.3 开发环境 (2)
3 系统概要设计 (2)
3.1 系统的功能模块划分 (2)
3.2 系统流程图 (5)
4系统详细设计 (6)
5 测试 (7)
5.1 测试方案 (7)
5.2 测试结果 (7)
6 小结 (8)
附录 (9)
附录1 模块清单 (9)
附录1.1 PUZZLEFRAME模块 (9)
附录1.2 PUZZLEPAD模块 (12)
附录1.3 SQUAREPOINT模块 (20)
附录2 ECLIPSE运行源程序清单 (22)
参考文献 (32)
模板游戏的设计
1 概述
1.1 课程设计目的
利用所学高级语言的语法特性,结合数据结构算法、java语言使用规则、java的基本应用等知识完成综合题目的设计和代码实现,并培养锻炼分析程序、撰写报告等能力。
1.2 课程设计内容
(1)设计一款经典的智力游戏,魔板游戏。魔板由3*3或4*4个格子组成。对于3*3魔板,在前8个格子里随即放置8个编号1-8的方块,最后一个格子是未放置方块的空格子;对于4*4的魔板,在前15格子里随即放置15编号1-15的方块,最后一个格子是未放置方块的空格子。
(2)用鼠标单击任何与空格子水平或垂直相邻的方块可以把该方块移入空格子,而当前方块移动之前所在的格子成为空格子。通过不断地移动方块可以将方块一行一行地按数字顺序排好,例如,对于3*3格子组成的魔板,要求方块最后带有顺序排列,最后一格为空格。
(3)魔板游戏也可以使用图像来代替数字。例如,对于4*4的魔板,将一幅图像分成4*4幅小图像,除去最后一幅小图像(图像的右下角),将其余各幅小图像打乱顺序后放在魔板方块上,最终目标是通过移动方块恢复原始图像(不包括图像的右下角)。
2 系统需求分析
2.1 系统目标
设计GUI界面的魔板游戏程序。
2.2 主体功能
这个程序定义了一些组件,工具栏按钮,文本区和菜单。魔板游戏程序设计通过PuzzleFrame.java、PuzzlePad.java、SquarePoint.java 3个类来实现魔板游戏的整体功能。
2.3 开发环境
操作系统:Microsoft Windows 7
开发工具:jdk 、Eclipse
3 系统概要设计
3.1 系统的功能模块划分
在设计魔板游戏时,需要编写3个java源文件:PuzzleFrame.java、PuzzlePad.java、SquarePoint.java。
魔板游戏除了需要编写的上述3个Java源文件所给出的类外,还需要Java系统提供的一些重要的类,如JMenuItem、JButto n和JRadioButton等类。
3.1.1 PuzzleFrame.java类模块
PuzzleFrame类负责创建魔板游戏的主窗口,该类含有main方法,程序从该类开始。PuzzleFrame类的成员变量中有4种重要类型的对象:PuzzlePad、JmenuItem、JRadioButton和JButton。PuzzleFrame 类的主要成员的作用将在后面的详细设计中阐述,PuzzleFrame类主要成员变量(属性)和主要方法如表3-1、3-2所示。
成员变量描述变量类型名称
魔板
开始游戏的按钮选择玩法PuzzlePad
Jbutton
JradioButton
PuzzlePad
开始
数字玩法,图像
玩法
表3-1 PuzzleFrame.ja va主要成员变量(属性)
名称功能备注
PuzzleFrame actionPerformed main
创建程序主窗口
处理ActionEven t事件
程序开始运行的方法
构造方法
接口方法表3-2 PuzzleFrame.java主要方法
3.1.2 PuzzlePad.java类模块
PuzzlePad类创建的对象是PuzzleFrame类最重要的成员之一,代表“魔板”。该类的成员变量中有5种重要类型的对象:Point、Bloc k 和Image。PuzzlePad类主要成员变量(属性)和主要方法如表3-3、3-4所示。
描述变量类型名称
魔板中的行数和列数魔板中方块的宽和高魔板中二维点数组魔板中二维方块数组模板可能用到的图像int
int
SquarePoint[][]
JButton
Image
rows,colums
width,height
point
block
image
表3-3 PuzzlePad.jav a主要成员变量(属性)
名称功能备注
PuzzlePad
随机排列数字随机排列图像paintComponent actionPerformed
创建魔板对象
随机排列魔板中方块上的数字
随机排列魔板中方块上的图像
绘制图像
处理ActionEvent事件
构造方法
接口方法表3-4 PuzzlePad.java主要方法
3.1.3 SquarePoint.java类模块
SquarePoint类负责创建确定位置的对象,使用Point对象可以确定Block对象在PuzzlePad对象中的位置,即确定“方块”在“魔板”中的位置。SquarePoint.java类主要成员变量(属性)和主要方法如表3-5、3-6所示。
描述变量类型名称
判断点上是否有方块点上的方块对象boolean
JButton
有方块
block
表3-5 SquarePoint.java主要成员变量(属性)
名称功能备注
SquarePoint get有方块set有方块setBlock getBlock
创建“点”对象
判断点上是否有方块
设置点上是否有方块
在点上放置方块
获取点上的方块
构造方法表3-6 SquarePoint.java主要方法
3.2 系统流程图
根据对模板游戏的功能分析,设计得到魔板游戏总流程,如图2-2
所示:
开始
魔板游戏开始界面
Switch
改变游戏玩法
选择数字玩法
YES NO
数字玩法图片玩法
确定玩法
退出
结束
图2-2 系统流程图
4系统详细设计
4.1运行效果
1、将三个java文件合并为一个文件PuzzleFrame.class,在eclipse 编译环境下将此源代码输入。运行结果如下:
图 4-1 数字玩法主界面
本程序实现的游戏分为初级和高级模式,可以在单机选择级别之后进行选择级别模式。初级的话共分为9格魔板,一个为空,8个魔板上下左右自由移动,直至排列完成;高级的话分为16格魔板,一个为空,15个魔板上下左右自由移动,直至排列完成。该游戏可分为数字玩法和图像玩法,在单击图像玩法或者数字玩法之后可以
进行相应的玩法选择,选择之后单击开始。如果玩家想重新开始,只需要再次单击开始按钮即可。
5测试
5.1 测试方案
游戏难度级别设置为数字玩法,进行测试。在Eclipse(实验)下测试PuzzleFrame结果如下:
5.2 测试结果
图5-1 测试结果
6 小结
通过本次实训,不但使我对java语言更加熟悉和认识,而且还让我对这门语言产生了更大的兴趣。这是一次实践性的学习,从中让我认识到了自己平时不能意识到的弱点和缺陷,尤其是在java设计的结构和算法上面。这不但是一次课程设计而且还是一次带着学习的实验。
希望自己能够今后能够对实验感兴趣,而且让自己的知识更加完善,更加全备,以应对一年后无论是工作还是实习中的需要。
附录
附录1 模块清单
附录1.1PuzzleFrame模块
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class PuzzleFrame extends JFrame implements ActionListener {
PuzzlePad puzzlePad;
JButton 开始;
JMenuBar bar;
JMenu fileMenu;
JMenuItem 初级,高级;
JRadioButton 数字玩法,图像玩法;
ButtonGroup group=null;
Container con=null;
public PuzzleFrame()
{
bar=new JMenuBar();
fileMenu=new JMenu("魔板游戏");
初级=new JMenuItem("初级");
高级=new JMenuItem("高级");
fileMenu.add(初级);
fileMenu.add(高级);
bar.add(fileMenu);
setJMenuBar(bar);
初级.addActionListener(this);
高级.addActionListener(this);
开始=new JButton("开始玩");
开始.addActionListener(this);
group=new ButtonGroup();
数字玩法=new JRadioButton("数字玩法",true);
图像玩法=new JRadioButton("图像玩法",false);
group.add(数字玩法);
group.add(图像玩法);
puzzlePad=new PuzzlePad(3,3,50,50);
con=getContentPane();
con.add(puzzlePad,BorderLayout.CENTER);
JPanel pNorth=new JPanel();
pNorth.add(数字玩法);
pNorth.add(图像玩法);
pNorth.add(开始);
con.add(pNorth,BorderLayout.NORTH);
con.validate();
addWindowListener(new WindowAdapter()
{ public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
setVisible(true);
setBounds(100,50,440,360);
validate();
}
public void actionPerformed(ActionEvent e)
{ if(e.getSource()==开始)
{
if(数字玩法.isSelected())
{
puzzlePad.随机排列数字();
}
else if(图像玩法.isSelected())
{
puzzlePad.随机排列图像();
}
}
else if(e.getSource()==初级)
{
con.remove(puzzlePad);
puzzlePad=new PuzzlePad(3,3,50,50);
con.add(puzzlePad,BorderLayout.CENTER);
con.validate();
this.validate();
}
else if(e.getSource()==高级)
{
con.remove(puzzlePad);
puzzlePad=new PuzzlePad(4,4,50,50);
con.add(puzzlePad,BorderLayout.CENTER);
con.validate();
this.validate();
}
}
public static void main(String args[])
{
new PuzzleFrame();
}
}
附录1.2 PuzzlePad模块
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import java.util.Vector;
import java.awt.image.*;
public class PuzzlePad extends JPanel implements ActionListener {
int rows ,colums;
int width,height;
SquarePoint point[][];
JButton block[][];
Vector vector;
int leftX=50,leftY=50;
Image image=null;
Toolkit tool=null;
MediaTracker mt;
int 图像的宽,图像的高;
Image blockImage[];
boolean 画图像=true;
public PuzzlePad(int r,int c,int w,int h)
{
setLayout(null);
vector=new Vector();
rows=r;
colums=c;
width=w;
height=h;
tool=getToolkit();
try
{
image=tool.createImage("气球.jpg");
mt.addImage(image,1);
mt.waitForAll();
}
catch(Exception e)
{
}
block=new JButton[rows][colums];
point=new SquarePoint[rows][colums];
for(int i=0;i { for(int j=0;j { if((i==rows-1)&&(j==colums-1)) { } else { block[i][j]=new JButton(); block[i][j].setSize(width,height); block[i][j].addActionListener(this); vector.add(block[i][j]); } } } for(int i=0;i { for(int j=0;j { point[i][j]=new SquarePoint(50+j*width,50+i*height); if((i==rows-1)&&(j==colums-1)) { } else { point[i][j].setBlock(block[i][j],this); } } } } public void actionPerformed(ActionEvent e) { JButton button=(JButton)e.getSource(); int x=button.getBounds().x; int y=button.getBounds().y; int m=0,n=0; for(int i=0;i { for(int j=0;j { if(point[i][j].getX()==x&&point[i][j].getY()==y) { m=i; n=j; } } } int 上=Math.max(0,m-1); int 下=Math.min(rows-1,m+1); int 左=Math.max(0,n-1); int 右=Math.min(colums-1,n+1); if(point[上][n].get有方块()==false) { point[上][n].setBlock(button,this); point[m][n].set有方块(false); } else if(point[下][n].get有方块()==false) { point[下][n].setBlock(button,this); point[m][n].set有方块(false); } else if(point[m][左].get有方块()==false) { point[m][左].setBlock(button,this); point[m][n].set有方块(false); } else if(point[m][右].get有方块()==false) { point[m][右].setBlock(button,this); point[m][n].set有方块(false); } } public void 随机排列数字() { vector.removeAllElements(); for(int i=0;i { for(int j=0;j { if((i==rows-1)&&(j==colums-1)) { } else { vector.add(block[i][j]); } } } int i=1; while(vector.size()>0) { int n=(int)(Math.random()*vector.size()); JButton b=(JButton)vector.elementAt(n); b.setText(""+i); b.setIcon(null); b.setBorder(BorderFactory.createLineBorder(Color.blue,1)); vector.remove(n); i++; } 画图像=false; repaint(); } public void 随机排列图像() { try { 图像的宽=image.getWidth(this); 图像的高=image.getHeight(this); int w=图像的宽/colums; int h=图像的高/rows; blockImage=new Image[rows*colums]; int k=0; PixelGrabber pg=null; ImageProducer ip=null; for(int i=0;i { for(int j=0;j { int pixels[]= new int[w*h];