基于Java的动物换位游戏软件设计.docx
《基于Java的动物换位游戏软件设计.docx》由会员分享,可在线阅读,更多相关《基于Java的动物换位游戏软件设计.docx(29页珍藏版)》请在冰豆网上搜索。
基于Java的动物换位游戏软件设计
目录
1.软件主要功能2
2.类总体设计2
2.1类组合关系图2
2.2系统流程图3
2.3主类4
2.4其他类4
2.4.1Animal.java4
2.4.2Point.java4
2.4.3Stone.java4
2.4.4HandleMouse.java4
2.4.5AutoMoveAnimal.java4
2.4.6Customdlg.java4
2.4.7People.java4
2.4.8Record.java4
2.4.9ShowRecordDialog.java4
3.类详细设计4
3.1主类4
3.2其他类6
4.关键成员函数代码7
5.软件运行结果15
结论16
参考文献16
1.软件主要功能
采用java技术设计动物换位游戏软件,设计要求如下:
(1)程序分为3个级别,用户可以通过界面上提供的菜单来选择“初级”、“中级”和“高级”这三个级别。
对于“初级”级别,在水平排列的7块石头上的左右各有3个类型相同的动物,中间的石头上没有动物;对于“中级”级别,在水平排列的9块石头上的左右各有4个类型相同的动物,中间的石头上没有动物;对于“高级”级别,在水平排列的11块石头上的左右各有5个类型相同的动物,中间的石头上没有动物。
(2)用鼠标单击一个动物,如果该动物的前方的石头上没有动物,该动物就跳跃到该石头上,如果该动物前方的石头上有其他的动物,但隔位上的石头没有动物,该动物就越过自己前面的动物跳跃到石头上,其他情形时,该动物不跳跃(跳跃时不能超过2块石头)。
(3)左面的动物只能向右方跳跃,右面的动物只能向左方跳跃。
(4)用户可以通过单击界面上提供的按钮,让程序自动完成动物换位。
(5)可以随时单击界面上提供的按钮,重新开始当前的级别。
(6)用户通过菜单选项,可以选择左、右动物的图像。
2.类总体设计
2.1类组合关系图
在设计动物换位时需要编写10个Java源文件:
ChangeAnimalWindow.java、Animal.java、Point.java、Stone.java、HandleMouse.java、AutoMoveAnimal.java、Customdlg.java、People.java、Record.java和ShowRecordDialog.java。
动物换位除了需要编写上述10个Java源文件所给出的类外,还需要Java系统提供的一些重要的类,如:
JmenuItem、File和Jbutton类等。
动物换位所用到的一些重要的类以及之间组合关系如图2.1所示。
图2.1类之间的组合关系
2.2系统流程图
图2.2系统流程图
2.3主类
ChangeAnimalWindow类负责创建动物换位的主窗口,该类含有main方法,程序从该类开始执行。
2.4其他类
2.4.1Animal.java
Animal类是JPanel的一个子类,创建的对象是ChangeAnimalWindow类的重要成员之一,用来表示“动物”。
2.4.2Point.java
Point类负责创建确定位置的对象,使用Point对象,可以确定Animal以及Stone对象在窗体中的位置。
2.4.3Stone.java
Stone类是JButton的一个子类,创建的对象表示“石头”。
2.4.4HandleMouse.java
HandleMouse类所创建的对象负责处理鼠标事件。
2.4.5AutoMoveAnimal.java
AutoMoveAnimal类所创建的对象使用算法完成动物的自动换位。
2.4.6Customdlg.java
Customdlg类所创建的对象用来设置“自定义”级别的动物数量。
2.4.7People.java
People对象封装用户的名字和成绩,以便ShowRecordDialog对象可以排序。
2.4.8Record.java
Record类是javax.swing包中JDialog对话框的子类,当用户成功完成相应级别的游戏时,Record创建的对象负责保存用户的名字和成绩到相应的级别文件中。
2.4.9ShowRecordDialog.java
ShowRecordDialog类是javax.swing包中JDialog对话框的子类,当用户单击查看相应的级别排行榜时,ShowRecordDialog创建的对象负责显示用户的成绩。
3.类详细设计
3.1主类
图3.1ChangeAnimalWindow类的UML图
(1)成员变量
●amoutOfAnimal是int型数据,默认值是6。
amoutOfAnimal的值用来确定ChangeAnimalWindow窗体中“动物”的数目,即Animal对象的数目。
●distance是int型数据,默认值是80。
distance的值用来确定Point对象之间的距离,进而可以确定Animal之间,Stone之间的距离以及Animal和Stone对象外观的大小。
●animal是Animal型数组,其长度为amoutOfAnimal。
●point是Point型数组,其长度为amoutOfAnimal+1。
●stone是Stone型数组,其长度为amoutOfAnimal+1。
●handleMouse是HandleMouse类创建的鼠标事件监视器,用来监视animal数组中Animal对象触发的鼠标事件。
●autoMoveAnimal是AutoMoveAnimal类创建的对话框。
通过该对话框可以实现程序自动将左右动物交换位置。
●bar是JMenuBar创建的菜单条,用来添加菜单。
bar被放置在窗口的顶部。
●menuGrade是JMenu创建的菜单,其名字为“选择级别”。
menuImage也是JMenu创建的菜单,其名字为“选择动物图像(JPG,GIF)”。
menuHelp也是JMenu创建的菜单,其名字为“帮助”。
menuHero也是JMenu创建的菜单,其名字为“英雄榜”。
menuGrade、menuImage、menuHero和menuHelp被添加到菜单条bar中。
●oneGradeItem、twoGradeItem、threeGradeItem和custom是JMenuItem创建的菜单项,它们的名字依次为“初级”、“中级”、“高级”和“自定义”,这四个菜单项被添加到菜单项menuGrade中。
leftImage、rightImage和defaultImage也是JMenuItem创建的菜单项,其名字依次为“左面动物的图像”、“右面动物的图像”和“左右面动物的默认图像”,这三个菜单项被添加到菜单项menuImage中。
oneGradeResult、twoGradeResult、threeGradeResult、customGradeResult和limitTime也是JMenuItem创建的菜单项,其名字依次为“初级英雄榜”、“中级英雄榜”、“高级英雄榜”、“自定义英雄榜”、“我超时了吗”,这五个菜单项被添加到菜单项menuHero中。
helpcontent和aboutUs是JMenuItem创建的菜单项,它们的名字依次为“游戏规则”、和“关于我们”,这两个菜单项被添加到菜单项menuHelp中。
oneGradeItem、twoGradeItem、threeGradeItem和custom以及leftImage、rightImage和defaultImage等菜单项都将当前窗口注册为自己的ActionEvent事件监视器。
renew、quit和autoButton是JButton创建的按钮对象,名字依次为“重新开始”、“撤销”和“自动演示”。
renew、quit和autoButton都将当前窗口注册为自己的ActionEvent事件监视器。
(2)方法
●ChangeAnimalWindow()是构造方法,负责完成窗口的初始化。
●init()方法负责完成Animal、Stone和Point对象的创建。
●setAmoutOfAnimal(int)方法负责设置动物的个数,即amountOfAnimal的值。
●removeAnimalAndStone()方法负责从窗体中移掉动物和石头,即移掉Animal对象和Stone对象。
●needDoing()方法负责执行一些经常需要重复执行的代码。
●actionPerformed(ActionEvent)方法是ChangeAnimalWindow类实现的ActionListener接口中的方法。
ChangeAnimalWindow创建的窗口是oneGradeItem、twoGradeItem、threeGradeItem、custom、leftImage、rightImage、defaultImage等菜单项和renew、quit、autoButton按钮的ActionEvent事件监视器。
当用户选中某个菜单项或单击按钮时,窗口将执行actionPerformed(ActionEvent)方法进行相应的操作。
如果用户选中oneGradeItem、twoGradeItem、threeGradeItem和custom四个菜单项的某一项时,actionPerformed(ActionEvent)方法所执行的操作就是改变amountOfAnimal的值,并执行needDoing()方法,完成必要的初始化。
如果用户选中leftImage和rightImage菜单项的某一个时,actionPerformed(ActionEvent)方法所执行的操作就是改变leftImageFile和rightImageFile的引用。
当用户单击renew按钮时,actionPerformed(ActionEvent)方法所进行的操作是保持当前的amountOfAnimal的值,并执行needDoing()方法,完成必要的初始化,当用户单击quit按钮时,actionPerformed(ActionEvent)方法所进行的操作是撤销当前“动物”的前一次跳跃。
当用户单击autoButton按钮时,actionPerformed(ActionEvent)方法所进行的操作是弹出autoMoveAnimal对话框,用户可以通过该对话框让程序显示动物换位过程。
main(String)方法是程序运行的入口方法。
3.2其他类
图3.2Animal类的UML图
图3.3Point类的UML图
图3.4Stone类的UML图
图3.5HandleMouse类的UML图
图3.6AutoMoveAnimal类的UML图
4.关键成员函数代码
ChangeAnimalWindow.java(主类)
importjavax.swing.*;
importjava.awt.*;
importjava.awt.event.*;
importjava.util.ArrayList;
importjava.io.*;
importjavax.swing.filechooser.*;
publicclassChangeAnimalWindowextendsJFrameimplementsActionListener
{
intamountOfAnimal=6;
intdistance=80;
Animal[]animal;
Point[]point;
Stone[]stone;
HandleMousehandleMouse;
AutoMoveAnimalautoMoveAnimal;
FileleftImageFile,rightImageFile;
FilefileOneGrade,fileTwoGrade,fileThreeGrade,filecustomGrade;
JButtonrenew,quit,autoButton=null;
JMenuBarbar;
JMenumenuGrade,menuImage,menuHelp,menuHero;
JMenuItemoneGradeResult,twoGradeResult,threeGradeResult,customGradeResult;
JMenuItemoneGradeItem,twoGradeItem,threeGradeItem,limitTime;
JMenuItemcustom;
JMenuItemhelpcontent,aboutUs;
JMenuItemleftIamge,rightIamge,defaultImage;
JPanelpCenter;
ShowRecordDialogshowDiolag=null;
ChangeAnimalWindow()
{
fileOneGrade=newFile("初级英雄排行榜.txt");
fileTwoGrade=newFile("中级英雄排行榜.txt");
fileThreeGrade=newFile("高级英雄排行榜.txt");
filecustomGrade=newFile("自定义英雄排行榜.txt");
pCenter=newJPanel();
pCenter.setBackground(Color.pink);
pCenter.setLayout(null);
handleMouse=newHandleMouse();
autoMoveAnimal=newAutoMoveAnimal();
leftImageFile=newFile("dog.jpg");
rightImageFile=newFile("cat.jpg");
init();
bar=newJMenuBar();
menuGrade=newJMenu("选择级别");
menuImage=newJMenu("选择动物图像(JPG,GIF)");
menuHero=newJMenu("英雄榜");
menuHelp=newJMenu("帮助");
oneGradeItem=newJMenuItem("初级");
twoGradeItem=newJMenuItem("中级");
threeGradeItem=newJMenuItem("高级");
custom=newJMenuItem("自定义");
leftIamge=newJMenuItem("左面动物的图像");
rightIamge=newJMenuItem("右面动物的图像");
defaultImage=newJMenuItem("左右面动物的默认图像");
oneGradeResult=newJMenuItem("初级英雄榜");
twoGradeResult=newJMenuItem("中级英雄榜");
threeGradeResult=newJMenuItem("高级英雄榜");
customGradeResult=newJMenuItem("自定义英雄榜");
limitTime=newJMenuItem("我超时了吗");
helpcontent=newJMenuItem("游戏规则");
aboutUs=newJMenuItem("关于我们");
menuGrade.add(oneGradeItem);
menuGrade.add(twoGradeItem);
menuGrade.add(threeGradeItem);
menuGrade.add(custom);
menuImage.add(leftIamge);
menuImage.add(rightIamge);
menuImage.add(defaultImage);
menuHero.add(oneGradeResult);
menuHero.add(twoGradeResult);
menuHero.add(threeGradeResult);
menuHero.add(customGradeResult);
menuHero.add(limitTime);
menuHelp.add(helpcontent);
menuHelp.add(aboutUs);
bar.add(menuGrade);
bar.add(menuImage);
bar.add(menuHero);
bar.add(menuHelp);
setJMenuBar(bar);
oneGradeItem.addActionListener(this);
twoGradeItem.addActionListener(this);
threeGradeItem.addActionListener(this);
custom.addActionListener(this);
leftIamge.addActionListener(this);
rightIamge.addActionListener(this);
defaultImage.addActionListener(this);
oneGradeResult.addActionListener(this);
twoGradeResult.addActionListener(this);
threeGradeResult.addActionListener(this);
customGradeResult.addActionListener(this);
limitTime.addActionListener(this);
helpcontent.addActionListener(this);
aboutUs.addActionListener(this);
renew=newJButton("重新开始");
renew.addActionListener(this);
autoButton=newJButton("自动演示");
autoButton.addActionListener(this);
quit=newJButton("撤消");
quit.addActionListener(this);
JPanelnorth=newJPanel();
north.add(renew);
north.add(quit);
north.add(autoButton);
Stringmess="互换左右动物位置";
JLabelhintMess=newJLabel(mess,JLabel.CENTER);
north.add(hintMess);
add(north,BorderLayout.NORTH);
add(pCenter,BorderLayout.CENTER);
JPanelsouth=newJPanel();
south.add(handleMouse);
add(south,BorderLayout.SOUTH);
setVisible(true);
setBounds(60,60,710,300);
validate();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
if(!
fileOneGrade.exists()){
try{fileOneGrade.createNewFile();
}
catch(IOExceptionexp){}
}
if(!
fileTwoGrade.exists()){
try{fileTwoGrade.createNewFile();
}
catch(IOExceptionexp){}
}
if(!
fileThreeGrade.exists()){
try{fileThreeGrade.createNewFile();
}
catch(IOExceptionexp){}
}
if(!
filecustomGrade.exists()){
try{filecustomGrade.createNewFile();
}
catch(IOExceptionexp){}
}
handleMouse.gradeFile=fileOneGrade;
showDiolag=newShowRecordDialog();
}
publicvoidinit()
{
animal=newAnimal[amountOfAnimal];
point=newPoint[amountOfAnimal+1];
stone=newStone[amountOfAnimal+1];
intspace=distance;
for(inti=0;i{
point[i]=newPoint(space,100);
space=space+distance;
}
for(inti=0;i{
animal[i]=newAnimal();
animal[i].addMouseListener(handleMouse);
if(i{
animal[i].setIsLeft(true);
}
else//if(i>animal.length/2)
{
animal[i].setIsLeft(false);
}
//elseif(i==animal.length/2+1)
//{
//if(animal[i].equals(animal[i]))
//animal[i].setIsLeft(true);
//else
//animal[i].setIsLeft(false);
//}
}
for(inti=0;i{
stone[i]=newStone();
pCenter.add(stone[i]);
stone[i].setSize(distance*8/9,18);
intw=stone[i].getBounds().width;
inth=stone[i].getBounds().height;
stone[i].setLocation(point[i].getX()-w/2,point[i].getY());
point[i].setThisStone(stone[i]);
}
for(inti=0;i{
animal[i].setSize(distance*6/7,distance*3/4