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

📄 tower.java

📁 Java做的汉诺塔
💻 JAVA
字号:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
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];                         
         int sp=20;  
        for(int i=0;i<disknum;i++)                               
          {
            point[i]=new tpoint(50+width,50+sp,false); 
            sp=sp+height;
          }
        sp=20;
        for(int i=disknum;i<2*disknum;i++)                        
          {
            point[i]=new tpoint(180+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); 
          }
    }
  public void paint(Graphics g)                     
   {
     super.paintComponent(g);
     //int lx=point[disknum-1].getX()-width;
     //int ly=point[disknum-1].getY();
     //int w=(point[3*disknum-1].getX()+width)-(point[disknum-1].getX()-width);
     //int h=height/2;
     g.setColor(Color.red);
     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 gettopdisk(char name)
{
  tdisk disk=null;
  if(name==tname[0])
    {
       for(int i=0;i<disknum;i++)
         {
           if(point[i].ifdisk()==true)
             {
               disk=point[i].getdisk();
               break;
             }
         }  
    }
   if(name==tname[1])
    {
       for(int i=disknum;i<2*disknum;i++)
         {
           if(point[i].ifdisk()==true)
             {
               disk=point[i].getdisk();
               break;
             }
         }  
    }
    if(name==tname[2])
    {
       for(int i=2*disknum;i<3*disknum;i++)
         {
           if(point[i].ifdisk()==true)
             {
               disk=point[i].getdisk();
               break;
             }
         }  
    }
 return disk;
} 
public int gettopuppos(char name)
{
  int position=0;
  if(name==tname[0])
    {  
       int i=0;
       for(i=0;i<disknum;i++)
         {
           if(point[i].ifdisk()==true)
             {
               position=Math.max(i-1,0);
               break;
             }
         } 
       if(i==disknum)
         {
           position=disknum-1;
         } 
    }
   if(name==tname[1])
    {  
        int i=0;
       for(i=disknum;i<2*disknum;i++)
         {
           if(point[i].ifdisk()==true)
             {
               position=Math.max(i-1,0);
               break;
             }
         } 
        if(i==2*disknum)
         {
           position=2*disknum-1;
         }  
    }
    if(name==tname[2])
    {
       int i=0;
       for(i=2*disknum;i<3*disknum;i++)
         {
           if(point[i].ifdisk()==true)
             {
               position=Math.max(i-1,0);
               break;
             }
         }  
        if(i==3*disknum)
         {
           position=3*disknum-1;
         }  
    }
  return position;
} 
public int gettoppos(char name)
{
  int position=0;
  if(name==tname[0])
    {  
       int i=0;
       for(i=0;i<disknum;i++)
         {
           if(point[i].ifdisk()==true)
             {
               position=i;
               break;
             }
         } 
       if(i==disknum)
         {
           position=disknum-1;
         } 
    }
   if(name==tname[1])
    {  
        int i=0;
       for(i=disknum;i<2*disknum;i++)
         {
           if(point[i].ifdisk()==true)
             {
               position=i;
               break;
             }
         } 
        if(i==2*disknum)
         {
           position=2*disknum-1;
         }  
    }
    if(name==tname[2])
    {
       int i=0;
       for(i=2*disknum;i<3*disknum;i++)
         {
           if(point[i].ifdisk()==true)
             {
               position=i;
               break;
             }
         }  
        if(i==3*disknum)
         {
           position=3*disknum-1;
         }  
    }
  return position;
} 
public void pause()
{
 try{
  Thread.sleep(800);
 }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.blue);
      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 + -