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

public class M_square extends Applet implements Runnable{

   Image no[] = new Image[17];
   Image mp;
   int td[][] = {{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
                 {-1, 0, 0, 0, 0,-1,-1,-1,-1,-1},
                 {-1, 0, 0, 0, 0,-1,-1,-1,-1,-1},
                 {-1, 0, 0, 0, 0,-1,-1,-1,-1,-1},
                 {-1, 0, 0, 0, 0,-1,-1,-1,-1,-1},
                 {-1, 1, 2, 3, 4, 5, 6, 7, 8,-1},
                 {-1, 9,10,11,12,13,14,15,16,-1},
                 {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}};
   int px[] = {1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8};
   int py[] = {5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6};
   int mx,my;
   int dx,dy;
   int ux,uy;
   int cx,cy;
   int cn;
   int fg;
   int pdx[][] = {{342,372,342,372},
                  {342,352,342,352},
                  {362,372,362,372},
                  {352,372,362,342},
                  {472,482,472,482},
                  {482,492,482,492},
                  {462,472,462,472},
                  {482,492,472,462}};
   int pdy[][] = {{72,72,102,102},
                  {132,132,142,142},
                  {212,212,222,222},
                  {252,262,282,272},
                  {82,82,92,92},
                  {132,132,142,142},
                  {212,212,222,222},
                  {252,272,282,262}};
  Thread th = null;
  Image os;
  Graphics og;

   public void init(){
       setBackground(Color.white);
       os = createImage(600,430);
       og = os.getGraphics();
       for(int i = 0;i < 17;i ++){
             no[i] = getImage(getDocumentBase(),"Picture/no"+i+".gif");
       }

       addMouseListener(
            new MouseAdapter(){
                 public void mousePressed(MouseEvent e){
                      dx = e.getX() / 60;
                      dy = e.getY() / 60;
                      if(td[dy][dx] > 0){
                           cn = td[dy][dx];
                           td[dy][dx] = 0;
                           mp = no[cn];
                           mx = e.getX() - 30;
                           my = e.getY() - 30;
                           cx = px[cn - 1];
                           cy = py[cn - 1];
                           px[cn -1] = -1;
                           py[cn -1] = -1;
                           fg = 1;
                      }else{
                           fg = 0;
                      }
                      repaint();            
                 }

                 public void mouseReleased(MouseEvent e){
                      ux = e.getX() / 60;
                      uy = e.getY() / 60;
                      if(fg == 1){
                         if(td[uy][ux] == 0){
                             td[uy][ux] = cn;
                             px[cn - 1] = ux;
                             py[cn - 1] = uy;
                             mx = ux * 60;
                             my = uy * 60;
                             mp = getImage(getDocumentBase(),"");
                             fg = 0;
                         }else{
                             td[cy][cx] = cn;
                             px[cn - 1] = cx;
                             py[cn - 1] = cy;
                             mx = cx * 60;
                             my = cy * 60;
                             mp = getImage(getDocumentBase(),"");
                             fg = 0;
                         }
                      }else{
                      }
                      repaint();
                 }         
            }
        );

        addMouseMotionListener(
            new MouseMotionAdapter(){
                 public void mouseDragged(MouseEvent e){
                      mx = e.getX() - 30;
                      my = e.getY() - 30;
                      repaint();
                 }                 
            }
        );
   }

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

       for(int k = 0;k < 5;k ++){
             og.drawLine(60,60 * k + 60,300,60 * k + 60);
             og.drawLine(60 * k + 60,60,60 * k + 60,300);
       }
       for(int j1 = 0;j1 < 4;j1 ++){
          for(int j2 = 0;j2 < 5;j2 ++){
             og.drawLine(340,j1 * 60 + j2 * 10 + 70,380,j1 * 60 + j2 * 10 + 70);
             og.drawLine(j2 * 10 + 340,j1 * 60 + 70,j2 * 10 + 340,j1 * 60 + 110);
             og.drawLine(460,j1 * 60 + j2 * 10 + 70,500,j1 * 60 + j2 * 10 + 70);
             og.drawLine(j2 * 10 + 460,j1 * 60 + 70,j2 * 10 + 460,j1 * 60 + 110);
          }
       }
       og.setColor(Color.blue);
       for(int r1 = 0;r1 < 8;r1 ++){
          for(int r2 = 0;r2 < 4;r2 ++){
             og.fillRect(pdx[r1][r2],pdy[r1][r2],7,7); 
          }
       }
       og.setColor(Color.black);
       for(int k = 0;k < 5;k ++){
             og.fillRect(75 + 60 * k,15,30,30);
             og.fillRect(15,60 * k + 15,30,30);
             }
       for(int k = 0;k < 4;k ++){
             og.fillRect(405,75 + 60 * k,30,30);
             og.fillRect(525,75 + 60 * k,30,30);
             }
       og.setColor(Color.blue);
       for(int k = 0;k < 4;k ++){
             og.drawLine(60 * k + 90,45,60 * k + 90,60);
             og.drawLine(45,60 * k + 90,60,60 * k + 90);
             og.drawLine(380,90 + 60 * k,405,90 + 60 * k);
             og.drawLine(500,90 + 60 * k,525,90 + 60 * k);
             }
             og.drawLine(45,45,60,60);
             og.drawLine(315,45,300,60);
       og.setColor(Color.white);
       og.setFont(new Font("Century",Font.PLAIN,20));
       og.drawString(""+(td[1][1] + td[2][2] + td[3][3] + td[4][4]),20,35);
       og.drawString(""+(td[1][1] + td[1][2] + td[1][3] + td[1][4]),20,95);
       og.drawString(""+(td[2][1] + td[2][2] + td[2][3] + td[2][4]),20,155);
       og.drawString(""+(td[3][1] + td[3][2] + td[3][3] + td[3][4]),20,215);
       og.drawString(""+(td[4][1] + td[4][2] + td[4][3] + td[4][4]),20,275);
       og.drawString(""+(td[1][1] + td[2][1] + td[3][1] + td[4][1]),80,35);
       og.drawString(""+(td[1][2] + td[2][2] + td[3][2] + td[4][2]),140,35);
       og.drawString(""+(td[1][3] + td[2][3] + td[3][3] + td[4][3]),200,35);
       og.drawString(""+(td[1][4] + td[2][4] + td[3][4] + td[4][4]),260,35);
       og.drawString(""+(td[1][4] + td[2][3] + td[3][2] + td[4][1]),320,35);
       og.drawString(""+(td[1][1] + td[1][4] + td[4][4] + td[4][1]),410,95);
       og.drawString(""+(td[1][1] + td[1][2] + td[2][1] + td[2][2]),410,155);
       og.drawString(""+(td[3][3] + td[3][4] + td[4][3] + td[4][4]),410,215);
       og.drawString(""+(td[1][2] + td[2][4] + td[3][1] + td[4][3]),410,275);
       og.drawString(""+(td[2][2] + td[2][3] + td[3][2] + td[3][3]),530,95);
       og.drawString(""+(td[1][3] + td[1][4] + td[2][3] + td[2][4]),530,155);
       og.drawString(""+(td[3][1] + td[3][2] + td[4][1] + td[4][2]),530,215);
       og.drawString(""+(td[1][3] + td[2][1] + td[3][4] + td[4][2]),530,275);

       for(int i = 0;i < 16;i ++){
            og.drawImage(no[i + 1],px[i] * 60,py[i] * 60,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 ) ;
   }
}