《JAVA课程设计报告.pdf》由会员分享,可在线阅读,更多相关《JAVA课程设计报告.pdf(20页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Java 程序设计课程设计报告程序设计课程设计报告( 2011 - 2012 年度第年度第 1 学期学期)HannioHannio 塔塔专业专业计算机科学技术(网络工程)计算机科学技术(网络工程)学生姓名学生姓名马千里马千里班级班级B 计算机计算机 102学号学号1010704213指导教师指导教师徐徐 森森完成日期完成日期2012 年年 1 月月 8 日日Hannoi 塔目目录录目录.21 概述.11.1 课程设计目的.11.2 课程设计内容.12 系统需求分析.12.1 系统目标.12.2 主体功能.12.3 开发环境.13 系统概要设计.23.1 系统的功能模块划分.23.2 系统流程图
2、.24 系统详细设计.25 测试.145.1 测试方案.145.2 测试结果.146 小结.16参考文献.17附录1 源程序清单. 18Java 程序设计课程设计报告(2011)1题题目目1概述1.1 课程设计目的随着社会的进步,我们用来娱乐的游戏世界也越来越丰富,越来越复杂。本程序的 Hannoi 塔游戏不但包括了游戏最基本的功能,而且还能培养用户的逻辑思维能力,同时也给玩家提供了一定的娱乐空间。本游戏还包括一个自动演示搬移Hannoi 塔的功能,此功能能够帮助初次接触此游戏的用户了解此游戏的玩法。1.2 课程设计内容设计 HUI 界面的 Hannoi 塔,用户可以通过拖动鼠标移动各个塔上的
3、盘子,程序也可以自动演示盘子的移动过程2 系统需求分析2.1 系统目标可以正常运行程序,并且按照设计目的预想的完成具体功能。2.2 主体功能(1)设计 GUI 界面的 Hannoi 塔。Hannoi 塔中有三个座,名字分别是 A、B 和 C。初始状态 是 A 座上有五个大小不等的盘子,这些盘子从座底到座顶按着大小顺序依次摆放在 A 座上。用户可以用鼠标选中盘子,然后通过拖动鼠标来移动该盘子、释放鼠标来放置该盘子。(2)程序要求用户在移动盘子过程中,不允许把大盘子放在小盘子的上面,用户最终要完成的是把 A 座上的全部盘子移动到 B 座或 C 座上。(3)用户可以通过单击 Hannoi 塔界面上提
4、供的按钮,让程序自动完成把 A 座上的盘子全部移动到 B 座或 C 座上。(4)用户在移动盘子的过程中,可以随时单击 Hannoi 塔界面上提供的按钮,重新开始游戏。2.3 开发环境JDK1.6。Hannoi 塔23 系统概要设计3.1 系统的功能模块划分(1)Tower.java(主类)Tower 类负责创建 Hannoi 塔的主窗口, 该类含有 main 方法, Hannoi 塔从类开始执行。Tower 类的成员变量中有两种重要类型的对象:一个 int 基本型数据和一个char 型数组。两种类型的对象分别是:HannoiTower 和 Button 对象 。(2)HannoiTower.j
5、avaHannoiTower 类是 javax.swing 包中 JPanel 容器的子类,创建的容器被添加到Tower 窗口的中心。HannoiTower 类的成员变量有两种重要类型的对象、一个 int基类型数据和一个 char 型数组。两种类型的对象分别是:Disk、TowerPoint。(3)TowerPoint.javaTowerPoint 类负责在 HannoiTower 中创建表示位置的塔点对象。(4)Disk.javaDisk 类是 Button 的一个子类,创建的对象是 HannoiTower 容器中的一个按钮,用来表示 HannoiTower 中的盘子。3.2 系统流程图4
6、系统详细设计Tower 类类Tower 类是javax.swing 包中 Frame 的一个子类, 标明该类的主要成员变量和方法: 成员变量tower 是 HannoiTower 创建的对象。tower 对象是一个容器,刻画了 Hannoi 塔的结构,该对象被添加到窗口的中心。盘子数目是 int 型数据,它的默认值是 5。盘子数目的值是用来确定 tower 对象中“盘子”的数目。TowerHannoiTowerButtonDiskTowerPointJava 程序设计课程设计报告(2011)3towerName 是 char 型数组,长度为 3,其三个单元的默认取值依次是 A、B 和C。tow
7、erName 数组的单元的值用来确定 tower 中三个塔的名字。renew 和 auto 是 Button 创建的按钮对象,名字依次为“重新开始”和“自动演示搬盘子”,renew 和 auto 都将当前窗口注册为自己的 ActionEvent 事件监视器。 方法Tower()是构造方法,负责完成窗口的初始化。main 方法是 Hannoi 塔程序运行的入口方法。actionPerformed(ActionEvent)方法是HannoiTower类实现的ActionListener 接口中的方法。HannoiTower 创建的窗口是 renew 和 auto 两个按钮的 ActionEvent
8、 事件监视器。当用户单击按钮时,窗口将执行 actionPerformed(ActionEvent)方法进行相应的操作。 当用户单击 renew 按钮时,actionPerformed(ActionEvent)方法所进行的操作是保持当前的盘子数目的值, 并让 tower 对象根据盘子数目的值设置其初始状态。当用户单击 auto 按钮时, actionPerformed(ActionEvent)方法所进行的操作是让 tower对象返回其中的 AutoMoveDisc 对象,该对象是一个对话框,用户可以通过对话框让程序自动地移动“盘子”。代码代码(Tower.java)import javax.s
9、wing.*;import java.awt.*;import java.awt.event.*;public class Tower extends Frame implements ActionListener,RunnableHannoiTower tower=null;Button renew,auto=null;char towerName=A,B,C;int 盘子数目,盘宽,盘高;Thread thread;TextArea 信息条=null;public Tower()thread=new Thread(this);盘子数目=5;盘宽=80;盘高=18;信息条=new TextA
10、rea(12,12);信息条.setText(null);Hannoi 塔4tower=new HannoiTower(盘子数目,盘宽,盘高,towerName,信息条);renew=new Button(重新开始);auto=new Button(自动演示搬盘子);renew.addActionListener(this);auto.addActionListener(this);add(tower,BorderLayout.CENTER);add(renew,BorderLayout.SOUTH);add(auto,BorderLayout.NORTH);add(信息条,BorderLay
11、out.EAST);addWindowListener(new WindowAdapter() public void windowClosing(WindowEvent e) System.exit(0);setVisible(true);setBounds(60,20,670,540);validate();public void actionPerformed(ActionEvent e)if(e.getSource()=renew)if(!(thread.isAlive()this.remove(tower);信息条.setText(null);tower=new HannoiTowe
12、r(盘子数目,盘宽,盘高,towerName,信息条);add(tower,BorderLayout.CENTER);validate();elseif(e.getSource()=auto)if(!(thread.isAlive()thread=new Thread(this);trythread.start(); catch(Exception eee)Java 程序设计课程设计报告(2011)5public void run()this.remove(tower);信息条.setText(null);tower=new HannoiTower(盘子数目,盘宽,盘高,towerName,信
13、息条);add(tower,BorderLayout.CENTER);validate();tower.自动演示搬运盘子(盘子数目,towerName0 ,towerName1,towerName2);public static void main(String args)new Tower(); HannoiTower 类类HannoiTower 类是 javax.swing 包中 JPanel 容器的一个子类,创建的对象 tower是 Tower 窗口的成员之一,被添加到 Tower 窗口的中心位置。 成员变量盘子数目是 int 型数据。盘子数目值用来确定 tower 对象中盘子的数目。盘
14、子是 Disk 型数组,该数组的长度由盘子数目值来确定。Disk 数组的每个单元中存放一个 Disk 对象,依次表明 tower 对象中有怎样多的盘子。towerName 是 char 型数组,长度为 3,其三个单元的默认取值依次是 A、B 和C。Height 的值确定每个盘子的高度。pointA、pointB、pointC 都是 TowerPoint 型数组,三个数组的长度与盘子数目相同,即都是盘子数目。pointA、pointB 和 pointC 的单元都是 TowerPoint 创建对象,分别用来表示 Hannoi 塔中三个座上的塔点。A 座、B 座和 C 座上的三个塔点分别由 poin
15、tA、pointB 和 pointC 中的单元来确定。每个座上的五个塔点都是从座顶到座底依次对应数组的相应单元中的 TowerPoint 对象。 方法HannoiTower(char)是构造方法,负责完成 tower 容器的初始化。tower 容器调用 paintComponent(Graphics)方法绘制出塔点的位置和必要的视图。代码(代码(HannoiTower.java)Hannoi 塔6import javax.swing.*;import java.awt.*;import java.awt.event.*;public class HannoiTower extends JPan
16、el implements MouseListener,MouseMotionListenerTowerPoint point;int x,y;boolean move=false;Disk盘子;int startX,startY;int startI ;int 盘子数目=0;int width,height;char towerName=A,B,C;TextArea 信息条=null;publicHannoiTower(int number,int w,int h,char name,TextArea text)towerName=name;盘子数目=number;width=w;heigh
17、t=h;信息条=text;setLayout(null);addMouseListener(this);addMouseMotionListener(this);盘子= new Disk盘子数目;point=new TowerPoint3*盘子数目;int space=20;for(int i=0;i盘子数目;i+)pointi=new TowerPoint(40+width,100+space,false);space=space+height;space=20;for(int i=盘子数目;i2*盘子数目;i+)pointi=new TowerPoint(160+width,100+spa
18、ce,false);space=space+height;space=20;for(int i=2*盘子数目;i=0;i-)盘子i=new Disk(i,this);盘子i.setSize(tempWidth,height);tempWidth=tempWidth-sub;for(int i=0;i=1)盘子i.set 上方有盘(true);public void paintComponent(Graphics g)super.paintComponent(g);Java 程序设计课程设计报告(2011)7g.drawLine(point0.getX(),point0.getY(),point
19、 盘 子 数 目 -1.getX(),point 盘 子 数 目-1.getY();g.drawLine(point 盘 子 数 目 .getX(),point 盘 子 数 目 .getY(),point2* 盘 子 数 目-1.getX(),point2*盘子数目-1.getY();g.drawLine(point2* 盘 子 数 目 .getX(),point2* 盘 子 数 目 .getY(),point3* 盘 子 数 目-1.getX(),point3*盘子数目-1.getY();g.drawLine(point盘子数目-1.getX()-width,point盘子数目-1.getY
20、(),point3*盘子数目-1.getX()+width,point3*盘子数目-1.getY();int leftx=point盘子数目-1.getX()-width;int lefty=point盘子数目-1.getY();int w=(point3*盘子数目-1.getX()+width)-(point盘子数目-1.getX()-width);int h=height/2;g.setColor(Color.orange);g.fillRect(leftx,lefty,w,h);g.setColor(Color.red);int size=4;for(int i=0;i3*盘子数目;i+
21、)g.fillOval(pointi.getX()-size/2,pointi.getY()-size/2,size,size); g.drawString(+towerName0+ 塔 ,point 盘 子 数 目 -1.getX(),point 盘 子 数 目-1.getY()+30);g.drawString(+towerName1+ 塔 ,point2* 盘 子 数 目 -1.getX(),point 盘 子 数 目-1.getY()+30);g.drawString(+towerName2+ 塔 ,point3* 盘 子 数 目 -1.getX(),point 盘 子 数 目-1.g
22、etY()+30);g.drawString( 将 全 部 盘 子 从 +towerName0+ 塔 搬 运 到 +towerName1+ 塔 或+towerName2+塔,point盘子数目-1.getX(),point盘子数目-1.getY()+80);public void mousePressed(MouseEvent e) Disk盘子=null;Rectangle rect=null;if(e.getSource()=this)move=false;if(move=false)if(e.getSource() instanceof Disk)盘子=(Disk)e.getSource
23、();startX=盘子.getBounds().x;startY=盘子.getBounds().y;rect=盘子.getBounds();for(int i=0;i3*盘子数目;i+)int x=pointi.getX();int y=pointi.getY();if(rect.contains(x,y)startI=i;break;public void mouseMoved(MouseEvent e)public void mouseDragged(MouseEvent e)Disk disk=null;if(e.getSource() instanceof Disk)disk=(Di
24、sk)e.getSource();Hannoi 塔8move=true;e=SwingUtilities.convertMouseEvent(disk,e,this);if(e.getSource()=this)if(move&disk!=null) x=e.getX();y=e.getY();if(disk.get 上方有盘()=false)disk.setLocation(x-disk.getWidth()/2,y-disk.getHeight()/2);public void mouseReleased(MouseEvent e)Disk disk=null;move=false;Rec
25、tangle rect=null;if(e.getSource() instanceof Disk)disk=(Disk)e.getSource();rect=disk.getBounds();e=SwingUtilities.convertMouseEvent(disk,e,this);if(e.getSource()=this)boolean containTowerPoint=false;int x=0,y=0;int endI=0;if(disk!=null)for(int i=0;i=1)pointendI.放置盘子(disk,this);Java 程序设计课程设计报告(2011)9
26、if(startI!=盘子数目-1&startI!=2*盘子数目-1&startI!=3*盘子数目-1)(pointstartI+1.获取盘子().set 上方有盘(false);pointstartI.set 有盘子(false);tempDisk.set 上方有盘(true);elsepointstartI.set 有盘子(false);tempDisk.set 上方有盘(true);else disk.setLocation(startX,startY); elsedisk.setLocation(startX,startY);if(disk!=null&!containTowerPoi
27、nt)disk.setLocation(startX,startY);public void mouseEntered(MouseEvent e)public void mouseExited(MouseEvent e)public void mouseClicked(MouseEvent e)public void 自动演示搬运盘子(int 盘子数,char one,char two,char three) if(盘子数=1) 信息条.append(+one+ 到: +three+塔n);Disk disk=在塔中获取最上面的盘子(one);int startI=在塔中获取最上面盘子的位置(
28、one);int endI=在塔中获取最上面盘子的上方位置(three);if(disk!=null)pointendI.放置盘子(disk,this);pointstartI.set 有盘子(false);try Thread.sleep(1000);catch(Exception ee)else自动演示搬运盘子(盘子数-1,one,three,two);信息条.append(+one+ 到: +three+塔n);Disk disk=在塔中获取最上面的盘子(one);int startI=在塔中获取最上面盘子的位置(one);int endI=在塔中获取最上面盘子的上方位置(three);
29、if(disk!=null) pointendI.放置盘子(disk,this);pointstartI.set 有盘子(false);tryHannoi 塔10 Thread.sleep(1000);catch(Exception ee)自动演示搬运盘子(盘子数-1,two,one,three);public Disk 在塔中获取最上面的盘子(char 塔名)Disk disk=null;if(塔名=towerName0)for(int i=0;i盘子数目;i+)if(pointi.是否有盘子()=true)disk=pointi.获取盘子();break;if(塔名=towerName1)
30、for(int i=盘子数目;i2*盘子数目;i+)if(pointi.是否有盘子()=true)disk=pointi.获取盘子();break;if(塔名=towerName2)for(int i=2*盘子数目;i3*盘子数目;i+)if(pointi.是否有盘子()=true)disk=pointi.获取盘子();break;return disk;public int 在塔中获取最上面盘子的上方位置(char 塔名)int position=0;if(塔名=towerName0)int i=0;for(i=0;i盘子数目;i+)if(pointi.是否有盘子()=true)positi
31、on=Math.max(i-1,0);break;if(i=盘子数目) position=盘子数目-1;if(塔名=towerName1)int i=0;for(i=盘子数目;i2*盘子数目;i+)if(pointi.是否有盘子()=true)position=Math.max(i-1,0);break;Java 程序设计课程设计报告(2011)11if(i=2*盘子数目)position=2*盘子数目-1; if(塔名=towerName2)int i=0;for(i=2*盘子数目;i3*盘子数目;i+)if(pointi.是否有盘子()=true)position=Math.max(i-1
32、,0);break;if(i=3*盘子数目) position=3*盘子数目-1; return position;public int 在塔中获取最上面盘子的位置(char 塔名) int position=0;if(塔名=towerName0)int i=0;for(i=0;i盘子数目;i+)if(pointi.是否有盘子()=true)position=i;break;if(i=盘子数目) position=盘子数目-1; if(塔名=towerName1)int i=0;for(i=盘子数目;i2*盘子数目;i+) if(pointi.是否有盘子()=true)position=i;b
33、reak;if(i=2*盘子数目)position=2*盘子数目-1;if(塔名=towerName2)int i=0;for(i=2*盘子数目;i3*盘子数目;i+) if(pointi.是否有盘子()=true)position=i;break;if(i=3*盘子数目) position=3*盘子数目-1; return position;Hannoi 塔12Disk 类是 javax.swing 包中 Button 类的子类,所创建的对象称作 Hannoi 塔中的“盘子”。 HannoiTower 类有 Disk 类型的数组盘子。 盘子数组的单元是用 Disk 创建的对象,被放置在 To
34、wer 所创建的容器 tower 中,用来表示 tower 中的“盘子”。 成员变量number 的值确定所创建的“盘子”上的数字号码,通过该号码的大小来确定盘子的大小关系,即号码大的盘子大于号码小的盘子。 方法Disk()构造方法。创建盘子对象时需要使用该构造方法。setNumber(int n)。盘子调用该方法设置其上的数字号码。getNumber()方法。盘子调用该方法返回其上的数字号码。set 上方有盘()方法。盘子调用该方法设置其所在的塔点。get 上方有盘()方法。盘子调用该方法返回其所在的塔点。代码(代码(Disk.java)import java.awt.*;public cl
35、ass Disk extends Button int number;boolean 上方有盘=false;public Disk(int number,HannoiTower con)this.number=number;setBackground(Color.blue);addMouseMotionListener(con);addMouseListener(con);public boolean get 上方有盘()return 上方有盘;public void set 上方有盘(boolean b)上方有盘=b; public int getNumber()return number;
36、 TowerPoint 类类TowerPoint 所创建的对象将作为 HannoiTower 类中 TowerPoint 型数组 pointA、pointB 和 pointC 中的元素。 成员变量x 和 y 是 TowerPoint 对象中的两个 int 型数据,用来表示塔点在容器 tower 中的坐标。tower 容器的坐标原点是容器的左上角,向右是 x 轴的正方向,向下是 y轴的正方向。Java 程序设计课程设计报告(2011)13有盘子是 boolean 数据, 如果当前塔点上有盘子时, 该数据为 true; 否则为 false。盘子是 Disk 声明的对象,用来存放当前塔点上的盘子对象
37、的引用,如果当前塔点上有盘子,盘子存放的引用是 null,即盘子是空对象。 方法TowerPoint(int,int)是构造方法,用来创建塔点对象。塔点对象调用是否有盘子()方法可以返回一个 boolean 数据, 如果调用该方法的塔点上有盘子,是否有盘子()方法返回 true;否则返回 false。塔点对象调用 set 有盘子(boolean)方法可以根据参数的值设置当前塔点上是否有盘子。塔点对象调用 getX()和 getY()方法可以返回塔点的坐标中的 x 轴坐标和 y 轴坐标。塔点对象调用 Equals(TowerPoint)方法可以判断当前塔点是否和参数指定的塔点相同。塔点对象调用
38、Equals(TowerPoint)方法 putDisc(Component com,Container con)方法,将参数 com 指定的盘子放置在参数 con 指定的容器中,盘子所在位置由当前的塔点坐标所确定,即将盘子放置在当前塔点上。塔点对象调用 getDiscOnPoint()方法可以返回当前塔点上的盘子。塔点对象调用 removeDisc(Component com,Container con)方法可以移掉当前塔点上的盘子。代码(代码(TowerPoint.java)import java.awt.*;public class TowerPoint int x,y;boolean
39、有盘子;Disk 盘子=null;HannoiTower con=null;public TowerPoint(int x,int y,boolean boo)this.x=x;this.y=y;有盘子=boo;public boolean 是否有盘子()return 有盘子;public void set 有盘子(boolean boo)有盘子=boo; Hannoi 塔14public int getX()return x;public int getY()return y;public void 放置盘子(Disk 盘子,HannoiTower con)this.con=con;con.
40、setLayout(null);this.盘子=盘子;con.add(盘子);int w=盘子.getBounds().width;int h=盘子.getBounds().height;盘子.setBounds(x-w/2,y-h/2,w,h);有盘子=true;con.validate();public Disk 获取盘子()return 盘子;5 测试5.1 测试方案本程序的初始状态是 A 塔上有五个大小不等的盘子, 这些盘子从座底到座顶按着大小顺序依次摆放在 A 塔上。用户可以用鼠标选中盘子,然后通过拖动鼠标来移动该盘子、释放鼠标来放置该盘子。程序要求用户在移动盘子过程中,不允许把大盘
41、子放在小盘子的上面, 用户最终要完成的是把 A 塔上的全部盘子移动到 B 塔或 C塔上。用户可以通过单击 Hannoi 塔界面上提供的按钮,让程序自动完成把 A 塔上的盘子全部移动到 B 塔或 C 塔上。 用户在移动盘子的过程中, 可以随时单击 Hannoi塔界面上提供的按钮,重新开始游戏。5.2 测试结果下面是程序运行的效果图。(1)Tower 类创建的窗口效果如图所示。Java 程序设计课程设计报告(2011)15(2) HannoiTower 类是 javax.swing 包中 JPanel 容器的一个子类,创建的对象 tower是 Tower 窗口的成员之一,被添加到 Tower 窗口
42、的中心位置。HannoiTower 创建的容器效果如图所示。(3) Disk 类是 javax.swing 包中 Button 类的子类,所创建的对象称作 Hannoi 塔中的“盘子”。Disk 创建的按钮的效果如图所示。(4)TowerPoint 创建的对象含有两个 int 型数据,用来表示塔点的位置坐标,该位置坐标由 tower 容器的 pointComponent(Graphics g)方法负责绘制,绘制的形状是一个小圆点,如图所示。Hannoi 塔16(5)自动演示的效果图如图所示。6 小结通过这次课程设计,使我充分的熟练了 Java 这种面向对象编程语言的编写。另外还巩固了我们在 C
43、 语言和数据结构学过的许多知识,比如说 if.else 判断语句的应用,字符输出,用的最多的还是循环(While 循环、For 循环) 。在此感谢我们的原钥老师.,老师严谨细致、一丝不苟的作风一直是我工作、学习中的榜样;老师循循善诱的教导和不拘一格的思路给予我无尽的启迪;这次课程设计的每个实验细节和每个数据,都离不开老师您的细心指导。而您开朗的个性和宽容的态度,帮助我能够很顺利的完成了这次课程设计。同时感谢对我帮助过的同学们,谢谢你们对我的帮助和支持,让我感受到同学的友谊。由于本人的设计能力有限, 在设计过程中难免出现错误, 恳请老师们多多指教,我十分乐意接受你们的批评与指正,本人将万分感谢。Java 程序设计课程设计报告(2011)17参考文献参考文献1耿祥义,张跃平. Java2 实用教程(第三版)M . 北京:清华大学出版社, 20062耿祥义. Java 课程设计(第三版)M . 北京:清华大学出版社, 20043张跃平.Java2 实用教程实验指导与习题解答(第三版)M. 北京:清华大学出版社, 20044Jacquie Barker,Java 面向对象编程指南,电子工业出版社,2001Hannoi 塔18附录附录 1 源程序清单
限制150内