Java程序设计报告.docx
- 文档编号:26167248
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:36
- 大小:90.31KB
Java程序设计报告.docx
《Java程序设计报告.docx》由会员分享,可在线阅读,更多相关《Java程序设计报告.docx(36页珍藏版)》请在冰豆网上搜索。
Java程序设计报告
JAVA技术大作业
院(系)电气与信息工程学院
专业班级计算机科学与技术0902
学生姓名学号
成绩
2011年5月6日
摘要
随着计算机的发展,Hannoi塔也越来越被人们所认识,Hannoi塔中有三个座,名字分别是A、B、C。
初始状态是A座上有3个大小不等的盘子,这些盘子从座底到座顶按照大小顺序依次摆放在A座上。
可以用鼠标选中盘子,然后通过拖动鼠标来移动该盘子、释放鼠标来放置该盘子;在移动盘子过程中,不允许把大盘放置在小盘的上面,最终要完成的是把A座上的全部盘子移动到B座或者C座上。
关键词:
Hannoi塔级别游戏
1Hannoi塔设计内容及要求
1.1设计内容
设计GUI界面的Hannoi塔。
Hannoi塔中有三个座,名字分别是A、B、C。
初始状态是A座上有3个大小不等的盘子,这些盘子从座底到座顶按照大小顺序依次摆放在A座上。
可以用鼠标选中盘子,然后通过拖动鼠标来移动该盘子、释放鼠标来放置该盘子;
1.2设计要求
本设计的Hannoi塔需达到以下要求:
程序要求用户在移动盘子过程中,不允许把大盘放置在小盘的上面,用户最终要完成的是把A座上的全部盘子移动到B座或者C座上;用户可以通过Hannoi塔界面提供的菜单来选中初级、中级和高级三个级别。
初级级别A座上有3个大小不等的盘子、中级级别A座有4个大小不等的盘子、高级为5个;用户可以通过单击Hannoi塔界面上提供的按钮,让程序自动完成把A座上的盘子全部移动到C座上;用户在移动盘子过程中,可以随时单击Hannoi塔界面上提供的按钮,重新开始当前级别的游戏。
2总体设计思路
主要设计Hannoi塔中三个座,名字分别是A、B、C。
初始状态是A座上有3个大小不等的盘子,这些盘子从座底到座顶按照大小顺序依次摆放在A座上。
可以用鼠标选中盘子,然后通过拖动鼠标来移动该盘子、释放鼠标来放置该盘子;在移动盘子过程中,不允许把大盘放置在小盘的上面,最终要完成的是把A座上的全部盘子移动到B座或者C座上。
2.1设计结构
2.1.1结构的编排
用6个类来实现程序的设计,分别是:
HannoiWindow
HandleMouse
Disc
AutoMoveDisc
Tower
TowerPoint
其中HannoiWindow是主类。
2.1.2程序流程图
图2.1程序流程图
2.2设计功能的实现
2.2.1数据结构定义
实现对创建的级别菜单中的初、中、高级事件处理,以及对重新开始、自动演示两个按钮事件的处理
publicvoidactionPerformed(ActionEvente){
if(e.getSource()==oneGradeItem){
amountOfDisc=3;
tower.setAmountOfDisc(amountOfDisc);
tower.putDiscOnTower();
}
elseif(e.getSource()==twoGradeItem){
amountOfDisc=4;
tower.setAmountOfDisc(amountOfDisc);
tower.putDiscOnTower();
}
elseif(e.getSource()==threeGradeItem){
amountOfDisc=5;
tower.setAmountOfDisc(amountOfDisc);
tower.putDiscOnTower();
}
elseif(e.getSource()==renew){
tower.setAmountOfDisc(amountOfDisc);
tower.putDiscOnTower();
}
elseif(e.getSource()==autoButton){
tower.setAmountOfDisc(amountOfDisc);
tower.putDiscOnTower();
intx=this.getBounds().x+this.getBounds().width;
inty=this.getBounds().y;
tower.getAutoMoveDisc().setLocation(x,y);
tower.getAutoMoveDisc().setSize(280,this.getBounds().height);
tower.getAutoMoveDisc().setVisible(true);
}
validate();
}
3详细设计
3.1函数功能结构
实现表示塔点位置的类
publicclassTowerPoint{
intx,y;
booleanhaveDisc;
Discdisc=null;
publicTowerPoint(intx,inty){
this.x=x;
this.y=y;
}
publicbooleanisHaveDisc(){
returnhaveDisc;
}
publicvoidsetHaveDisc(booleanboo){
haveDisc=boo;
}
publicintgetX(){
returnx;
}
publicintgetY(){
returny;
}
publicbooleanequals(TowerPointp){
if(p.getX()==this.getX()&&p.getY()==this.getY())
returntrue;
else
returnfalse;
}
publicvoidputDisc(Componentcom,Containercon){
disc=(Disc)com;
con.setLayout(null);
con.add(disc);
intw=disc.getBounds().width;
inth=disc.getBounds().height;
disc.setBounds(x-w/2,y-h/2,w,h);
haveDisc=true;
disc.setPoint(this);
con.validate();
}
publicDiscgetDiscOnPoint(){
returndisc;
}
publicvoidremoveDisc(Componentcom,Containercon){
if(com!
=null)
con.remove(com);
con.validate();
}
}
4系统测试
4.1系统测试
4.1.1系统测试
图4.1程序开始运行界面
图4.2程序自动演示功能的实现
图4.3程序重新开始按钮功能的实现
图4.4程序多级别选择功能的实现
5总结
通过这次课程设计使我对Hannoi塔这一部分的内容有更深刻的理解,通过Hannoi塔的求解来解决生活中一些实际的问题。
在此次编码时我使用了文件的调用,把一个比较复杂的问题分解,分别针对一个问题进行编码,这使的整个的编码工作量减少些,便于调试时的查错,再将一起存放整和就行了。
这样我就可以在以后的编程的过程中借鉴的,提高效率。
对于算法的确定或给进不能只单独考虑算法的时间复杂度,还应结合整个程序及具体情况综合各种因素最终选取效率最高的算法
6致谢
首先我要感谢学校为我们配备了自主学习中心,让我有一个好的学习环境,
使我们能够专心的学习,仔细的研究我想要做的事;我要感谢我的父母,他们
给了我精神和物质的最大的支持,他们给予我希望,让我有足够的空间进行自
我发挥,去发展自己的爱好;我还要感谢我们的老师为我们辛苦的工作,并且
耐心的为我们讲解,使我们的能更好的理解知识、并应用知识,还为我们的学
习而加班;最后我要感谢我的同学们,在学习过程中讨论帮助我解决遇到的题,
并给我讲解,感谢这么多人的支持,才有了我的今天。
7参考文献
[1]叶核亚,陈道蓄.Java程序设计实用教程[M].北京:
电子工业出版社,2010.
[2]谭浩强.C程序设计(第二版)[M].北京:
清华大学出版社,2001.
8附录
主类函数HannoiWindow
packageHannoiWindow;
importjavax.swing.*;
importjava.awt.*;
importjava.awt.event.*;
publicclassHannoiWindowextendsJFrameimplementsActionListener{
Towertower=null;
intamountOfDisc=3;
char[]towerName={'A','B','C'};
JMenuBarbar;
JMenumenuGrade;
JMenuItemoneGradeItem,twoGradeItem,threeGradeItem;
JButtonrenew=null;
JButtonautoButton=null;
JPanelcenter=newJPanel();
HannoiWindow(){
tower=newTower(towerName);
tower.setAmountOfDisc(amountOfDisc);
tower.setMaxDiscWidth(120);
tower.setMinDiscWidth(50);
tower.setDiscHeight(16);
tower.putDiscOnTower();
add(tower,BorderLayout.CENTER);
bar=newJMenuBar();
menuGrade=newJMenu("选择级别");
oneGradeItem=newJMenuItem("初级");
twoGradeItem=newJMenuItem("中级");
threeGradeItem=newJMenuItem("高级");
menuGrade.add(oneGradeItem);
menuGrade.add(twoGradeItem);
menuGrade.add(threeGradeItem);
bar.add(menuGrade);
setJMenuBar(bar);
oneGradeItem.addActionListener(this);
twoGradeItem.addActionListener(this);
threeGradeItem.addActionListener(this);
renew=newJButton("重新开始");
renew.addActionListener(this);
autoButton=newJButton("自动演示");
autoButton.addActionListener(this);
JPanelnorth=newJPanel();
north.add(renew);
north.add(autoButton);
Stringmess="将全部盘子从"+towerName[0]+"座搬运到"+towerName[1]+
"座或"+towerName[2]+"座";
JLabelhintMess=newJLabel(mess,JLabel.CENTER);
north.add(hintMess);
add(north,BorderLayout.NORTH);
setResizable(false);
setVisible(true);
setBounds(60,60,460,410);
validate();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
/*请实现对创建的级别菜单中的初、中、高级事件处理,以及对重新开始、自动演示两个按钮事件的处理*/
publicvoidactionPerformed(ActionEvente){
if(e.getSource()==oneGradeItem){
amountOfDisc=3;
tower.setAmountOfDisc(amountOfDisc);
tower.putDiscOnTower();
}
elseif(e.getSource()==twoGradeItem){
amountOfDisc=4;
tower.setAmountOfDisc(amountOfDisc);
tower.putDiscOnTower();
}
elseif(e.getSource()==threeGradeItem){
amountOfDisc=5;
tower.setAmountOfDisc(amountOfDisc);
tower.putDiscOnTower();
}
elseif(e.getSource()==renew){
tower.setAmountOfDisc(amountOfDisc);
tower.putDiscOnTower();
}
elseif(e.getSource()==autoButton){
tower.setAmountOfDisc(amountOfDisc);
tower.putDiscOnTower();
intx=this.getBounds().x+this.getBounds().width;
inty=this.getBounds().y;
tower.getAutoMoveDisc().setLocation(x,y);
tower.getAutoMoveDisc().setSize(280,this.getBounds().height);
tower.getAutoMoveDisc().setVisible(true);
}
validate();
}
publicstaticvoidmain(Stringargs[]){
newHannoiWindow();
}
}
AutoMoveDisc类函数
packageHannoiWindow;
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.*;
publicclassAutoMoveDiscextendsJDialogimplementsActionListener{
intamountOfDisc=3;
TowerPoint[]pointA,pointB,pointC;
char[]towerName;
Containercon;
StringBuffermoveStep;
JTextAreashowStep;
JButtonbStart,bStop,bContinue,bClose;
Timertime;
inti=0,number=0;
AutoMoveDisc(Containercon){
setModal(true);
setTitle("自动演示搬盘子过程");
this.con=con;
moveStep=newStringBuffer();
time=newTimer(1000,this);
time.setInitialDelay(10);
showStep=newJTextArea(10,12);
bStart=newJButton("演示");
bStop=newJButton("暂停");
bContinue=newJButton("继续");
bClose=newJButton("关闭");
bStart.addActionListener(this);
bStop.addActionListener(this);
bContinue.addActionListener(this);
bClose.addActionListener(this);
JPanelsouth=newJPanel();
south.setLayout(newFlowLayout());
south.add(bStart);
south.add(bStop);
south.add(bContinue);
south.add(bClose);
add(newJScrollPane(showStep),BorderLayout.CENTER);
add(south,BorderLayout.SOUTH);
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
towerName=newchar[3];
addWindowListener(newWindowAdapter(){
publicvoidwindowClosing(WindowEvente){
time.stop();
setVisible(false);
}
});
}
publicvoidsetPointA(TowerPoint[]pointA){
this.pointA=pointA;
}
publicvoidsetPointB(TowerPoint[]pointB){
this.pointB=pointB;
}
publicvoidsetPointC(TowerPoint[]pointC){
this.pointC=pointC;
}
publicvoidsetTowerName(charname[]){
if(name[0]==name[1]||name[0]==name[2]||name[1]==name[2]){
towerName[0]='A';
towerName[1]='B';
towerName[2]='C';
}
else
towerName=name;
}
publicvoidsetAmountOfDisc(intn){
amountOfDisc=n;
}
/*实现盘子搬动,演示开始、暂停、继续、关闭按钮事件处理*/
publicvoidactionPerformed(ActionEvente){
if(e.getSource()==time){
number++;
charcStart,cEnd;
if(i<=moveStep.length()-2){
cStart=moveStep.charAt(i);
cEnd=moveStep.charAt(i+1);
showStep.append("("+number+")从"+cStart+"座搬一个盘子到"+cEnd+"座\n");
autoMoveDisc(cStart,cEnd);
}
i=i+2;
if(i>=moveStep.length()-1){
time.stop();
}
}
elseif(e.getSource()==bStart){
if(moveStep.length()==0){
if(time.isRunning()==false){
i=0;
moveStep=newStringBuffer();
setMoveStep(amountOfDisc,towerName[0],towerName[1],towerName[2]);
number=0;
time.start();
}
}
}
elseif(e.getSource()==bStop){
if(time.isRunning()==true)
time.stop();
}
elseif(e.getSource()==bContinue){
if(time.isRunning()==false)
time.restart();
}
elseif(e.getSource()==bClose){
time.stop();
setVisible(false);
}
}
privatevoidsetMoveStep(intamountOfDisc,charone,chartwo,charthree){
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);
}
}
privatevoidautoMoveDisc(charcStart,charcEnd){
Discdisc=null;
if(cStart==towerName[0]){
for(inti=0;i if(pointA[i].isHaveDisc()==true){ disc=pointA[i].getDiscOnPoint(); pointA[i].setHaveDisc(false); break; } } } if(cStart==towerName[1]){ for(inti=0;i if(pointB[i].isHaveDisc()==true){ disc=pointB[i].getDiscOnPoint(); pointB[i].setHaveDisc(false); break; } } } if(cStart==towerName[2]){ for(inti=0;i if(pointC[i].isHaveDisc()==true){ disc=pointC[i].getDiscOnPoint(); pointC[i].setHaveDisc(false); break;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 程序设计 报告