1、1成 绩 评 定 表学生姓名 班级学号 专 业 课程设计题目评语组长签字:成绩日期 2012 年 月 日2课程设计任务书学 院 信息学院 专 业学生姓名 班级学号 课程设计题目 基于 Java 的 Hannoi 塔软件设计实践教学要求与任务:采用 java 技术设计 Hannoi 塔软件,设计要求如下:(1) 设计 GUI 界面的 Hannoi 塔。Hannoi 塔中有三个座,名字分别是 A、B 和 C.初始状态是 A 座上有 3 个大小不等的盘子,这些盘子中从座底到座顶按着大小顺序依次摆放在 A 座上。用户可以用鼠标选中盘子,然后通过拖动鼠标来移动该盘子、释放鼠标来放置该盘子。(2) 程序要
2、求用户在移动盘子的过程中,不允许把大盘放置在小盘的上面,用户最终要完成的是把 A 座上的全部盘子移动到 B 座或 C 座上。(3) 用户可以通过 Hannoi 塔界面提供的菜单来选择初级、中级和高级三个级别。初级级别 A 座上有 3 个大小不等盘子、中级级别 A 座上有 4 个大小不等盘子、高级级别 A 座上有 5 个大小不等盘子。(4) 用户可以通过单击 Hannoi 塔界面上提供的按钮,让程序自动完成把 A 座上的盘子全部移动到 C 座上。(5) 用户在移动盘子的过程中,可以随时单击 Hannoi 塔界面上提供的按钮,重新开始当前的级别。工作计划与进度安排:第 18 周:布置课程设计任务,
3、查阅资料,分组设计,程序调试。第 19 周:程序调试,编写课程设计报告,验收,答辩。指导教师:2012年 月 日专业负责人:2012年 月 日学院教学副院长:2012年 月 日3目录成绩评定表1课程设计任务书2绪论3目录41 相关技术介绍51.1 开发工具51.2 应用环境51.3 问题的提出51.4 任务设计内容62 系统需求分析72.1 界面及其布局设计72.2 A,B,C 座的实现方法.72.2.1 成员变量82.2.2 方法82.3 圆盘的实现方法92.3.1 Disc 成员变量102.3.2 Disc 方法103 系统总体设计113.1 总体类关系113.2 总体功能图113.3 总
4、体流程图124 系统主要功能设计流程图134.1 A,B,C 座实现流程图134.2 圆盘画法流程图135 系统详细设计156 源代码207 系统测试278 总结284绪 论汉诺塔(又称河内塔)问题是印度的一个古老的传说。开天辟地的神勃拉玛在一个庙里留下了三根金刚石的棒,第一根上面套着 64个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不倦地把它们一个个地从这根棒搬到另一根棒上,规定可利用中间的一根棒作为帮助,但每次只能搬一个,而且大的不能放在小的上面。解答结果请自己运行计算,程序见尾部。面对庞大的数字(移动圆片的次数)18446744073709551615,看来,众
5、僧们耗尽毕生精力也不可能完成金片的移动。后来,这个传说就演变为汉诺塔游戏: (1) 有三根杆子 A,B,C。A 杆上有若干碟子 (2) 每次移动一块碟子,小的只能叠在大的上面 (3) 把所有碟子从 A杆全部移到 C杆上经过研究发现,汉诺塔的破解很简单,就是按照移动规则向一个方向移动金片:如 3阶汉诺塔的移动:AC,AB,CB,AC,BA,BC,AC。此外,汉诺塔问题也是程序设计中的经典递归问题。和汉诺塔故事相似的,还有另外一个印度传说:舍罕王打算奖赏国际象棋的发明人宰相西萨班达依尔。国王问他想要什么,他对国王说:“陛下,请您在这张棋盘的第 1个小格里赏给我一粒麦子,在第 2个小格里给 2粒,第
6、 3个小格给 4粒,以后每一小格都比前一小格加一倍。请您把这样摆满棋盘上所有 64格的麦粒,都赏给您的仆人吧!”国王觉得这个要求太容易满足了,就命令给他这些麦粒。当人们把一袋一袋的麦子搬来开始计数时,国王才发现:就是把全印度甚至全世界的麦粒全拿来,也满足不了那位宰相的要求。 那么,宰相要求得到的麦粒到底有多少呢?总数为 1+2+22 + +263 =264-1和移完汉诺塔的次数一样。我们已经知道这个数字有多么大了。人们估计,全世界两千年也难以生产这么多麦子!51 相关技术介绍1.1 开发工具Sun Microsystems 公司在推出 Java 语言的同时,推出了一套开发工具 JDK。Sun
7、提供的基于字符模式的 Java 开发工具包 JDK: Java 开发工具(JDK)是许多 Java 专家最初使用的开发环境。Java 是平台无关的语言是指用 Java 写的应用程序不用修改就可在不同的软硬件平台上运行。Java 源程序编写借助于记事本,Editpuls,UltraEdit 等第三方编辑工具。所有的 Java 文件编辑、编译、调试、解释运行都是通过使用字符命令来执行操作。JDK 由一个标准类库和一组建立,测试及建立文档的 Java 实用程序组成。其核心JavaAPI 是一些预定义的类库,开发人员需要用这些类来访问 Java 语言的功能。JDK 是整个 Java 的核心,包括了 J
8、ava 运行环境(Java RuntimeEnvirnment) ,一堆 Java 工具和Java 基础的类库(rt.jar)。不论什么 Java 应用服务器实质都是内置了某个版本的 JDK,因此掌握 JDK 是学好 Java 的第一步。JDK 里面是 java 类库和 java 的语言规范,它提供的是无论你用何种开发软件写 java 程序都必须用到的类库和 java 语言规范.没有 jdk,你的 java 程序根本就不能用。最主流的 JDK 是 Sun 公司发布的 JDK,除了 Sun 之外,还有很多公司和组织都开发了自己的 JDK,例如 IBM 公司开发的 JDK,BEA 公司的 Jroc
9、ket,还有 GNU 组织开发的JDK 等等。其中 IBM 的 JDK 包含的 JVM(Java Virtual Machine)运行效率要比SunJDK 包含的 JVM 高出许多。而专门运行在 x86 平台的 Jrocket 在服务端运行效率也要比 SunJDK 好很多。但不管怎么说,我们还是需要先把 Sun JDK 掌握好。1.2 应用环境(1) 操作系统:Windows XP 及以上版本(2) 应用软件:JDK2.0 Eclipse6.01.3 问题的提出随着计算机得普及,人们越来越多得接触到计算机,人们得生活工作中无处不有计算机得身影,人们面对长时间的难免会有倦怠的情绪,而人们大多得缓
10、解情绪得网络活动其实并不能起到放松心情得作用。现代人得生活节奏越来越快,有没有一种快速缓解疲倦得游戏6呢?我们提出设计一款益智得小游戏,这种游戏不会花太多时间,同时把玩家得思维带动起来,达到一举多得得效果。1.4 任务设计内容(1) 设计 Hannoi塔中有三个座,名字分别是 A、B 和 C。初始状态是 A座上有 3个大小不等的盘子,这些盘子从座底到座顶按着大小顺序依次摆放在 A座上。用户可以用鼠标选中盘子,然后通过拖动鼠标来移动该盘子、释放鼠标来放置该盘子;(2) 程序要求用户在移动盘子过程中,不允许把大盘放置在小盘的上面,用户最终要完成的是把 A座上的全部盘子移动到 B座或 C座上;(3)
11、 用户可以通过 Hannoi塔界面提供的菜单来选择初级、中级、高级三个级别。初级级别 A座上有 3个大小不等盘子、中级级别 A座上有 4个大小不等盘子、高级级别 A座上有 5个大小不等盘子。(4) 用户可以通过单击 Hannoi塔界面上提供的按钮,让程序自动完成把 A座上的盘子全部移动到 C座上;(5) 用户在移动盘子的过程中,可以随时单击 Hannoi塔界面上提供的按钮,重新开始当前的级别;(6) 有移动记录功能,即显示用户完成移动盘子所移动的步骤;(7) 在自动移动过程中可以随时暂停、继续。2 系统需求分析72.1 界面及其布局设计系统的整体布局为:BorderLayout 布局, 采用了
12、菜单、按钮、面板等组件,菜单主要包括选择级别盘子个数,,按钮的功能包括重新开始,自动演示,演示,暂停,继续,关闭。2.2 A、B、C 座的实现方法Tower类是 javax.swing包中 JPanel容器的一个子类,创建的对象 tower是HannoiWindow窗口的成员之一,被添加到 HannoiWindow窗口的中心位置。标明 Tower类的主要成员变量和方法以及和 HannoiWindow类之间组合关系的 UML图如图 2-1所示。j p a n e lT o w e r h a n n o i W i n d o wt o w e T o w e r图 2-1 Tower 类的 U
13、ML 图2.2.1 成员变量(1) amountOfDisc是 int 型数据。amountOfDisc 值用来确定 tower对象中盘子的数目,tower 对象中 Disc类型数组 disc的长度。(2) disc是 Disc型数组,该数组的长度由 amountOfDisc值来确定。Disc 数组的每个单元中存放一个 Disc对象,依次表明 tower对象中有怎样多的盘子。8(3) towerName是 char型数组,长度为 3,其三个单元的默认取值依次是 A、B 和C。towerName 是数组的单元的值用来确定 tower中三个座的名字。(4) maxDiscWidth和 minDis
14、cWidth的值分别用来确定最大盘子的宽度和最小盘子的宽度,discHeight 的值确定每个盘子的高度。(5) pointA、pointB 和 pointC都是 TowerPoint型数组,三个数组的长度与盘子数目相同,即都是 amountOfDisc。pointA、pointB 和 pointC单元都是 TowerPoint创建对象,分别用来表示 Hannoi塔中三个座上的塔点。A 座、B 座和 C座上的三个塔点分别由pointA、pointB 和 pointC中的单元来确定。每个座上的三个塔点都是从座顶依次对应数组的相应单元中的 TowerPoint对象。(6) handleMouse是
15、 HandleMouse类创建的鼠标事件监视器,用来监视 disc数组的Disc对象上触发的鼠标事件。(7) autoMoveDisc是 AutoMoveDisc创建的对话框。通过该对话框可以实现程序自动移动盘子。2.2.2 方法(1) Tower(char)是构造方法,负责完成 tower容器的初始化。(2) tower容器调用 setAmountOfDisc(int)方法可以设置 amountOfDisc的值。(3) tower容器调用 setMaxDiscWidth(int)方法可以设置最大的盘子的大小。(4) tower容器调用 setMinDiscWidth(int)方法可以设置最小
16、的盘子的大小。(5) tower容器调用 setDiscHeight(int)方法可以设置盘子的高度。(6) tower容器调用 putDiscOnTower ()方法可以将盘子放置在 Hannoi塔的 A座上,即在 pointA指定的塔点上放置 disc数组的成员。(7) tower容器调用 getAutoMoveDisc ()方法返回其中的 AutoMoveDisc对象:autoMoveDisc。tower 是 HannoiWindow窗口中的成员,当用户单击 HannoiWindow窗口中的 autoButton按钮时,窗口中的 actionPerformed(ActionEvent)方
17、法将被执行,该方法所进行的操作是让 tower对象返回其中的 AutoMoveDisc对象,该对象是一个对话框,用户可以通过该对话框让程序自动地移动盘子。(8) tower容器调用 removeDisk ()方法可以移调 tower容器中的盘子。(9) tower容器调用 paintComponent (Graphics)方法绘制出塔点的位置和必要的视图。因此 Tower类创建的按钮的效果如图 2-2所示。9图 2-2 Tower 创建容器视图2.3 圆盘的实现方法Disc类是 javax.swing包中 Jbutton类的子类,所创建的对象称作 Hannoi塔中的“盘子” 。Tower 类有
18、 Disc类型的数组 disc。Disc 数组的单元是用 Disc创建的对象,被放置在 Tower所创建的容器 tower中,用来表示 tower中的“盘子” 。标明 Disc类的主要成员变量、方法以及和 Tower类之间组合关系的 UML如图 2-3所示。J B u t t o nD i s cT o w e rd i s c : D i s c 图 2-3 Disc 类的 UML 图2.3.1 Disc 成员变量(1) number的值确定所创建的“盘子”上的数字号码,通过该号码的大小来确定盘子的大小关系,即号码大的盘子大于号码小的盘子。(2) point是 TowerPoint对象,是
19、Disc所创建的“盘子”的一个重要成员。 “盘子”被放置在 tower容器的塔点上(TowerPoint 对象称作塔点), “盘子”通过使用 point对象表明自己所在的塔点。2.3.2 Disc 方法(1) Disc()构造方法。创建盘子对象时需要使用该构造方法。(2) setNumber(int)。盘子调用该方法设置其上的数字号码。10(3) getNumber()方法。盘子调用该方法返回其上的数字号码。(4) setPoint(TowerPoint)方法。盘子调用该方法设置其所在的塔点。(5) getPoint()方法。盘子调用该方法返回其所在的塔点。因此 Disc创建的按钮的效果如图
20、2-4所示。图 2-4 Disc 创建的三个按钮3 系统总体设计3.1 总体类关系在设计 Hannoi塔时,需编写 6个 JAVA源文件:HannoiWindow.Java 、TowerPoint.java、Disc.java、HandleMous.java 和 AutoMoveDisc.java。Hannoi塔除了要编写的 6个 Java源文件所给出的类外,还需要 Java系统提供的一些重要的类,如 JMenubar,JMenu,JMenuItem和 JButton。Hannoi 塔所用到得一些重要的类以及类之间的组合关系如图 3-1所示:11图 3-1 类之间的组合关系3.2 总体功能图根
21、据游戏需求分析,游戏主界面有“选择级别” 、 “重新开始” 、 “自动演示”三个按钮,每个按钮分别实现“初级,中级,高级” 、 “运行游戏” 、 “自动演示”效果,因此做出总体功能图如图 3-2所示:图 3-2 总体功能图3.3 总体流程图根据游戏相关功能设计,得出总体流程图如图 3-3所示:12开始按钮处理菜单事件选择菜单 选择按钮选择级别是否成功N重新开始 自动演示是否成功NYY显示对应的操作结束图 3-3 总体流程图4 系统主要功能设计流程图4.1 A、B、C 座实现流程图为了整体布局的美观,首先要画出 A、B、C 座,主要经过“画三条竖线” , “画三个点” 、13“画矩形区域” 、
22、“画座名”几个步骤,得出制作流程图如图 4-1所示:开始结束画三条竖线画三个点画矩形区域画座名成功成功成功成功YNYYYNNN图 4-1 A、B、C 座实现流程图4.2 圆盘画法流程图与此同时,圆盘的制作要经过“设置盘子编号” 、 “设置盘子塔点” 、 “将盘子放在指定位置”三个步骤,得出圆盘的制作流程图如图 4-2所示:14开始继承 J b u t t t o n设置盘子编号 设置盘子塔点N是否成功Y将盘子放置在指定位置成功NY结束成功YN图 4-2 圆盘画法流程图5 系统详细设计155.1 HannoiWindow.java(主类)HannoiWindow类负责创建 Hannoi塔的主窗口
23、,该类含有 main方法,Hannoi 塔从该类开始执行。HannoiWindow 类的成员变量中有五种重要类型的对象,一个 int基本型数据和一个 char行数组。五种类型的对象分别是 JMenubar ,JMenu,JMenuItem和 JButton对象。HannoiWindow创建的窗口以及其中的主要成员对象如图 5-1所示:图 5-1 HannoiWindow 窗口及主要的成员对象5.2 Tower.javaTower类是 javax.swing报中的 JPanel容器的子类,创建的容器被添加到HannoiWindow窗口的中心。Tower 类的成员变量中有四种重要的类型对象、一个
24、int基本型数据和一个 char型数组。Tower创建的窗口以及其中的主要成员对象如图 5-2所示:图 5-2 Tower 创建的 tower 容器165.3 Disc.javaDisc类是 JButton的一个子类,创建的对象是 Tower容器中的一个按钮,用来表示Tower中的“盘子” 。Disc创建的窗口以及其中的主要成员对象如图 5-3所示:图 5-3 Disc 创建的三个按钮5.4 TowerPoint.javaTowerPint.Java类负责在 Tower中创建表示位置的塔的对象。Disc创建的窗口以及其中的主要成员对象如图 5-4所示:图 5-4 TowerPoint 绘制出的
25、塔顶TowerPoint 所创建的对象将作为 HannoiTower 类中 TowerPoint 型数组pointA、 pointB 和 pointC 中的元素。标明 TowerPoint 类的主要成员变量、方法以及Tower 类之间组合关系的 UML 图如图 5-5 所示。TowerPointx,y:int有盘子:boolean盘子:Disk TowerPoint(int,int):无类型是否有盘子():Booleanset 有盘子(boolean):voidgetX(): intgetY(): int放置盘子(): void获取盘子():DiskEquals(TowerPoint):Boo
26、leanputDisc(Component,Container):voidgetDiscOnPoint(): DiscremoveDisc(Component,Container):voidTowerPointA:TowerPointPointB: TowerPointPointC: TowerPoint17图 5-5 TowerPoint 类的 UML 图以下是 UML 图中有关数据和方法的详细说明 。 成员变量x 和 y 是 TowerPoint 对象中的两个 int 型数据,用来表示塔点在容器 tower 中的坐标。tower 容器的坐标原点是容器的左上角,向右是 x 轴的正方向,向下是
27、 y 轴的正方向。有盘子是 boolean 数据,如果当前塔点上有盘子时,该数据为 true;否则为 false。盘子是 Disk 声明的对象,用来存放当前塔点上的盘子对象的引用,如果当前塔点上有盘子,盘子存放的引用是 null,即盘子是空对象。 方法TowerPoint(int,int)是构造方法,用来创建塔点对象。塔点对象调用是否有盘子()方法可以返回一个 boolean 数据,如果调用该方法的塔点上有盘子,是否有盘子()方法返回 true;否则返回 false。塔点对象调用 set 有盘子(boolean)方法可以根据参数的值设置当前塔点上是否有盘子。塔点对象调用 getX()和 get
28、Y()方法可以返回塔点的坐标中的 x 轴坐标和 y 轴坐标。塔点对象调用 Equals(TowerPoint)方法可以判断当前塔点是否和参数指定的塔点相同。塔点对象调用 Equals(TowerPoint)方法 putDisc(Component com,Container con)方法,将参数 com 指定的盘子放置在参数 con 指定的容器中,盘子所在位置由当前的塔点坐标所确定,即将盘子放置在当前塔点上。塔点对象调用 getDiscOnPoint()方法可以返回当前塔点上的盘子。塔点对象调用 removeDisc(Component com,Container con)方法可以移掉当前塔点
29、上的盘子。5.5 HandleMouse.javaHandleMouse类创建的对象负责处理鼠标事件。HandleMouse类实现了 MouseListener和 MouseMotionListener接口,创建的对象18handleMouse是 tower容器的成员之一,负责监视 tower容器中 Disc盘子对象上的鼠标事件。当用户用鼠标点击 tower中的盘子,并拖动鼠标时,handleMouse 对象负责给出移动盘子的有关算法。标明 HandleMouse类的主要成员变量、方法以及和 Tower类之间的组合关系的 UML图如图 5-6所示。图 5-6 Tower 类的 UML 图 5.
30、6 AutoMoveDisc.javaAutoMoveDisc类创建的对象负责走动移动盘子从一个座到另一个座。AutoMoveDisc创建的窗口以及其中的主要成员对象如图 5-7所示:(a)自动移动盘子从 A 到 C (b)对话框显示文字信息HandleMousepointA,pointB,pointC:TowerPointstartPoint,endPoint:TowerPointcon;ContainerHandleMouse(Container con):无类型SetPointA(TowerPoint):voidSetPointB(TowerPoint):voidSetPointC(To
31、werPoint):voidmousePressed(MouseEvent):voidmouseDragged(MouseEvent):voidmouseReleased(MouseEvent):voidTowerhandleMouse:handleMouseMouseMotionListenerMouseListener19图 5-7 AutoMoveDisc 类创建的对话框AutoMoveDisc类实现了 ActionListener接口,创建的对象 autoMoveDisc是 Tower的成员之一。标明 AutoMoveDisc类的主要成员变量、方法、以及和 Tower类之间组合关系的U
32、ML图如图 5-8所示。图 5-7 AutoMoveDisc 类的 UML 图图 5-8 AutoMoveDisc 类的 UML 图6 源代码import javax.swing.*;import java.awt.*;import java.awt.event.*;public class HannoiWindow extends JFrame implements ActionListenerTower tower=null;int amountOfDisc=3;char towerName=A,B,C;JMenuBar bar;AutoMoveDiscAmountOfDisc: int
33、ShowStep:JTextAreapointA,pointB,pointC, TowerPoint bStart,bStop,bContinue,bCldse:towerName: char JButtoncon: Container time: TimermoveStep:StringBufferAutoMoveDisc(Container con):无类型SetPointA(TowerPoint):voidSetPointB(TowerPoint):voidSetPointC(TowerPoint):voidactionPerformed(ActionEvent):voidsetTowe
34、rName(char):voidsetAmountOfDisc(int):voidsetMoveStep(int,char,char,char):voidAutoMoveDisc(char,char):voidTowerautoMoveDisc:AutoMoveDiscActionListener20JMenu menuGrade;JMenuItem oneGradeItem,twoGradeItem,threeGradeItem;JButton renew=null;JButton autoButton=null; JPanel center=new JPanel(); HannoiWind
35、ow()tower=new Tower(towerName);tower.setAmountOfDisc(amountOfDisc);tower.setMaxDiscWidth(120);tower.setMinDiscWidth(50);tower.setDiscHeight(16);tower.putDiscOnTower();add(tower,BorderLayout.CENTER);bar=new JMenuBar();menuGrade=new JMenu(“选择级别“);oneGradeItem=new JMenuItem(“初级“);twoGradeItem=new JMenu
36、Item(“中级“);threeGradeItem=new JMenuItem(“高级“);menuGrade.add(oneGradeItem);menuGrade.add(twoGradeItem);menuGrade.add(threeGradeItem);bar.add(menuGrade);setJMenuBar(bar);oneGradeItem.addActionListener(this);twoGradeItem.addActionListener(this);threeGradeItem.addActionListener(this); renew=new JButton(
37、“重新开始“);renew.addActionListener(this);autoButton=new JButton(“自动演示“);autoButton.addActionListener(this);21JPanel north=new JPanel();north.add(renew);north.add(autoButton); String mess=“将全部盘子从“+towerName0+“座搬运到“+towerName1+“座或“+towerName2+“座“;JLabel hintMess=new JLabel(mess,JLabel.CENTER);north.add(h
38、intMess); add(north,BorderLayout.NORTH);setResizable(false); setVisible(true);setBounds(60,60,460,410);validate();setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); public void actionPerformed(ActionEvent e)if(e.getSource()=oneGradeItem)amountOfDisc=3;tower.setAmountOfDisc(amountOfDisc);tower.putDiscOn
39、Tower();else if(e.getSource()=twoGradeItem)amountOfDisc=4;tower.setAmountOfDisc(amountOfDisc);tower.putDiscOnTower();else if(e.getSource()=threeGradeItem)amountOfDisc=5;tower.setAmountOfDisc(amountOfDisc);tower.putDiscOnTower();22else if(e.getSource()=renew)tower.setAmountOfDisc(amountOfDisc);tower.
40、putDiscOnTower();else if(e.getSource()=autoButton)tower.setAmountOfDisc(amountOfDisc);tower.putDiscOnTower();int x=this.getBounds().x+this.getBounds().width;int y=this.getBounds().y;tower.getAutoMoveDisc().setLocation(x,y);tower.getAutoMoveDisc().setSize(280,this.getBounds().height); tower.getAutoMo
41、veDisc().setVisible(true);validate();public static void main(String args)new HannoiWindow();Tower类import javax.swing.*;import java.awt.*;public class Tower extends JPanel int amountOfDisc=3;Disc disc;int maxDiscWidth,minDiscWidth,discHeight; char towerName;TowerPoint pointA,pointB,pointC;HandleMouse
42、 handleMouse;AutoMoveDisc autoMoveDisc;23Tower(char towerName)handleMouse=new HandleMouse(this); this.towerName=towerName;setLayout(null);setBackground(new Color(200,226,226); public void setAmountOfDisc(int number)if(number=1)amountOfDisc=1;elseamountOfDisc=number;public void setMaxDiscWidth(int m)
43、maxDiscWidth=m; public void setMinDiscWidth(int m)minDiscWidth=m;public void setDiscHeight(int h)discHeight=h;public AutoMoveDisc getAutoMoveDisc()return autoMoveDisc;public void putDiscOnTower()removeDisk();int n=(maxDiscWidth-minDiscWidth)/amountOfDisc;disc=new DiscamountOfDisc;for(int i=0;idisc.l
44、ength;i+)disci=new Disc();24disci.setNumber(i);int diskwidth=minDiscWidth+i*n;disci.setSize(diskwidth,discHeight);disci.addMouseListener(handleMouse);disci.addMouseMotionListener(handleMouse);pointA=new TowerPointamountOfDisc;pointB=new TowerPointamountOfDisc; pointC=new TowerPointamountOfDisc;int v
45、ertialDistance=discHeight;for(int i=0;ipointA.length;i+)pointAi=new TowerPoint(maxDiscWidth,100+vertialDistance);vertialDistance=vertialDistance+discHeight;vertialDistance=discHeight;for(int i=0;ipointB.length;i+)pointBi=new TowerPoint(2*maxDiscWidth,100+vertialDistance);vertialDistance=vertialDista
46、nce+discHeight;vertialDistance=discHeight;for(int i=0;ipointC.length;i+)pointCi=new TowerPoint(3*maxDiscWidth,100+vertialDistance);vertialDistance=vertialDistance+discHeight;for(int i=0;ipointA.length;i+)pointAi.putDisc(disci,this);handleMouse.setPointA(pointA); handleMouse.setPointB(pointB);handleM
47、ouse.setPointC(pointC);25autoMoveDisc=new AutoMoveDisc(this);autoMoveDisc.setTowerName(towerName);autoMoveDisc.setAmountOfDisc(amountOfDisc);autoMoveDisc.setPointA(pointA);autoMoveDisc.setPointB(pointB);autoMoveDisc.setPointC(pointC); validate();repaint(); public void removeDisk()if(pointA!=null)for(int i=0;ipointA.length;i+)pointAi.removeDisc(pointAi.getDiscOnPoint(),this);pointBi.removeDisc(pointBi.getDiscOnPoint(),this);pointCi.removeDisc(pointCi.getDiscOnPoint(),this);publ