⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hanoijava.java

📁 编写程序实现汉诺塔问题 如果行的话尽快发邮件通知我
💻 JAVA
字号:
import java.awt.*;
import java.awt.event.*;
public class hanoijava extends Frame implements ActionListener,TextListener,ItemListener //定义新窗口类
{ static int n=1;           //初始化盘子个数
    static int timect=18;       //演示的时间设置为中速
    static int xh=500;       //原柱的的高度
    static int yh=550;       //中间柱的的高度
    static int zh=550;       //目的柱的的高度
    static hanoijava frm=new hanoijava();    //创建窗口对象
 static Label lab1=new Label("请输入盘子个数(1~10)");  
 static TextField txt1=new TextField(2);  //创建取得用户定义的盘子个数的文本区
 static Label lab2=new Label("演示速度");
 static Checkbox ckb1=new Checkbox("快");       //用户对演示的时间设置所使用的单选框
 static Checkbox ckb2=new Checkbox("中");
 static Checkbox ckb3=new Checkbox("慢");
 static Button btn1=new Button("演示");   //创建按钮
 static Button btn2=new Button("退出");
 static Button btn3=new Button("刷新");
 static Label lab[]=new Label[10];    //使用标签对象做盘子,最多10个盘
  
 public static void main(String args[])   
 { CheckboxGroup grp=new CheckboxGroup();  //创建单选框组
  btn1.addActionListener(frm);    //设置按钮的事件监听者为FRM
  btn2.addActionListener(frm);
  btn3.addActionListener(frm);
  txt1.addTextListener(frm);     //设置文本的事件监听者为FRM
  ckb1.setCheckboxGroup(grp);     //设置单选框的组grp
  ckb2.setCheckboxGroup(grp);
  ckb3.setCheckboxGroup(grp);
  ckb1.addItemListener(frm);     //设置单选框的事件监听者为FRM    
  ckb2.addItemListener(frm);
  ckb3.addItemListener(frm);
  frm.setResizable(false);     //设置窗口不可改变大小
  frm.setLayout(null);
  frm.setTitle("汉诺塔问题的直观演示");
  frm.setSize(800,600);
  frm.setBackground(Color.pink);
  lab1.setBounds(20,560,150,15);    //初始所有标签,按钮,文本框,单选框的位置
  txt1.setBounds(170,560,20,15);
  lab2.setBounds(20,580,60,15);
  ckb1.setBounds(90,580,30,15);
  ckb2.setBounds(120,580,30,15);
  ckb3.setBounds(150,580,30,15);
  btn1.setBounds(340,560,120,30);
  btn2.setBounds(600,560,120,30);
  btn3.setBounds(340,560,120,30);
  frm.add(txt1);        //加载标签,按钮,文本框,单选框到窗口
  frm.add(lab1);
  frm.add(lab2);
  frm.add(btn1);
  frm.add(btn2);
  frm.add(btn3);
  frm.add(ckb1);
  frm.add(ckb2);
  frm.add(ckb3);
  frm.setVisible(true);      //设置各组件对象是否可见
  btn1.setVisible(false);
  btn3.setVisible(false);
  frm.addWindowListener(new WindowAdapter()  //设置窗口关闭按钮是可用
  {public void windowClosing(WindowEvent e)
     {System.exit(0);
     }
  });
 }
 
 public void paint(Graphics g)     //绘制塔柱的位置
 { g.drawLine(20,550,260,550);
  g.drawLine(140,50,140,550);
  g.drawLine(280,550,520,550);
  g.drawLine(400,50,400,550);
  g.drawLine(540,550,780,550);
  g.drawLine(660,50,660,550);
 }
 
 public void actionPerformed(ActionEvent e)      //设置按钮事件
 { Button btn=(Button) e.getSource();
  if(btn==btn1)     //btn1为演示开始按钮
  { 
      for(int i=0;i<=n-1;i++)    //建立盘子对象并加载到窗口
   { lab[i]=new Label();
     lab[i].setSize(24*(i+1),50);
     lab[i].setLocation(140-lab[i].getWidth()/2,550-lab[i].getHeight()*(n-i));
     lab[i].setBackground(Color.red);
     frm.add(lab[i]);
   }
   btn1.setVisible(false);
   for(double i=1;i<=Math.pow(10,6);i++); 
     frm.hanoi(lab,n,140,400,660);    //汉诺塔演示的核心程序的调用
   btn3.setVisible(true);   //演示结束显示刷新按钮
   txt1.setVisible(false);   
  }
  if(btn==btn3)      //刷新,回到初始状态
  {  btn3.setVisible(false);
     btn1.setVisible(true);
     for(int i=0;i<=n-1;i++)
         frm.remove(lab[i]);
     txt1.setVisible(true);
             xh=550-50*n;
         yh=550;
               zh=550;
  }
  if(btn==btn2)     //退出
    System.exit(0);
 }
 public void textValueChanged(TextEvent e)    //的到用户指定的盘子的个数
 { TextField txt=(TextField) e.getSource();
    if(txt==txt1)
    { try{n=Integer.parseInt(txt1.getText());}   //对输入的异常处理
       catch(NumberFormatException f){btn1.setVisible(false);
           return;} 
        if(n>0&&n<=10)   //对输入的异常处理
        { xh=550-50*n;
        btn1.setVisible(true);
     }else
  btn1.setVisible(false);       
     }
 }
 
 
 public void itemStateChanged(ItemEvent e)   //用户设置演示中盘子移动快慢
 {if(ckb1.getState()==true)
  timect=17;
  if(ckb2.getState()==true)
   timect=18;
   if(ckb3.getState()==true)
    timect=19;
 }
 
 public void settimectr(int timectc)   //移动的间隔时间
 {for(double h=1;h<=Math.pow(2,(double)timectc);h++);}
 
 public void setactcolor(Label labl[],int ncl)  //盘子移动时的颜色,绿色
 {labl[ncl-1].setBackground(Color.green);
 }
 public void setcolorbak(Label labl[],int ncl) //盘子静止时的颜色,红色
 {labl[ncl-1].setBackground(Color.red);
 }
 
 
 public void hanoi(Label labc[],int nc,int xc,int yc,int zc)  //汉诺塔演示的核心程序,递归实现
 { if(nc==1)
  {setactcolor(labc,1); 
    settimectr(timect);  
    move(labc,xc,1,zc);   //当只有一个盘子时直接从原柱移动到目的柱
    settimectr(timect);
    setcolorbak(labc,1);
  }
  else{       
   hanoi(labc,nc-1,xc,zc,yc);//当有N个盘子时,先把上面N-1个盘子移动到辅助的柱子上
   setactcolor(labc,nc); 
   settimectr(timect);
   move(labc,xc,nc,zc);  //移动第N个盘子到目的柱
   settimectr(timect);
   setcolorbak(labc,nc);
      hanoi(labc,nc-1,yc,xc,zc);//把剩下的N-1个盘子从辅助的柱子移动到目的柱
   }
 }
 
 public void move(Label labb[],int xb,int nb,int zb)  //移动操作
 { if(xb==140&&zb==660)
   {labb[nb-1].setLocation(660-labb[nb-1].getWidth()/2,zh-50);
   xh=xh+50;
   zh=zh-50;
   }
   if(xb==140&&zb==400)
   {labb[nb-1].setLocation(400-labb[nb-1].getWidth()/2,yh-50);
   xh=xh+50;
   yh=yh-50;
   }
   if(xb==400&&zb==660)
   {labb[nb-1].setLocation(660-labb[nb-1].getWidth()/2,zh-50);
   yh=yh+50;
   zh=zh-50;
   }
   if(xb==400&&zb==140)
   {labb[nb-1].setLocation(140-labb[nb-1].getWidth()/2,xh-50);
   yh=yh+50;
   xh=xh-50;
   }
   if(xb==660&&zb==400)
   {labb[nb-1].setLocation(400-labb[nb-1].getWidth()/2,yh-50);
   zh=zh+50;
   yh=yh-50;
   }
    if(xb==660&&zb==140)
   {labb[nb-1].setLocation(140-labb[nb-1].getWidth()/2,xh-50);
   zh=zh+50;
   xh=xh-50;
   }
 }
} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -