文档库 最新最全的文档下载
当前位置:文档库 › 【完美升级版】基于Java的动物换位游戏软件设计毕业论文

【完美升级版】基于Java的动物换位游戏软件设计毕业论文

课程设计任务书

成绩评定表

目录

1 课设软件主要功能 (1)

2 类总体设计 (2)

2.1 类组合关系图 (2)

2.2 主类 (2)

2.3 其他类 (2)

3 类详细设计 (3)

3.1 CHANGEANIMALWINDOW类 (3)

3.2 ANIMAL类 (5)

3.3 POINT类 (7)

3.4 STONE类 (8)

3.5 HANDLEMOUSE类 (9)

3.6 AUTOMOVEANIMAL类 (10)

4 关键类成员函数流程图及代码 (13)

5 软件运行结果 (35)

结论 (37)

参考文献 (37)

动物换位系统的设计

1 课设软件主要功能

程序分为不同的级别,左右各有动物,中间石头没有动物,将左右动物交换,不可后退。用鼠标单击一个动物,如果该动物前方的石头上没有动物,该动物就跳跃到该石头上,如果该动物前方的石头上有动物,但隔位上的石头没有动物,该动物就越过自己前面的动物跃到石头上,其他情形时,该动物不能跳跃。不能持续玩的可以点自动演示,将自动完成游戏,可以帮助游戏者更好的了解系统的主体功能。

设计GUI界面的动物换位游戏,游戏的结果是让左右两组动物交换位置。具体内容如下:

1) 程序分为4个级别,用户可以通过界面上提供的菜单选择“初级”、“中级”、“高级”、“自定义”

这4个级别。对于“初级”级别,在水平排列的7块石头上的左右各有3个类型相同的动物,中间的石头上没有动物;对于“中级”级别,在水平排列的9块石头上的左右各有4个类型相同的动物,中间的石头上没有动物;对于“高级”级别,在水平排列的11块石头上的左右各有5个类型相同的动物,中间的石头上没有动物;对于“自定义”级别,用户可以输入自己想设置的一个动物数量(输入的数必须是偶数),在水平排列的N块石头上的左右各有(N-1)2个类型相同的动物,中间的石头上没有动物。

2)用鼠标单击一个的动物,如果该动物前方的石头上没有动物,该动物就跳跃到该石头上,如果该动物前方的石头上有动物,但隔位上的石头没有动物,该动物就越过自己前面的动物跃到石头上,其他情形时,该动物不能跳跃(跳跃时不能超过2块石头)。

3)左面的动物只能向右方跳跃,右面的动物只能向左方跳跃。

4)用户可以通过单击界面上提供的按钮,让程序自动完成动物换位。

5)可以随时单击界面上提供的按钮,重新开始当前的级别。

6)用户可以通过菜单选项,可以选择左、右动物的图像。

2 类总体设计

2.1类组合关系图

2.2主类

ChangeAnimalWindow.java(主类)

ChangeAnimalWindow类负责创建动物换位的主窗口,该类含有main方法,程序从该类开始执行。

2.3其他类

2.3.1 Animal

Animal类是JPanel的一个子类,创建的对象是ChangeAnimalWindow类的重要成员之一,用来表示“动物”。

2.3.2 Point

Point类负责创建确定位置的对象,使用Point对象,可以确定Animal以及Stone对象在窗体中的位置。

2.3.3 Stone

Stone类是JButton的一个子类,创建的对象表示“石头”。

2.3.4 HandleMouse

HandleMouse类所创建的对象负责处理鼠标事件。

2.3.5 AutoMoveAnimal

AutoMoveAnimal类所创建的对象使用算法完成动物的自动换位。

3类详细设计

3.1 ChangeAnimalWindow类

1.效果图

ChangeAnimalWindow创建的窗口效果如图所示:

图3-1-1动物换位的主窗口

2.UML图

ChangeAnimalWindow类是javax.swing包中的JFrame的一个子类,并实现了ActionListener 接口,标明该类的主要成员变量和方法的UML图如图所示。

以下是UML图中有关数据和方法的详细说明。

图3-1-2 ChangeAnimalWindow类的UML图

3.以下是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。

(String)方法是程序运行的入口方法。

3.2 Animal类

1.效果图

Animal创建的对象效果图如图所示:

图3-2-1动物的效果图

2.UML图

Animal类是javax.swing包中JPanel容器的一个子类,创建的对象是数组animal的单元中的对象。Animal型数组animal是ChangeAnimalWindow窗口的重要成员之一。标明Animal类的主要成员变量和方法以及和ChangeAnimalWindow类之间组合关系的UML图,如图所示。

图3-2-2 Animal类的UML图

以下是UML图中有关数据和方法的详细说明。

1)成员变量

●point是Point型对象,用来确定Animal对象在窗口中的位置。

●isLeft是boolean型数据,用来确定Animal对象是否为“左”。

●tool是Toolkit对象,用来获得Image对象。

●leftImage和rightImage是File类型的对象,用来确定Animal对象上绘制的图像文件。2)方法

●Animal()是构造方法,负责完成Animal对象的初始化。

●Animal对象调用setLeftImage(File)方法可以设置leftImage文件对象。

●Animal对象调用setRightImage(File)方法可以设置rightImage文件对象。

●Animal对象调用setIsLeft(boolean)设置自己是否为“左”的动物,即设置isLeft属性的

值。

●Animal对象调用getIsLeft()方法判断自己是否为“左”的动物,即返回isLeft属性的值。

●Animal对象调用setAtPoint(Point)方法设置自己所在的“点”,即设置属性point的对象

引用。

●Animal对象调用getAtPoint()返回自己所在的“点”,即返回point对象的引用。

Animal对象调用paintComponent(Graphics)方法绘制图像,即绘制tool对象根据leftImage 或rightImage文件所创建的Image对象。

3.3 Point类

1.效果图

Point创建的对象,负责刻画Animal对象和Stone对象所在的位置,无可显示的效果图。

2.UML图

Point创建的对象含有两个重要int型数据,分别用来表示窗体坐标系中的x轴坐标和y轴坐标值,窗体坐标系的原点是窗体的左上角,向右是x轴的正向,向下是y轴的正向。Point类创建的对象是数组point的单元中的对象。Point型数组point是ChangeAnimalWindow窗口的重要成员之一,其单元中的Point对象用来确定Animal对象和Stone对象在窗体中的位置。标明Point类的主要成员变量和方法以及和ChangeAnimalWindow类之间的组合关系的UML图,如图所示。

图3-3-2 Point类的UML图

以下是UML图中有关数据和方法的详细说明。

1) 成员变量

●x和y是Point对象中的两个int型数据,分别用来表示窗体坐标系中的x轴和y轴坐标值。

● boo)方法可以根据参数boo的值设置当前Point对象上是否有Animal对象。

●Point对象getX()和getY()方法可以返回其中的x轴坐标和y轴坐标。

●Point对象调用equals(TowerPoint p)方法可以判断当前Point对象是否和参数p指定的Point

对象相同。

●Point对象调用setThisAnimal(Animal animal)方法,指定参数animal在当前Point对象

上。

●Point对象调用getThisAnimal()方法可以返回当前Point对象上的Animal对象。

●Point对象调用setThisStone(Stone stone)方法,指定参数stone在当前Point对象上。

●Point对象调用getThisStone()方法可以返回当前Point对象上的Stone对象。

3.4 Stone类

1.效果图

Stone创建的对象效果如图所示:

图3-4-1 Stone类的效果图

2.UML图

Stone类是javax.swing包中JButton按钮组件的一个子类,创建的对象是数组stone的单元中的对象。Stone型数组stone是ChangeAnimalWindow窗口的重要成员之一。标明Stone类主要成员变量和方法以及和ChangeAnimalWindow类之间的组合关系的UML图,如图所示:

图3-4-2 Stone类的UML图

以下是UML图中有关数据和方法的详细说明。

1)成员变量

iconStone用来确定Stone对象上的图标。

2)方法

Stone()是构造方法,用来创建Stone对象。

3.5 HandleMouse类

1.效果图

HandleMouse创建的对象效果如图所示:

图3-5-1 HandleMouse创建的对象

2.UML图

HandleMouse类是javax.swing包中JPanel容器的一个子类,同时实现了MouseListener和ActionListener接口,创建的对象handleMouse是ChangeAnimalWindow类的成员之一,负责监视animal数组中的Animal对象上的鼠标事件。当用户用鼠标单击Animal对象时,)设置是否启动计时器。

renew,quit,autoButton=null;

JMenuBar bar;

JMenu menuGrade,menuImage,menuHelp,menuHero;

JMenuItem oneGradeResult,twoGradeResult,threeGradeResult,customGradeResult;

JMenuItem oneGradeItem,twoGradeItem,threeGradeItem,limitTime;

JMenuItem custom;

JMenuItem ("重新开始");

renew.addActionListener(this);

autoButton=new JButton("自动演示");

autoButton.addActionListener(this);

quit=new JButton("撤消");

quit.addActionListener(this);

JPanel north=new JPanel();

north.add(renew);

north.add(quit);

north.add(autoButton);

String mess="互换左右动物位置";

JLabel (JFrame.EXIT_ON_CLOSE);

if(!fileOneGrade.exists()){

try { fileOneGrade.createNewFile();

}

catch(IOException exp){}

}

if(!fileTwoGrade.exists()){

try { fileTwoGrade.createNewFile();

}

catch(IOException exp){}

}

if(!fileThreeGrade.exists()){

try { fileThreeGrade.createNewFile();

}

catch(IOException exp){}

}

if(!filecustomGrade.exists()){

try { filecustomGrade.createNewFile();

}

catch(IOException exp){}

}

(point[i].getX()-w2,point[i].getY());

point[i].setThisStone(stone[i]);

}

for(int i=0;i

{

animal[i].setSize(distance*67,distance*34);

int w=animal[i].getBounds().width;

int

(point[i].getX()-w2,point[i].getY()-(point[i+1].getX()-w2,point[i+1].getY()- btnOk;

btnOk=new JButton("确定");

pane.setOptions(new JButton[]{btnOk});

btnOk.addActionListener(new ActionListener()

{

public void actionPerformed(ActionEvent e)

{

dlghelpList.dispose();

}

});

dlghelpList.setVisible(true);

}

else if(e.getSource()==renew)

{

removeAnimalAndStone();

needDoing();

}

else if(e.getSource()==autoButton)

{

removeAnimalAndStone();

needDoing();

(x,y);

autoMoveAnimal.setSize(this.getBounds().width2,120);

autoMoveAnimal.setVisible(true);

}

else if(e.getSource()==quit)

{

ArrayListstep=(point[start].getX()-w2,point[start].getY()-"+"你太慢了!好逊啊!!!");

leftImageFile=new File("pigone.jpg");

rightImageFile=new File("pigtwo.jpg");

for(int i=0;i

{

if(animal[i].getIsLeft()==true)

animal[i].setLeftImage(leftImageFile);

else

animal[i].setRightImage(rightImageFile);

animal[i].repaint();

}

}

}

validate();

}

public static void main(String args[])

{

new ChangeAnimalWindow();

}

}

2.Animal.java

import javax.swing.*;

import java.awt.*;

import java.io.*;

public class Animal extends JPanel {

Point point;

boolean isLeft;

Toolkit tool;

File leftImage,rightImage;

Animal()

{

tool=getToolkit();

}

public void setLeftImage(File f) {

leftImage=f;

}

public void setRightImage(File f) {

rightImage=f;

}

public void setIsLeft(boolean boo) {

isLeft=boo;

}

public boolean getIsLeft()

{

return isLeft;

}

public void setAtPoint(Point p)

{

point=p;

}

public Point getAtPoint()

{

return point;

}

public void paintComponent(Graphics g) {

super.paintComponent(g);

int w=getBounds().width;

int exp){}

}

}

3.Point.java

public class Point

{

int x,y;

boolean isHaveAnimal()

{

return boo)

{

x;

}

public int getY()

{

return y;

}

public boolean equals(Point p)

{

if(p.getX()==this.getX()&&p.getY()==this.getY()) return true;

else

return false;

}

public void setThisAnimal(Animal animal)

{

this.animal=animal;

}

public Animal getThisAnimal()

{

return animal;

}

public void setThisStone(Stone stone)

{

this.stone=stone;

}

public Stone getThisStone()

{

return stone;

}

}

4.Stone.java

import javax.swing.*;

import java.awt.*;

public class Stone extends JButton

{

Icon iconStone;

Stone()

{

iconStone=new ImageIcon("stone.jpg");

setIcon(iconStone);

}

}

5.HandleMouse.java

import java.awt.event.*;

import java.awt.*;

import java.util.*;

import javax.swing.*;

import java.io.*;

import https://www.wendangku.net/doc/b43377634.html,.*;

import java.applet.*;

public class HandleMouse extends JPanel implements MouseListener,ActionListener {

Point [] point;

ArrayList step;

int spendTime=0;

javax.swing.Timer recordTime;

boolean success=false,countTime=false;

JTextField showTime;

File musicFile;

AudioClip clip;

File leftImageFile,rightImageFile,gradeFile;

Animal [] animal;

Record record;

HandleMouse()

{

try

{

step=new ArrayList();

recordTime=new javax.swing.Timer(1000,this);

record=new Record();

musicFile =new File("chimes.wav");

URI uri=musicFile.toURI();

URL url = uri.toURL();

showTime=new JTextField(26);

showTime.setEditable(false);

showTime.setHorizontalAlignment(JTextField.CENTER);

showTime.setFont(new Font("楷体_GB2312",Font.BOLD,18));

add(new JLabel("负责处理鼠标事件,并显示您的用时:",JLabel.CENTER));

add(showTime);

setBackground(Color.cyan);

clip=Applet.newAudioClip(url);

}

catch(Exception e)

{

e.printStackTrace();

}

}

public void setPoint(Point [] point)

{

this.point=point;

}

public void initStep()

{

step.clear();

}

public void initSpendTime()

{

spendTime=0;

showTime.setText(null);

recordTime.stop();

}

public ArrayList getStep()

{

return step;

}

public void setCountTime(boolean b)

{

countTime=b;

}

public void mousePressed(MouseEvent e)

{

if(countTime)

{

recordTime.start();

clip.play();

}

else

showTime.setText("不给您计时");

Animal animal=null;

animal=(Animal)e.getSource();

int w=animal.getBounds().width;

int

(point[m+1].getX()-w2,point[m+1].getY()-(point[m+2].getX()-w2,point[m+2].getY()-(poin t[m-1].getX()-w2,point[m-1].getY()-(point[m-2].getX()-w2,point[m-2].getY()- isSuccess()

{

boolean boo=true;

int i=0;

for(i=0;i

{

if(point[i].getThisAnimal().getIsLeft()==true

||point[i+point.length2+1].getThisAnimal().getIsLeft()==false)

{

boo=false;

break;

}

}

return boo;

}

public void mouseReleased(MouseEvent e)

{

if(isSuccess()==true)

{

recordTime.stop();

record.setTime(spendTime);

record.setGradeFile(gradeFile);

record.setVisible(true);

}

}

public void mouseEntered(MouseEvent e){}

public void mouseExited(MouseEvent e){}

public void mouseClicked(MouseEvent e){}

}

6.AutoMoveAnimal.java

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import java.util.ArrayList;

public class AutoMoveAnimal extends JDialog implements ActionListener {

Point [] point;

ArrayList step;

JButton bStart,bStop,bContinue,bClose;

javax.swing.Timer time;

int i,M,middle,startPoint,m=0;

int [] a;

AutoMoveAnimal()

{

step=new ArrayList();

setModal(true);

setTitle("演示动物换位");

time=new javax.swing.Timer(1000,this);

time.setInitialDelay(10);

bStart=new JButton("演示");

bStop=new JButton("暂停");

bStop.setEnabled(false);

bContinue=new JButton("继续");

bContinue.setEnabled(false);

bClose=new JButton("关闭");

bStart.addActionListener(this);

bStop.addActionListener(this);

bContinue.addActionListener(this);

bClose.addActionListener(this);

setLayout(new FlowLayout());

add(bStart);

add(bStop);

add(bContinue);

add(bClose);

setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);

addWindowListener(new WindowAdapter(){

public void windowClosing(WindowEvent e) {

time.stop();

i=startPoint;

m=0;

bStart.setEnabled(true);

bStop.setEnabled(false);

bContinue.setEnabled(false);

setVisible(false);

}

});

}

public void setPoint(Point [] point)

{

this.point=point;

}

public void actionPerformed(ActionEvent e)

{

相关文档