




已阅读5页,还剩27页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
java技术大作业院 (系) 电气与信息工程学院 专业班级 计科普1004 学生姓名 樊科 学号 2020442736 成绩 2012年 5 月 5日 目录1 设计内容及要求41.1 汉诺塔算法的基本要求41.2需要实现的主要功能52.需求分析62.1 界面及其布局设计62.2 a、b、c座的实现方法62.2.1、成员变量72.2.2 方法72.3 圆盘的实现方法82.3.1 disc成员变量82.3.2 disc方法93 总体设计93.1 总体功能图93.2 总体流程图104 主要功能设计流程图114.1 a、b、c座实现流程图114.2 圆盘画法流程图125 运行效果135.1 运行界面效果136. 源代码146.1 automovedisc 代码146.2 disc 代码186.3 handlemouse 代码196.4hannoiwindow 代码236.5tower 代码266.6 towerpoint代码291 设计内容及要求1.1 汉诺塔算法的基本要求(1) 设计gui界面的hannoi塔。hannoi塔中有三个座,名字分别是a、b和c。初始状态是a座上有3个大小不等的盘子,这些盘子从座底到座顶按着大小顺序依次摆放在a座上。用户可以用鼠标选中盘子,然后通过拖动鼠标来移动该盘子、释放鼠标来放置该盘子。(2)程序要求用户在移动盘子过程中,不允许把大盘放置在小盘的上面,用户最终要完成的是把a座上的全部盘子移动到b座或c座上。(3)用户可以通过hannoi塔界面提供的菜单来选择初级、中级、高级和自定义四个级别。初级级别a座上有3个大小不等盘子、中级级别a座上有4个大小不等盘子、高级级别a座上有5个大小不等盘子、自定义级别a座用户可以任意输入盘子数目。(4)用户可以通过单击hannoi塔界面上提供的按钮,让程序自动完成把a座上的盘子全部移动到c座上。(5)用户在移动盘子的过程中,可以随时单击hannoi塔界面上提供的按钮,重新开始当前的级别。 1.2需要实现的主要功能(1)完成汉诺塔的“手工移动演示”; (2)完成汉诺塔的“自动移动演示”;(3)用户可以设置盘子的数目;2.需求分析2.1 界面及其布局设计 系统的整体布局为:borderlayout布局, 采用了菜单、按钮、面板等组件,菜单主要包括选择级别盘子个数,,按钮的功能包括重新开始,自动演示,演示,暂停,继续,关闭。2.2 a、b、c座的实现方法 tower类是javax.swing包中jpanel容器的一个子类,创建的对象tower是hannoiwindow窗口的成员之一,被添加到hannoiwindow窗口的中心位置。标明tower类的主要成员变量和方法以及和hannoiwindow类之间组合关系的uml图如图2-1所示。图 2-1tower 类的uml 图2.2.1、成员变量(1)amountofdisc是int型数据。amountofdisc值用来确定tower对象中盘子的数目,tower对象中disc类型数组disc的长度。(2)disc是disc型数组,该数组的长度由amountofdisc值来确定。disc数组的每个单元中存放一个disc对象,依次表明tower对象中有怎样多的盘子。(3)towername是char型数组,长度为3,其三个单元的默认取值依次是a、b和c。towername是数组的单元的值用来确定tower中三个座的名字。(4)maxdiscwidth和mindiscwidth的值分别用来确定最大盘子的宽度和最小盘子的宽度,discheight的值确定每个盘子的高度。(5)pointa、pointb和pointc都是towerpoint型数组,三个数组的长度与盘子数目相同,即都是amountofdisc。pointa、pointb和pointc单元都是towerpoint创建对象,分别用来表示hannoi塔中三个座上的塔点。a座、b座和c座上的三个塔点分别由pointa、pointb和pointc中的单元来确定。每个座上的三个塔点都是从座顶依次对应数组的相应单元中的towerpoint对象。(6)handlemouse是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)方法可以设置最小的盘子的大小。(5) tower容器调用setdischeight(int)方法可以设置盘子的高度。(6) tower容器调用putdiscontower ()方法可以将盘子放置在hannoi塔的a座上,即在pointa指定的塔点上放置disc数组的成员。(7) tower容器调用getautomovedisc ()方法返回其中的automovedisc对象:automovedisc。tower是hannoiwindow窗口中的成员,当用户单击hannoiwindow窗口中的autobutton按钮时,窗口中的actionperformed(actionevent)方法将被执行,该方法所进行的操作是让tower对象返回其中的automovedisc对象,该对象是一个对话框,用户可以通过该对话框让程序自动地移动盘子。(8) tower容器调用removedisk ()方法可以移调tower容器中的盘子。(9) tower容器调用paintcomponent (graphics)方法绘制出塔点的位置和必要的视图。图 2-2 tower 创建容器视图2.3 圆盘的实现方法disc类是javax.swing包中jbutton类的子类,所创建的对象称作hannoi塔中的“盘子”。tower类有disc类型的数组disc。disc数组的单元是用disc创建的对象,被放置在tower所创建的容器tower中,用来表示tower中的“盘子”。标明disc类的主要成员变量、方法以及和tower类之间组合关系的uml如图2-3所示。 图1-3 disc 类的uml图2.3.1 disc成员变量(1) number的值确定所创建的“盘子”上的数字号码,通过该号码的大小来确定盘子的大小关系,即号码大的盘子大于号码小的盘子。(2)point是towerpoint对象,是disc所创建的“盘子”的一个重要成员。“盘子”被放置在tower容器的塔点上(towerpoint对象称作塔点),“盘子”通过使用point对象表明自己所在的塔点。2.3.2 disc方法(1)disc()构造方法。创建盘子对象时需要使用该构造方法。(2)setnumber(int)。盘子调用该方法设置其上的数字号码。(3)getnumber()方法。盘子调用该方法返回其上的数字号码。(4)setpoint(towerpoint)方法。盘子调用该方法设置其所在的塔点。(5)getpoint()方法。盘子调用该方法返回其所在的塔点。因此disc创建的按钮的效果如图1-4所示。图 1-4 disc创建的三个按钮3 总体设计3.1 总体功能图图3-1总体功能图3.2 总体流程图图 3.2 总体流程图4 主要功能设计流程图4.1 a、b、c座实现流程图图4-1 a、b、c座实现流程图4.2 圆盘画法流程图图4-2 圆盘画法流程图5 运行效果5.1 运行界面效果图 5-1运行主界面效果图图 5-2自动演示效果图6. 源代码6.1 automovedisc 代码package hannoi;import java.awt.*;import java.awt.event.*;import javax.swing.*;public class automovedisc extends jdialog implements actionlistener int amountofdisc=3; towerpoint pointa,pointb,pointc; char towername; container con; stringbuffer movestep; jtextarea showstep; jbutton bstart,bstop,bcontinue,bclose; timer time; int i=0,number=0; automovedisc(container con) setmodal(true); settitle(自动演示搬盘子过程); this.con=con; movestep=new stringbuffer(); time=new timer(500,this); time.setinitialdelay(15); showstep=new jtextarea(15,20); bstart=new jbutton(演示); bstop=new jbutton(暂停); bcontinue=new jbutton(继续); bclose=new jbutton(关闭); bstart.addactionlistener(this); bstop.addactionlistener(this); bcontinue.addactionlistener(this); bclose.addactionlistener(this); jpanel south=new jpanel(); south.setlayout(new flowlayout(); south.add(bstart); south.add(bstop); south.add(bcontinue); south.add(bclose); add(new jscrollpane(showstep),borderlayout.center); add(south,borderlayout.south); setdefaultcloseoperation(jframe.do_nothing_on_close); towername=new char3; addwindowlistener(new windowadapter() public void windowclosing(windowevent e) time.stop(); setvisible(false); ); public void setpointa(towerpoint pointa) this.pointa=pointa; public void setpointb(towerpoint pointb) this.pointb=pointb; public void setpointc(towerpoint pointc) this.pointc=pointc; public void settowername(char name) if(name0=name1|name0=name2|name1=name2) towername0=a; towername1=b; towername2=c; else towername=name; public void setamountofdisc(int n) amountofdisc=n; /*实现盘子搬动,演示开始、暂停、继续、关闭按钮事件处理*/ public void actionperformed(actionevent e) if(e.getsource()=time) number+; char start,end; if(i+end+座n); automovedisc(start,end); i=i+2; if(i=movestep.length()-1) time.stop(); showstep.append(n演示完毕,樊科很高兴为您服务); else if(e.getsource()=bstart & movestep.length()=0 & time.isrunning()=false) i=0; movestep=new stringbuffer(); setmovestep(amountofdisc,towername0,towername1,towername2); number=0; time.start(); else if(e.getsource()=bstop & time.isrunning()=true) time.stop(); else if(e.getsource()=bcontinue & time.isrunning()=false) time.restart(); else if(e.getsource()=bclose) time.stop(); setvisible(false); private void setmovestep(int amountofdisc,char one,char two,char three) if(amountofdisc=1) movestep.append(one); movestep.append(three); else setmovestep(amountofdisc-1,one,three,two); movestep.append(one); movestep.append(three); setmovestep(amountofdisc-1,two,one,three); private void automovedisc(char cstart,char cend) disc disc=null; if(cstart=towername0) for(int i=0;ipointa.length;i+) if(pointai.ishavedisc()=true) disc=pointai.getdisconpoint(); pointai.sethavedisc(false); break; if(cstart=towername1) for(int i=0;ipointb.length;i+) if(pointbi.ishavedisc()=true) disc=pointbi.getdisconpoint(); pointbi.sethavedisc(false); break; if(cstart=towername2) for(int i=0;ipointc.length;i+) if(pointci.ishavedisc()=true) disc=pointci.getdisconpoint(); pointci.sethavedisc(false); break; towerpoint endpoint=null; int i=0; if(cend=towername0) for(i=0;i0) endpoint=pointai-1; break; else if(i=0) break; if(i=pointa.length) endpoint=pointapointa.length-1; if(cend=towername1) for(i=0;i0) endpoint=pointbi-1; break; else if(i=0) break; if(i=pointb.length) endpoint=pointbpointb.length-1; if(cend=towername2) for(i=0;i0) endpoint=pointci-1; break; else if(i=0) break; if(i=pointc.length) endpoint=pointcpointc.length-1; if(endpoint!=null&disc!=null) endpoint.putdisc(disc,con); endpoint.sethavedisc(true); 6.2 disc 代码package hannoi;import javax.swing.*;import java.awt.*;/*创建塔中的盘子*/public class disc extends jbuttonint num;towerpoint point;disc()setbackground(color.gray);public void setpoint(towerpoint p)point=p;public void setnumber(int i)num=i;public int getnumber()return num;public towerpoint getpoint()return point;6.3 handlemouse 代码package hannoi;import java.awt.event.*;import java.awt.*;public class handlemouse implements mouselistener,mousemotionlistener towerpoint pointa,pointb,pointc; towerpoint startpoint=null,endpoint=null; int leftx,lefty,x0,y0; boolean move=false,counttime=false; container con; handlemouse(container con) this.con=con; public void setpointa(towerpoint pointa) this.pointa=pointa; public void setpointb(towerpoint pointb) this.pointb=pointb; public void setpointc(towerpoint pointc) this.pointc=pointc; public void mousepressed(mouseevent e) move=false; disc disc=null; disc=(disc)e.getsource(); startpoint=disc.getpoint(); x0=e.getx(); y0=e.gety(); int m=0; for(int i=0;i0&(pointam-1.ishavedisc()=false) move=true; break; else if(m=0) move=true; break; for(int i=0;i0&(pointbm-1.ishavedisc()=false) move=true; break; else if(m=0) move=true; break; for(int i=0;i0&(pointcm-1.ishavedisc()=false) move=true; break; else if(m=0) move=true; break; public void mousemoved(mouseevent e) public void mousedragged(mouseevent e) disc disc=null; disc=(disc)e.getsource(); leftx=disc.getbounds().x; lefty=disc.getbounds().y; int x=e.getx(); int y=e.gety(); leftx=leftx+x; lefty=lefty+y; if(move=true) disc.setlocation(leftx-x0,lefty-y0); public void mousereleased(mouseevent e) disc disc=null; disc=(disc)e.getsource(); rectangle rect=disc.getbounds(); boolean location=false; int x=-1,y=-1; for(int i=0;ipointa.length;i+) x=pointai.getx(); y=pointai.gety(); if(rect.contains(x,y) endpoint=pointai; if(i=pointa.length-1&endpoint.ishavedisc()=false) location=true; break; else if(idisc.getnumber() location=true; break; for(int i=0;ipointb.length;i+) x=pointbi.getx(); y=pointbi.gety(); if(rect.contains(x,y) endpoint=pointbi; if(i=pointb.length-1&endpoint.ishavedisc()=false) location=true; break; else if(idisc.getnumber() location=true; break; for(int i=0;ipointc.length;i+) x=pointci.getx(); y=pointci.gety(); if(rect.contains(x,y) endpoint=pointci; if(i=pointc.length-1&endpoint.ishavedisc()=false) location=true; break; else if(idisc.getnumber() location=true; break; if(endpoint!=null&location=true) endpoint.putdisc(disc,con); startpoint.sethavedisc(false); else startpoint.putdisc(disc,con); public void mouseentered(mouseevent e) public void mouseexited(mouseevent e) public void mouseclicked(mouseevent e)6.4hannoiwindow 代码package hannoi;import java.awt.event.*;import java.awt.*;public class handlemouse implements mouselistener,mousemotionlistener towerpoint pointa,pointb,pointc; towerpoint startpoint=null,endpoint=null; int leftx,lefty,x0,y0; boolean move=false,counttime=false; container con; handlemouse(container con) this.con=con; public void setpointa(towerpoint pointa) this.pointa=pointa; public void setpointb(towerpoint pointb) this.pointb=pointb; public void setpointc(towerpoint pointc) this.pointc=pointc; public void mousepressed(mouseevent e) move=false; disc d
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 8.1 《梦游天姥吟留别》教学设计 2024-2025学年统编版高中语文必修上册 2024-2025学年统编版高中语文必修上册
- 电池厂员工考勤考核制度
- 五年级体育下册 第三课 向后转走说课稿
- 化肥厂通勤福利制度
- 美容院美容师服务合同
- 第1章网络概述1.2网络的类型 -高中教学同步《信息技术-网络基础》教学设计(人教-中图版2019)
- 8.从生活中吸取设计的灵感说课稿-2025-2026学年初中美术浙教版八年级上册-浙教版
- 七年级地理上册 第三章 第二节 气温的变化与分布说课稿 新人教版
- 安徽省宿州市灵璧实验学校2024-2025学年八年级下学期期中生物试题 (含答案)
- 生态旅游项目招标工作计划编制与可持续发展规划合同
- 2025-2026学年人教鄂教版(2024)小学科学三年级上册(全册)教学设计(附目录P137)
- 钢结构深化设计工作流程
- 落地式钢管脚手架验收记录表
- GA 1814.2-2023铁路系统反恐怖防范要求第2部分:旅客列车
- 个人养老保险重复缴费退费申请表
- 大气污染控制工程课程设计 车间除尘系统设计说明书1
- YY 9706.240-2021医用电气设备第2-40部分:肌电及诱发反应设备的基本安全和基本性能专用要求
- JJF 1059.2-2012用蒙特卡洛法评定测量不确定度
- GA/T 1788.3-2021公安视频图像信息系统安全技术要求第3部分:安全交互
- 省级公开课(一等奖)雨巷-戴望舒课件
- 反不正当竞争法-课件
评论
0/150
提交评论