import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;

public class T_hanoi extends Applet implements Runnable{

   Image mp;
   Image pd[] = new Image[5];
   int no,cn,fg,ct;
   int mx,my;
   int dx,dy;
   int ux,uy;
   int cx,cy;
   int td0[][] = {{0,1,2,3,4,5},
                  {0,0,0,0,0,5},
                  {0,0,0,0,0,5}};
   int td[][] = {{0,1,2,3,4,5},
                 {0,0,0,0,0,5},
                 {0,0,0,0,0,5}};
   int ht0[] = {4,0,0};
   int ht[] = {4,0,0};
   Button rep;
   Thread th = null;
   Image os;
   Graphics og;

   public void init(){
      for(int i = 0;i < 5;i ++){
           pd[i] = getImage(getDocumentBase(),"Picture/tw"+i+".gif");
      }
       setBackground(Color.white);
       os = createImage(550,250);
       og = os.getGraphics();
       addMouseListener(
            new MouseAdapter(){
                 public void mousePressed(MouseEvent e){
                      dx = (e.getX() - 50) / 150;
                      dy = (e.getY() - 30) / 30;
                      if(5 - dy == ht[dx]){
                           cn = td[dx][dy];
                           td[dx][dy] = 0;
                           mp = pd[cn];
                           mx = e.getX() - 75;
                           my = e.getY() - 30;
                           ht[dx] --;
                           cx = dx;
                           cy = dy;
                           fg = 1;
                      }else{
                           fg = 0;
                      }
                      repaint();            
                 }

                 public void mouseReleased(MouseEvent e){
                      ux = (e.getX() - 50) / 150;
                      if(ux < 0)ux = 0;
                      if(ux > 2)ux = 2;
                      if(fg == 1){
                        if(td[ux][5 - ht[ux]] > cn){
                           td[ux][4-ht[ux]] = cn;
                           mp = getImage(getDocumentBase(),"");
                           mx = e.getX() - 75;
                           my = e.getY() - 30;
                           ht[ux] ++;
                           ct ++;
                           fg = 0;
                        }else{
                           td[cx][cy] = cn;
                           mp = getImage(getDocumentBase(),"");
                           mx = e.getX() - 75;
                           my = e.getY() - 30;
                           ht[cx] ++;
                           fg = 0;
                        }
                      }else{
                      }
                      repaint(); 
                 }
           }
        );

        addMouseMotionListener(
            new MouseMotionAdapter(){
                 public void mouseDragged(MouseEvent e){
                      mx = e.getX() - 75;
                      my = e.getY() - 30;
                      repaint();
                 }                 
            }
        );
    setLayout(new BorderLayout());
    Panel pan = new Panel();
    pan.setLayout(new FlowLayout());
    pan.add(rep = new Button("  replay  "));
    add("South",pan);
    rep.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
          for(int i = 0;i < 3;i ++){
            for(int j = 0;j < 5;j ++){
              td[i][j] = td0[i][j];
            }
          }
          for(int i = 0;i < 3;i ++){
              ht[i] = ht0[i];
          }
          ct = 0;
          repaint();
        }
    });
   }

   public void paint(Graphics g){
     og.setColor(Color.white); 
     og.fillRect(0,0,550,250);
     og.setColor(Color.black); 
     og.setFont(new Font("Century",Font.PLAIN,20));
     og.drawString("count= "+ct,230,210);
     for(int t = 0;t < 3;t ++){
        for(int s = 4;s >= 0;s --){
           no = td[t][s];
           og.drawImage(pd[no],150 * t + 50,30 * s,this);
        }
     }
     og.drawImage(mp,mx,my,this);
     g.drawImage(os,0,0,this);
   }
   public void start(){    
      if(th == null){
         th = new Thread(this);
         th.start();
      }
   }

   public void stop(){
      th = null;
   }

   public void run(){
      while(th != null){
         try{
            Thread.sleep(100);
         }
         catch (InterruptedException e){
         }
      }
   }

   public void update( Graphics g ){
      paint( g ) ;
   }
}