JAVA图形界面程序汉诺塔演示程序代码Word文档格式.docx
《JAVA图形界面程序汉诺塔演示程序代码Word文档格式.docx》由会员分享,可在线阅读,更多相关《JAVA图形界面程序汉诺塔演示程序代码Word文档格式.docx(15页珍藏版)》请在冰豆网上搜索。
topPanel.setBounds(10,0,160,30);
leftLeg.setBackground(Color.red);
leftLeg.setBounds(35,30,30,50);
rightLeg.setBackground(Color.red);
rightLeg.setBounds(115,30,30,50);
name.setBounds(70,100,60,30);
for(inti=0;
i<
maxsize;
i++)//记录型数组,记录该桌子上放的是哪些盘子,数组元素值为盘子下标。
record[i]=-1;
}
publicvoidSetrecord(inty)//修改记录数组
record[num-1]=y;
//记录最上面的盘子的序号
publicvoidDeleoneRecord()//当移走某个盘子时,置相应的数组值为-1
record[num-1]=-1;
publicvoidSetinitialxy(intx)//修改下一个盘子的盘放位置
initialx=x;
publicvoidSettopxy()
topx=initialx+num*5;
topy=initialy-num*10;
publicvoidSettopx(intx)
topx=initialx+x*5;
publicvoidclear()
num=0;
publicvoidaddone()
this.num++;
publicvoidsubone()
this.num--;
}
classMainPanelextendsJPanel
//
Deska,b,c;
intspeed;
//移动速度
intdefaultnum=3;
//初始盘子数
booleanchangnum;
Labelplate[]=newLabel[maxsize];
intbigestsize=140;
intplateHeight=10;
intinitialx=80;
intinitialy=340;
intmoveSpeed=0;
//默认为快速完成
intsteps=0;
//完成步数
publicTextFieldshowAnswer=newTextField("
结果显示区"
);
MainPanel()
for(intk=0;
k<
k++)
{
plate[k]=newLabel();
}
a=newDesk("
A座"
b=newDesk("
B座"
c=newDesk("
C座"
this.setLayout(null);
this.setSize(700,600);
this.setBackground(Color.orange);
this.add(a);
this.add(b);
this.add(c);
this.add(showAnswer);
a.setLocation(60,350);
b.setLocation(320,350);
c.setLocation(580,350);
showAnswer.setBounds(300,50,200,25);
showAnswer.setEditable(false);
this.proplate(defaultnum);
//初始化时产生的默认数量的盘子
this.setSize(850,650);
a.Setinitialxy(80);
b.Setinitialxy(340);
c.Setinitialxy(600);
a.Settopxy();
b.Settopxy();
c.Settopxy();
changnum=false;
validate();
publicvoidChangeDefault(intx)
this.defaultnum=x;
changnum=true;
publicvoidRemoveAllPlate()
{
for(inti=0;
i++)
this.remove(plate[i]);
publicvoidproplate(intsum)
showAnswer.setText("
steps=0;
if(changnum==true)
this.RemoveAllPlate();
a.clear();
b.clear();
c.clear();
a.Settopxy();
b.Settopxy();
c.Settopxy();
for(intsu=0;
su<
sum;
su++)
plate[su].setText("
"
+su);
plate[su].setBackground(Color.black);
plate[su].setForeground(Color.red);
plate[su].setVisible(true);
this.add(plate[su]);
a.addone();
//A座盘子数加1
a.Setrecord(su);
//修改桌子A的记录数组
plate[su].setBounds(initialx+su*5,initialy-su*plateHeight,bigestsize-10*su,plateHeight);
publicvoidhanoi(intn,Deskone,Desktwo,Deskthree)
if(n==1)
move(one,three);
else
{
hanoi(n-1,one,three,two);
hanoi(n-1,two,one,three);
publicvoidmove(Deskone,Desktwo)
//首先实现移动最顶端的盘子
//要做的事情包括修改相应的桌子上的盘子数,及下个盘子要放的位置,还有更新记录数组。
intno;
//正在搬运的盘子的序号
doublework;
//取得盘子上的序号
//下面的工作是找到要移动的盘子的序号
intmovewhich;
movewhich=one.record[one.num-1];
//定制移动路线
//先向上运动到制高点
intx;
inty;
x=plate[movewhich].getX();
y=plate[movewhich].getY();
two.Settopx(movewhich);
intstepleftright=(two.topx-x)/Math.abs(two.topx-x);
//
while(y!
=200)
y=y-1;
plate[movewhich].setLocation(x,y);
try{
Thread.sleep(moveSpeed);
}catch(InterruptedExceptione){
//TODO自动生成catch块
e.printStackTrace();
}
//水平方向运动
while(x!
=two.topx)
x=x+stepleftright;
//this.repaint();
Thread.sleep(moveSpeed);
}catch(InterruptedExceptione){
//TODO自动生成catch块
e.printStackTrace();
}
while(y!
=two.topy)
{
y=y+1;
plate[movewhich].setLocation(x,y);
try{
one.DeleoneRecord();
//表示该盘子移走了
work=Double.parseDouble(plate[movewhich].getText());
no=(int)work;
System.out.print(no);
one.subone();
//盘子数减少1
two.addone();
//盘子数加1
two.Setrecord(no);
//桌子2上的记录数组添加1个元素
one.Settopxy();
//修改1座上下个盘子的位置
two.Settopxy();
//修改2座......
//设计函数实现下面的语句
Stringstring="
当前搬运动作为:
"
+one.name.getText()+"
--->
+two.name.getText();
showAnswer.setText(string);
steps++;
classMainFrameextendsFrame
MenuBarmenubar;
Menudisplay,help,speed,num;
MenuItemstart,quit,paush,declare,introdue,speed1,speed2,speed3,num1,num2,num3,num4,num5;
MenuActionRereplay=newMenuActionRe();
MainPanelmainpanel=newMainPanel();
MainFrame()
MainFrame(Strings)
super(s);
setTitle(s);
menubar=newMenuBar();
display=newMenu("
演示"
help=newMenu("
帮助"
start=newMenuItem("
开始"
speed=newMenu("
选择速度"
num=newMenu("
盘子数量"
quit=newMenuItem("
退出"
quit.addActionListener(replay);
paush=newMenuItem("
暂停"
declare=newMenuItem("
说明"
introdue=newMenuItem("
介绍"
speed1=newMenuItem("
快速完成"
speed2=newMenuItem("
适中速度"
speed3=newMenuItem("
较慢实现"
num1=newMenuItem("
3"
num1.addActionListener(replay);
num2=newMenuItem("
5"
num2.addActionListener(replay);
num3=newMenuItem("
7"
num3.addActionListener(replay);
num4=newMenuItem("
9"
num4.addActionListener(replay);
num5=newMenuItem("
12"
num5.addActionListener(replay);
display.add(start);
start.addActionListener(replay);
display.add(speed);
display.add(num);
display.add(quit);
speed.add(speed1);
speed1.addActionListener(replay);
speed.add(speed2);
speed2.addActionListener(replay);
speed.add(speed3);
speed3.addActionListener(replay);
num.add(num1);
num.add(num2);
num.add(num3);
num.add(num4);
num.add(num5);
help.add(declare);
declare.addActionListener(replay);
help.add(introdue);
introdue.addActionListener(replay);
menubar.add(display);
menubar.add(help);
menubar.setFont(newFont("
Font.BOLD,14));
setMenuBar(menubar);
this.add(mainpanel,BorderLayout.CENTER);
setVisible(true);
setBounds(200,50,850,650);
classMenuActionReimplementsActionListener
publicvoidactionPerformed(ActionEventevent){
//TODO自动生成方法存根
if(event.getSource()==quit)
System.exit(0);
//退出
}elseif(event.getSource()==start)
if(mainpanel.a.num==0)
//说明已经搬完了,是要重新开始啦
mainpanel.proplate(mainpanel.defaultnum);
mainpanel.c.clear();
mainpanel.a.Settopxy();
mainpanel.b.Settopxy();
mainpanel.c.Settopxy();
mainpanel.hanoi(mainpanel.defaultnum,mainpanel.a,mainpanel.b,mainpanel.c);
mainpanel.showAnswer.setText("
搬运结束,搬运次数为:
+mainpanel.steps);
}elseif(event.getSource()==declare)
Help1dialog=newHelp1();
dialog.setVisible(true);
}elseif(event.getSource()==introdue)
Help2dialog=newHelp2();
}elseif(event.getSource()==num1)
mainpanel.ChangeDefault(3);
}elseif(event.getSource()==num2)
mainpanel.ChangeDefault(5);
}elseif(event.getSource()==num3)
mainpanel.ChangeDefault(7);
}elseif(event.getSource()==num4)
mainpanel.ChangeDefault(9);
}elseif(event.getSource()==num5)
mainpanel.ChangeDefault(12);
}elseif(event.getSource()==speed1)
//快速完成
mainpanel.moveSpeed=0;
}elseif(event.getSource()==speed2)
//适中速度
mainpanel.moveSpeed=2;
}elseif(event.getSource()==speed3)
//较慢完成
mainpanel.moveSpeed=6;
classHelp1extendsJDialog{
JPanelpanel1=newJPanel();
JLabeljLabel1=newJLabel("
<
html>
pre>
作者:
徐小龙(中国石油大学)<
br>
2010年11月20日<
/pre>
/html>
JLabeljLabel2=newJLabel();
GridLayoutgridLayout1=newGridLayout();
Help1(){
super(newMainFrame(),"
程序说明"
false);
setBounds(400,150,360,260);
jLabel2.setText("
使用说明:
<
通过演示菜单来控制程序的运行,<
可以选择不同的移动速度,<
也可以定制盘子的数量。
panel1.add(jLabel1,BorderLayout.NORTH);
panel1.add(jLabel2,BorderLayout.CENTER);
setResizable(false);
getContentPane().add(panel1);
classHelp2extendsJDialog{
Help2(){
汉诺塔问题介绍"
汉诺塔问题:
有若干个大小各不相同的盘子,<
有三个桌子A、B、C,开始时,<
盘子全部位于A桌上,现要将<
盘子从"
+
"
A桌上移动到C桌上,<
过程中要保证大盘子不能放到<
小盘子上面,且每次只能移动一个盘子。
publicclassHanoiDisply{
publicstat