课程设计任务书
成绩评定表
目录
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) { ArrayList 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 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 { 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 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) {