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

public class connection extends Applet implements Runnable{

   Thread th = null;
   Image os;
   Graphics og;
   int pd[][][] = {{{2,2,2,6},{4,2,4,6},{6,2,6,6},{3,2,5,2},{2,7,6,7}},
                   {{1,1,7,7},{1,2,6,7},{1,4,1,6},{1,3,1,7},{1,5,3,5}},
                   {{3,4,6,4},{6,3,6,6},{7,1,1,7},{3,5,6,5},{3,3,3,6}},
                   {{2,2,6,2},{4,3,4,7},{5,3,7,4},{2,6,6,6},{1,4,3,3}},
                   {{4,3,6,3},{4,4,4,6},{1,4,6,2},{1,5,7,7},{7,1,5,6}},
                   {{2,1,5,6},{3,5,7,7},{1,6,6,6},{5,3,1,5},{1,1,6,3}},
                   {{3,3,3,5},{5,5,5,7},{4,2,6,7},{3,2,2,7},{1,2,7,1}},
                   {{7,1,4,5},{4,3,1,7},{1,1,3,6},{5,2,7,7},{4,2,4,6}},
                   {{3,2,1,7},{3,3,6,4},{6,3,3,6},{4,4,5,7},{1,2,7,1}},
                   {{2,2,2,6},{5,2,6,4},{6,2,6,6},{2,4,6,5},{2,3,3,6}},
                   {{6,2,5,7},{1,5,4,7},{4,1,5,3},{2,2,7,7},{6,1,7,6}},
                   {{1,2,6,2},{1,1,5,3},{1,6,7,6},{2,3,5,1},{1,3,6,6}},
                   {{6,1,2,4},{1,6,3,5},{3,3,5,6},{2,6,6,2},{6,5,7,7}},
                   {{2,2,6,6},{1,4,7,6},{1,1,2,4},{1,6,4,7},{2,6,5,3}},
                   {{3,5,2,7},{2,1,6,6},{4,2,3,7},{3,2,7,4},{1,1,2,6}}};
   int td[][] = new int[9][9];
   int px,py,pc;
   int pn = 0 ,fg,cf;

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

      d_set();

      addMouseListener(
         new MouseAdapter(){
            public void mousePressed(MouseEvent e){
               px = e.getX() / 30 ; py = e.getY() / 30 ;
               if(e.getClickCount() == 2){
                  if((px > 0)&&(px < 8)&&(py > 0)&&(py < 8)){
                     if((td[py][px] > 0)&&(td[py][px] < 6)){
                        td[py][px] = 0;
                        pc = 0;
                     }
                  }
               }
               if((px > -1)&&(px < 8)&&(py > 0)&&(py < 8)){
                  if((td[py][px] > -1)&&(td[py][px] < 6)){
                     pc = td[py][px];
                  }else if((td[py][px] > 5)&&(td[py][px] < 11)){
                     pc = td[py][px] - 5;
                  }
               }else if((px == 4)&&(py == 8)){
                  pn --;
                  if(pn < 0)pn = 0;
                  d_set();
               }else if((px == 6)&&(py == 8)){
                  pn ++;
                  if(pn > 14)pn = 14;
                  d_set();
               }else if((px == 2)&&(py == 8)){
                  d_set();
               }
               repaint();
            }
         }
      );

      addMouseMotionListener(
         new MouseMotionAdapter(){
            public void mouseDragged(MouseEvent e){
               px = e.getX() / 30 ; py = e.getY() / 30 ;
               if((td[py][px] > -1)&&(td[py][px] < 6)){
                  td[py][px] = pc;
               }else if((td[py][px] > 5)&&(td[py][px] < 11)){
                  pc = td[py][px] - 5;
               }
               repaint();
            }
         }
      );
   }

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

      for(int d1 = 1;d1 < 8;d1 ++){
         for(int d2 = 1;d2 < 8;d2 ++){
            d_rect(td[d2][d1],d1,d2);
         }
      }
      og.setColor(Color.black);
      og.setFont(new Font("",Font.BOLD,15));
      og.drawString("reset",55,270);
      og.drawRoundRect(47,250,56,30,10,10);
      og.drawRoundRect(49,252,52,26,8,8);
      if(pn == 0){
         og.setColor(Color.gray);
      }else{
         og.setColor(Color.black);
      }
      og.drawLine(140,255,130,265);
      og.drawLine(140,275,130,265);
      og.drawLine(135,255,125,265);
      og.drawLine(135,275,125,265);
      og.drawLine(134,255,124,265);
      og.drawLine(134,275,124,265);
      if(pn == 14){
         og.setColor(Color.gray);
      }else{
         og.setColor(Color.black);
      }
      og.drawLine(190,255,200,265);
      og.drawLine(190,275,200,265);
      og.drawLine(195,255,205,265);
      og.drawLine(195,275,205,265);
      og.drawLine(196,255,206,265);
      og.drawLine(196,275,206,265);
      og.setColor(Color.black);
      og.setFont(new Font("",Font.BOLD,15));
      if(pn < 9){
         og.drawString("No."+(pn+1),150,272);
      }else{
         og.drawString("No."+(pn+1),145,272);
      }
      fg = 1;
      for(int d1 = 1;d1 < 8;d1 ++){
         for(int d2 = 1;d2 < 8;d2 ++){
            if(td[d2][d1] == 0){
               fg = 0;
            }else if(td[d2][d1] < 6){
               cf = 0;
               if((td[d2][d1] == td[d2][d1+1])||(td[d2][d1] == td[d2][d1+1]-5))cf ++;
               if((td[d2][d1] == td[d2][d1-1])||(td[d2][d1] == td[d2][d1-1]-5))cf ++;
               if((td[d2][d1] == td[d2+1][d1])||(td[d2][d1] == td[d2+1][d1]-5))cf ++;
               if((td[d2][d1] == td[d2-1][d1])||(td[d2][d1] == td[d2-1][d1]-5))cf ++;
               if(cf != 2)fg = 0;
            }else if(td[d2][d1] < 11){
               cf = 0;
               if(td[d2][d1] == td[d2][d1+1]+5)cf ++;
               if(td[d2][d1] == td[d2][d1-1]+5)cf ++;
               if(td[d2][d1] == td[d2+1][d1]+5)cf ++;
               if(td[d2][d1] == td[d2-1][d1]+5)cf ++;
               if(cf != 1)fg = 0;
            }
         }
      }
      if(fg == 1){
         og.setFont(new Font("",Font.BOLD,60));
         og.setColor(Color.black);
         og.drawString("clear!!",52,158);
         og.setColor(Color.red);
         og.drawString("clear!!",50,160);
      }
      g.drawImage(os,0,0,this);
   }

   public void d_rect(int cc,int xx,int yy){
      if(cc == 0){
         og.setColor(new Color(255,250,205));
         og.fillRoundRect(xx*30,yy*30,30,30,7,7);
         og.setColor(Color.gray);
         og.drawRoundRect(xx*30,yy*30,30,30,7,7);
      }else if(cc < 6){
         for(int kk = 1;kk < 16;kk ++){
            switch(cc){
               case 1 : og.setColor(new Color(255 - kk*10,          0,          0)) ; break ;
               case 2 : og.setColor(new Color(          0,255 - kk*10,          0)) ; break ;
               case 3 : og.setColor(new Color(          0,          0,255 - kk*10)) ; break ;
               case 4 : og.setColor(new Color(255 - kk*10,255 - kk*10,          0)) ; break ;
               case 5 : og.setColor(new Color(255 - kk*10,          0,255 - kk*10)) ; break ;
            }
            og.drawRect(xx*30+kk,yy*30+kk,30-kk*2,30-kk*2);
         }
      }else if(cc < 11){
         for(int kk = 1;kk < 16;kk ++){
            switch(cc){
               case  6 : og.setColor(new Color(105 + kk*10,          0,          0)) ; break ;
               case  7 : og.setColor(new Color(          0,105 + kk*10,          0)) ; break ;
               case  8 : og.setColor(new Color(          0,          0,105 + kk*10)) ; break ;
               case  9 : og.setColor(new Color(105 + kk*10,105 + kk*10,          0)) ; break ;
               case 10 : og.setColor(new Color(105 + kk*10,          0,105 + kk*10)) ; break ;
            }
            og.drawRect(xx*30+kk,yy*30+kk,30-kk*2,30-kk*2);
         }
      }
   }

   public void d_set(){
      for(int s1 = 0;s1 < 9;s1 ++){
         td[0][s1] = -1 ; td[8][s1] = -1 ; td[s1][0] = -1 ; td[s1][8] = -1 ;
      }
      for(int s1 = 1;s1 < 8;s1 ++){
         for(int s2 = 1;s2 < 8;s2 ++){
            td[s2][s1] = 0;
         }
      }
      for(int s1 = 0;s1 < 5;s1 ++){
         td[pd[pn][s1][1]][pd[pn][s1][0]] = s1 + 6;
         td[pd[pn][s1][3]][pd[pn][s1][2]] = s1 + 6;
      }
   }

   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 ) ;
   }
}