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

public class hopover extends Applet implements Runnable{

   Thread th = null;
   Image os;
   Graphics og;
   Image kd[] = new Image[2];
   Image ad[] = new Image[8];
   int md[][] = {{1,1,1,3,3},
                 {1,1,1,3,3},
                 {1,1,0,2,2},
                 {3,3,2,2,2},
                 {3,3,2,2,2}};
   int td[][] = new int[5][5];
   int mx,my;
   int px = 2,py = 2;
   int sx = 2,sy = 2;
   int sw = 0,ms = 0;
   Button rep,und;
   Label spa;

   public void init(){
      os = createImage(260,260);
      og = os.getGraphics();
      setBackground(Color.white);

      for(int diy = 0;diy < 5;diy ++){
         for(int dix = 0;dix < 5;dix ++){
            td[diy][dix] = md[diy][dix];
         }
      }
      kd[0] = getImage(getDocumentBase(),"Picture/kuro.gif");
      kd[1] = getImage(getDocumentBase(),"Picture/siro.gif");
      for(int ii = 0;ii < 8;ii ++){
         ad[ii] = getImage(getDocumentBase(),"Picture/ar"+(ii+5)+".gif");
      }

      setLayout(new BorderLayout());
      Panel pan = new Panel();
      pan.setLayout(new FlowLayout());
      pan.add(und = new Button("  undo  "));
      pan.add(spa = new Label("    "));
      pan.add(rep = new Button("  replay  "));
      add("South",pan);

      addMouseListener(
         new MouseAdapter(){
            public void mousePressed(MouseEvent e){
               if(ms == 1){
                  td[sy][sx] = td[my][mx];
                  td[my][mx] = 0;
                  px = sx;py = sy;
                  sx = mx;sy = my;
                  ms = 0;sw = 0;
               }
               repaint();
            }
         }
      );

      addMouseMotionListener(
         new MouseMotionAdapter(){
            public void mouseMoved(MouseEvent e){
               mx = (e.getX() - 30) / 40;
               my = (e.getY() - 30) / 40;
               if((sx == mx+1)&&(sy == my)&&(td[my][mx] == 1)){
                  sw = 1;ms = 1;
               }else if((sx == mx)&&(sy == my+1)&&(td[my][mx] == 1)){
                  sw = 2;ms = 1;
               }else if((sx == mx-1)&&(sy == my)&&(td[my][mx] == 2)){
                  sw = 3;ms = 1;
               }else if((sx == mx)&&(sy == my-1)&&(td[my][mx] == 2)){
                  sw = 4;ms = 1;
               }else if((sx == mx+2)&&(sy == my)&&(td[my][mx] == 1)&&(td[my][mx+1] == 2)){
                  sw = 5;ms = 1;
               }else if((sx == mx)&&(sy == my+2)&&(td[my][mx] == 1)&&(td[my+1][mx] == 2)){
                  sw = 6;ms = 1;
               }else if((sx == mx-2)&&(sy == my)&&(td[my][mx-1] == 1)&&(td[my][mx] == 2)){
                  sw = 7;ms = 1;
               }else if((sx == mx)&&(sy == my-2)&&(td[my-1][mx] == 1)&&(td[my][mx] == 2)){
                  sw = 8;ms = 1;
               }else{
                  sw = 0;ms = 0;
               }
               repaint();
            }
         }
      );
      rep.addActionListener(new ActionListener(){
         public void actionPerformed(ActionEvent e){
            for(int diy = 0;diy < 5;diy ++){
               for(int dix = 0;dix < 5;dix ++){
                  td[diy][dix] = md[diy][dix];
               }
            }
            sx = 2;sy = 2;px = 2;py = 2;
            repaint();
         }
      });
      und.addActionListener(new ActionListener(){
         public void actionPerformed(ActionEvent e){
                  td[sy][sx] = td[py][px];
                  td[py][px] = 0;
                  sx = px;sy = py;
            repaint();
         }
      });
   }

   public void paint(Graphics g){
      og.setColor(Color.white); 
      og.fillRect(0,0,260,260);

      og.setColor(new Color(255,204,255));
      for(int dly = 0;dly < 3;dly ++){
         for(int dlx = 0;dlx < 3;dlx ++){
            og.fill3DRect(40*dlx+30,40*dly+30,40,40,true);
            og.fill3DRect(40*dlx+110,40*dly+110,40,40,true);
         }
      }

      switch(sw){
         case 0 : break;
         case 1 : og.drawImage(ad[1],40*mx+50,40*my+28,this) ; break;
         case 2 : og.drawImage(ad[3],40*mx+32,40*my+50,this) ; break;
         case 3 : og.drawImage(ad[0],40*mx+10,40*my+28,this) ; break;
         case 4 : og.drawImage(ad[2],40*mx+26,40*my+10,this) ; break;
      }

      for(int iy = 0;iy < 5;iy ++){
         for(int ix = 0;ix < 5;ix ++){
            if((td[iy][ix] > 0)&&(td[iy][ix] < 3)){
               og.drawImage(kd[td[iy][ix]-1],40*ix+35,40*iy+35,this);
            }
         }
      }

      switch(sw){
         case 0 : break;
         case 5 : og.drawImage(ad[5],40*mx+65,40*my+28,65,43,this) ; break;
         case 6 : og.drawImage(ad[7],40*mx+32,40*my+65,43,65,this) ; break;
         case 7 : og.drawImage(ad[4],40*mx-29,40*my+28,65,43,this) ; break;
         case 8 : og.drawImage(ad[6],40*mx+26,40*my-28,43,65,this) ; break;
      }
      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) ;
   }

}