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

📄 haniota.java

📁 Java做的汉诺塔
💻 JAVA
字号:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class haniota extends Frame implements ActionListener,Runnable
{
  tower tow=null;
  boolean move=false;
  Button start,stop,auto=null;
  char towerName[]={'A','B','C'};                            
  int dnum,dwidth,dheight;
  Thread thread;
  TextArea text=null;
  private JTextField textf,textp,textk,textj;
  JPanel pane,tssj;
  private JLabel lDiskNum,pausetime,kssj,jssj;
  public haniota()
   { 
      super("汉诺塔--03级软件(2)班  陈伟  3103003333");  
      thread=new Thread(this);
  	  dwidth=148;
  	  dheight=18;	 
      text=new TextArea(14,14);
      text.setText(null);
      text.enable(false);
      textf=new JTextField(8);
      textk=new JTextField(8);
      textj=new JTextField(8);
      textp=new JTextField(8);
      textf.setText(null);
      textp.setText("500");
      textk.setText("2005-1-4");
      textj.setText("2005-1-5");
      textk.enable(false);
      textj.enable(false);
      lDiskNum = new JLabel("盘子的数目");
      pausetime= new JLabel("延迟时间");
      kssj = new JLabel("开始调试时间");
      jssj = new JLabel("结束调试时间");
      pane = new JPanel(); 
      tssj = new JPanel();
      pane.setLayout(new FlowLayout());
      tssj.setLayout(new FlowLayout());
      start=new Button("开始");
      auto=new Button("自动演示");
      stop=new Button("停止");
      start.addActionListener(this);
      stop.addActionListener(this);
      auto.addActionListener(this);
      pane.add(pausetime);
      pane.add(textp);
      pane.add(lDiskNum);
      pane.add(textf);
      pane.add(start);
      pane.add(stop);
      pane.add(auto);
      tssj.add(kssj);
      tssj.add(textk);
      tssj.add(jssj);
      tssj.add(textj);
      pane.setBackground(Color.blue);
      tssj.setBackground(Color.blue);
      add(tssj,BorderLayout.NORTH);
      add(text,BorderLayout.EAST);
      add(pane,BorderLayout.SOUTH);
      addWindowListener(new WindowAdapter()
                 { public void windowClosing(WindowEvent e)
                     { System.exit(0);
      	             }
                 });
      setVisible(true);
      setBounds(60,20,670,540);
      validate();
   }
 public void actionPerformed(ActionEvent e)
 {
 	if(e.getSource()==start)
       {
          if(!(thread.isAlive()))
          {
          	
          	thread=new Thread(this);
          }
          try
          { 
            move=false;
          	thread.start();
        	dnum=Integer.parseInt(textf.getText());
        	this.remove(tow);
            text.setText(null);
            validate();
          }
       catch(Exception eee)
          {
          }
       }
 	if(e.getSource()==stop)
    {
       if(thread.isAlive())
       {
        try
        { 
         thread.stop();
        }
        catch(Exception eee)
        {
        }
       }
   }
 	
     if(e.getSource()==auto)
       {
         if(!(thread.isAlive()))
                 {
                   thread=new Thread(this);
                 }
         try
            { 
         	  move=true;
              thread.start();
              this.remove(tow);
              text.setText(null);
              validate();
            }
         catch(Exception eee)
            {
            }
        
       }
   }
 public void run()
   {
     text.setText(null);
     tow=new tower(dnum,dwidth,dheight,towerName,text);
     add(tow,BorderLayout.CENTER);
     validate(); 
    if(move)tow.automove(dnum,towerName[0] ,towerName[1],towerName[2]);
     move=false;
   }

public static void main(String args[])
   {
     new haniota();
   }

public class tower extends JPanel implements MouseListener,MouseMotionListener
{
   tpoint point[];                                                                                               
   boolean move=false;                                         
   tdisk   disk[];                                                                                       
   int sI ; 
   int x,y;
   int sX,sY;
   int disknum=0;
   int width,height;                                           
   char tname[]={'A','B','C'};                            
   TextArea textf=null;                                      
   public  tower(int number,int w,int h,char[] name,TextArea text)
   {
        tname=name;
        disknum=number;
        width=w;
        height=h;
        textf=text;
        setLayout(null);
        addMouseListener(this);
        addMouseMotionListener(this);
        disk= new tdisk[disknum];
        point=new tpoint[3*disknum];   
        this.setBackground(Color.orange);
         int sp=20;  
        for(int i=0;i<disknum;i++)                               
          {
            point[i]=new tpoint(5+width,50+sp,false); 
            sp=sp+height;
          }
        sp=20;
        for(int i=disknum;i<2*disknum;i++)                        
          {
            point[i]=new tpoint(150+width,50+sp,false);
            sp=sp+height;
          }
        sp=20;
        for(int i=2*disknum;i<3*disknum;i++)                     
          {
            point[i]=new tpoint(300+width,50+sp,false);
            sp=sp+height;
          }
       int dwidth=width;                                      
       int small=(int)(dwidth*0.1);
       for(int i=disknum-1;i>=0;i--)                            
          {
             disk[i]=new tdisk(i,this);
             disk[i].setSize(dwidth,height);                   
             dwidth=dwidth-small;
          }
        for(int i=0;i<disknum;i++)                             
          {
            point[i].setdisk(disk[i],this);
            if(i>=1)
            disk[i].setupdisk(true);
            disk[i].setLabel(""+(i+1));
          }
    }
  public void paint(Graphics g)                     
   {
     super.paintComponent(g);
     g.setColor(Color.white);
     int size=4;
     for(int i=0;i<3*disknum;i++)                                    
       {
        g.fillOval(point[i].getX()-size/2,point[i].getY()-size/2,size,size);
       }
     g.drawString(""+tname[0]+"塔",point[disknum-1].getX(),point[disknum-1].getY()+30);
     g.drawString(""+tname[1]+"塔",point[2*disknum-1].getX(),point[disknum-1].getY()+30);
     g.drawString(""+tname[2]+"塔",point[3*disknum-1].getX(),point[disknum-1].getY()+30);
   } 
  public void mousePressed(MouseEvent e)
  { 
    tdisk  disk=null;
    Rectangle rect=null;
    if(e.getSource()==this)                                 
        move=false;
    if(move==false)
      if(e.getSource() instanceof tdisk)
       {
         disk=(tdisk)e.getSource();                          
         sX=disk.getBounds().x;                         
         sY=disk.getBounds().y;          
          rect=disk.getBounds();
          for(int i=0;i<3*disknum;i++)   
            {
               int x=point[i].getX();
               int y=point[i].getY();
                  if(rect.contains(x,y))
                   {                   
                     sI=i;                            
                     break;
                   }
            }
       }
  } 
 public void mouseMoved(MouseEvent e)
  { 
  }
 public void mouseDragged(MouseEvent e)
  {
 
    tdisk disk=null;
       if(e.getSource() instanceof tdisk)
         {
           disk=(tdisk)e.getSource();                        
           move=true; 
           
           e=SwingUtilities.convertMouseEvent(disk,e,this); 
         }
    
       if(e.getSource()==this)
        {
          if(move&&disk!=null)
           {
            x=e.getX(); 
            y=e.getY();
            if(disk.getupdisk()==false)
               disk.setLocation(x-disk.getWidth()/2,y-disk.getHeight()/2);
           }
        }
 }
 public void mouseReleased(MouseEvent e)
  { 
    tdisk disk=null;
    move=false;
    Rectangle rect=null;
    if(e.getSource() instanceof tdisk)
      {
        disk=(tdisk)e.getSource();                            
        rect=disk.getBounds();
         
        e=SwingUtilities.convertMouseEvent(disk,e,this);    
      }
    if(e.getSource()==this)
     {
        boolean cpoint=false;
        int x=0,y=0;
        int eI=0;
        if(disk!=null)
         { 
          for(int i=0;i<3*disknum;i++)
            {
                x=point[i].getX();
                y=point[i].getY();
                if(rect.contains(x,y))
                   { 
                     cpoint=true;
                     eI=i;
                     break;
                  }
            }
         }
        if(disk!=null&&cpoint)
         {
         
           if(point[eI].ifdisk()==true)        
             { 
               disk.setLocation(sX,sY);                        
             } 
          else
             {
 
                if(eI==disknum-1||eI==2*disknum-1||eI==3*disknum-1)  
                 { 
                  point[eI].setdisk(disk,this);                       
                  
                  if(sI!=disknum-1&&sI!=2*disknum-1&&sI!=3*disknum-1)
                    {
                     (point[sI+1].getdisk()).setupdisk(false);
                     point[sI].sethdisk(false);     
                    }
                  else
                    {
                       point[sI].sethdisk(false);  
                    } 
                 } 
                else 
                 { 
                   if(point[eI+1].ifdisk()==true)
                    {
                      tdisk tempDisk=point[eI+1].getdisk();
                      if((tempDisk.getNumber()-disk.getNumber())>=1)
                       {
                        point[eI].setdisk(disk,this);                
                         if(sI!=disknum-1&&sI!=2*disknum-1&&sI!=3*disknum-1)
                          {
                            (point[sI+1].getdisk()).setupdisk(false);
                             point[sI].sethdisk(false); 
                             tempDisk.setupdisk(true);   
                          }
                         else
                          {
                             point[sI].sethdisk(false); 
                             tempDisk.setupdisk(true); 
                          } 
                       }
                      else
                       {
                         disk.setLocation(sX,sY); 
                       }
                    }
                   else
                    {
                      disk.setLocation(sX,sY);                   
                    }
                 } 
            }
        
                
        }
     if(disk!=null&&!cpoint)        
        {        
          disk.setLocation(sX,sY);
        }
     } 
  }
 public void mouseEntered(MouseEvent e)
  {
  }
 public void mouseExited(MouseEvent e)
  { 
  }
 public void mouseClicked(MouseEvent e)
  { 
  }
public void automove(int num,char A,char B,char C)
{
	int sI,eI;  
	if(num==1)
   {
     textf.append(""+A+"塔  -----> "+C+"塔\n");
     tdisk disk=gettopdisk(A);
      sI=gettoppos(A);
      eI=gettopuppos(C);                 
     if(disk!=null)
       {
         point[eI].setdisk(disk,this);
         point[sI].sethdisk(false);
         pause();
       }
    }
  else
    {
      automove(num-1,A,C,B);
	  textf.append(""+A+"塔  -----> "+C+"塔\n");
      tdisk disk=gettopdisk(A);
       sI=gettoppos(A);
       eI=gettopuppos(C);                 
      if(disk!=null)
        {
         point[eI].setdisk(disk,this);
         point[sI].sethdisk(false);
         pause();
        } 
	  automove(num-1,B,A,C);
    }
 }
public tdisk searchdisk(int a,int b)
{
	tdisk disk=null;
	for(int i=a;i<b;i++)
    {
      if(point[i].ifdisk()==true)
        {
          disk=point[i].getdisk();
          break;
        }
    } 
	return disk;
}
public tdisk gettopdisk(char name)
{
  tdisk disk=null;
  if(name==tname[0])disk=searchdisk(0,disknum);
  if(name==tname[1])disk=searchdisk(disknum,2*disknum);
  if(name==tname[2])disk=searchdisk(2*disknum,3*disknum);
 return disk;
} 
public int searchpos(int a,int b,int p)
{
	 int i=0;
	int position=0;
     for(i=a;i<b;i++)
       {
         if(point[i].ifdisk()==true)
           {
             if(p==1)position=Math.max(i-1,0);
             else if(p==2)position=i;
             break;
           }
       } 
     if(i==b)
       {
         position=b-1;
       } 
     return position;
}
public int gettopuppos(char name)
{
  int position=0;
  if(name==tname[0])position=searchpos(0,disknum,1);
  if(name==tname[1])position=searchpos(disknum,2*disknum,1);
  if(name==tname[2])position=searchpos(2*disknum,3*disknum,1);
  return position;
} 
public int gettoppos(char name)
{
  int position=0;
  if(name==tname[0])position=searchpos(0,disknum,2);
  if(name==tname[1])position=searchpos(disknum,2*disknum,2);
  if(name==tname[2])position=searchpos(2*disknum,3*disknum,2); 
  return position;
} 
public void pause()
{
  int pau=Integer.parseInt(textp.getText());
	try{
  Thread.sleep(pau);
 }catch(InterruptedException e){}
}
}
 class tpoint
{
   int x,y;                  
   boolean hdisk;           
   tdisk disk=null;           
   tower t=null;     
   public tpoint(int x,int y,boolean b)
   {
      this.x=x;
      this.y=y;
      hdisk=b;
   }
  public boolean ifdisk()
  {
    return hdisk;
  }
  public void sethdisk(boolean b)
  {
    hdisk=b;
  }
 
  public int getX()
  {
    return x;
  }
  public int getY()
  {
    return y;
  }
  public void setdisk(tdisk disk,tower t)
  {
     this.t=t;
     t.setLayout(null);
     this.disk=disk;
     t.add(disk);
     int w=disk.getBounds().width;
     int h=disk.getBounds().height;
     disk.setBounds(x-w/2,y-h/2,w,h);
     hdisk=true;
     t.validate(); 
  }
  public tdisk getdisk()
  {
     return disk;
  }
}
 class tdisk extends Button
 {
    int num;                 
    boolean updisk=false;
    public tdisk(int number,tower t)
    {
      this.num=number;
      setBackground(Color.red);
      addMouseMotionListener(t);
      addMouseListener(t);
    }
    public boolean getupdisk()
    {
      return updisk;
    }
   public void setupdisk(boolean b)
    {
      updisk=b;
    } 
   public int getNumber()
    {
     return num;
    }
 }

}

⌨️ 快捷键说明

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