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

public class h_matches extends Applet implements Runnable{

   Thread th = null;
   Image os;
   Graphics og;
   int tdb[][][] = {{{-1,-1,0,0,-1},{-1,0,1,0,-1},{0,1,1,0,-1},{0,1,0,-1,-1},{0,0,-1,-1,-1}},
                    {{-1,-1,0,0,0},{-1,0,1,1,0},{0,1,1,0,-1},{0,0,0,-1,-1},{-1,-1,-1,-1,-1}},
                    {{-1,0,0,0,-1},{0,1,1,0,-1},{0,1,1,0,-1},{0,0,0,-1,-1},{-1,-1,-1,-1,-1}}};
   int td[][][] = new int[3][5][5];
   int tdc[][][] = new int[3][5][5];
   int hx[] = new int[9],hy[] = new int[9];
   int cx,cy,cn;
   int mx,my;
   int pd;
   int co,ef,cs;
   int ln,tn;

   public void init(){
      os = createImage(420,320);
      og = os.getGraphics();
      for(int i1 = 0;i1 < 3;i1 ++){
         for(int i2 = 0;i2 < 5;i2 ++){
            for(int i3 = 0;i3 < 5;i3 ++){
               td[i1][i2][i3] = tdb[i1][i2][i3];
            }
         }
      }
      co = 1;
      ln = 6;
      ef = 0;

      addMouseListener(
         new MouseAdapter(){
            public void mousePressed(MouseEvent e){
               if((e.getX()>320)&&(e.getX()<400)&&(e.getY()>250)&&(e.getY()<280)){
                  for(int i1 = 0;i1 < 3;i1 ++){
                     for(int i2 = 0;i2 < 5;i2 ++){
                        for(int i3 = 0;i3 < 5;i3 ++){
                           td[i1][i2][i3] = tdb[i1][i2][i3];
                        }
                     }
                  }
                  co = 1;
                  ln = 6;
                  ef = 0;
               }
               if((e.getY()-(70*((e.getY()-10)/70)+10)) < 20){
                  cn = 1;
                  cy = (e.getY()+35)/70;
                  cx = (e.getX()+60-40*cy)/80;
               }else if(((mx-20)/40+(my-20)/70)%2 == 0){
                  cn = 2;
                  cy = (e.getY()-20)/70;
                  cx = (e.getX()+60-40*cy)/80;
               }else{
                  cn = 3;
                  cy = (e.getY()-20)/70;
                  cx = (e.getX()+60-40*cy)/80;
               }
               if(ef == 0){
                  switch(co){
                     case 1 : if(td[cn-1][cy][cx] == 1){
                                 co = 2;
                                 td[cn-1][cy][cx] = 0;
                              }
                              break;
                     case 2 : if(td[cn-1][cy][cx] == 0){
                                 co = 3;
                                 td[cn-1][cy][cx] = 1;
                              }
                              break;
                     case 3 : if(td[cn-1][cy][cx] == 1){
                                 co = 4;
                                 td[cn-1][cy][cx] = 0;
                              }
                              break;
                     case 4 : if(td[cn-1][cy][cx] == 0){
                                 co = 1;
                                 td[cn-1][cy][cx] = 1;
                                 ln --;
                     //           if(ln == 2)ef = 1;
                              }
                              break;
                  }
               }
               repaint();
            }
         } 
      );

      addMouseMotionListener(
         new MouseMotionAdapter(){
            public void mouseMoved(MouseEvent e){
               mx = e.getX();
               my = e.getY();
               if((mx<340)&&(my<320)){
                  if((my-(70*((my-10)/70)+10)) < 20){
                     pd = 1;
                  }else if(((mx-20)/40+(my-20)/70)%2 == 0){
                     pd = 2;
                  }else{
                     pd = 3;
                  }
               repaint();
               }
            }
         }
      );
   }

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

      og.setColor(Color.lightGray);
      for(int dx = 0;dx < 4;dx ++){
         for(int dy = 0;dy < 5;dy ++){
            if(td[0][dy][dx] != -1)og.drawLine(80*dx+40*dy-60,70*dy+20,80*dx+40*dy+20,70*dy+20);
         }
      }
      for(int dx = 0;dx < 5;dx ++){
         for(int dy = 0;dy < 4;dy ++){
            if(td[1][dy][dx] != -1)og.drawLine(80*dx+40*dy-60,70*dy+20,80*dx+40*dy-20,70*dy+90);
         }
      }
      for(int dx = 0;dx < 4;dx ++){
         for(int dy = 0;dy < 4;dy ++){
            if(td[2][dy][dx] != -1)og.drawLine(80*dx+40*dy+20,70*dy+20,80*dx+40*dy-20,70*dy+90);
         }
      }

      if(co == 1){
         for(int i1 = 0;i1 < 3;i1 ++){
            for(int i2 = 0;i2 < 5;i2 ++){
               for(int i3 = 0;i3 < 5;i3 ++){
                  tdc[i1][i2][i3] = td[i1][i2][i3];
               }
            }
         }
         tn = 0;
         og.setColor(Color.blue);
         for(int dx = 0;dx < 4;dx ++){
            for(int dy = 0;dy < 4;dy ++){
               if((td[0][dy][dx]==1)&&(td[1][dy][dx]==1)&&(td[2][dy][dx]==1)){
                  hx[0]=80*dx-60+40*dy+10;hx[1]=hx[0]+60;hx[2]=hx[0]+30;hx[3]=hx[0];
                  hy[0]=70*dy+20+6;hy[1]=hy[0];hy[2]=hy[0]+52;hy[3]=hy[0];
                  og.drawPolygon(hx,hy,4);
                  tdc[0][dy][dx]=0;tdc[1][dy][dx]=0;tdc[2][dy][dx]=0;
                  tn ++;
               }
            }
         }
         for(int dx = 0;dx < 4;dx ++){
            for(int dy = 0;dy < 4;dy ++){
               if((td[0][dy+1][dx]==1)&&(td[1][dy][dx+1]==1)&&(td[2][dy][dx]==1)){
                  hx[0]=80*dx-20+40*dy+10;hx[1]=hx[0]+60;hx[2]=hx[0]+30;hx[3]=hx[0];
                  hy[0]=70*dy+90-6;hy[1]=hy[0];hy[2]=hy[0]-52;hy[3]=hy[0];
                  og.drawPolygon(hx,hy,4);
                  tdc[0][dy+1][dx]=0;tdc[1][dy][dx+1]=0;tdc[2][dy][dx]=0;
                  tn ++;
               }
            }
         }
         for(int dx = 0;dx < 3;dx ++){
            for(int dy = 0;dy < 3;dy ++){
               if((td[0][dy+1][dx]==0)&&(td[1][dy][dx+1]==0)&&(td[2][dy][dx]==0)&&
                  (td[0][dy][dx]==1)&&(td[0][dy][dx+1]==1)&&
                  (td[1][dy][dx]==1)&&(td[1][dy+1][dx]==1)&&
                  (td[2][dy][dx+1]==1)&&(td[2][dy+1][dx]==1)){
                  hx[0]=80*dx-60+40*dy+10;hx[1]=hx[0]+140;hx[2]=hx[0]+70;hx[3]=hx[0];
                  hy[0]=70*dy+20+6;hy[1]=hy[0];hy[2]=hy[0]+122;hy[3]=hy[0];
                  og.drawPolygon(hx,hy,4);
                  tdc[0][dy][dx]=0;tdc[0][dy][dx+1]=0;
                  tdc[1][dy][dx]=0;tdc[1][dy+1][dx]=0;
                  tdc[2][dy][dx+1]=0;tdc[2][dy+1][dx]=0;
                  tn ++;
               }
            }
         }
         for(int dx = 1;dx < 4;dx ++){
            for(int dy = 1;dy < 4;dy ++){
               if((td[0][dy][dx]==0)&&(td[1][dy][dx]==0)&&(td[2][dy][dx]==0)&&
                  (td[0][dy+1][dx-1]==1)&&(td[0][dy+1][dx]==1)&&
                  (td[1][dy-1][dx+1]==1)&&(td[1][dy][dx+1]==1)&&
                  (td[2][dy-1][dx]==1)&&(td[2][dy][dx-1]==1)){
                  hx[0]=80*dx-100+40*dy+10;hx[1]=hx[0]+140;hx[2]=hx[0]+70;hx[3]=hx[0];
                  hy[0]=70*dy+90-6;hy[1]=hy[0];hy[2]=hy[0]-122;hy[3]=hy[0];
                  og.drawPolygon(hx,hy,4);
                  tdc[0][dy+1][dx-1]=0;tdc[0][dy+1][dx]=0;
                  tdc[1][dy-1][dx+1]=0;tdc[1][dy][dx+1]=0;
                  tdc[2][dy-1][dx]=0;tdc[2][dy][dx-1]=0;
                  tn ++;
               }
            }
         }
         if(tn != ln)ef = 1;
         cs = 0;
         for(int i1 = 0;i1 < 3;i1 ++){
            for(int i2 = 0;i2 < 5;i2 ++){
               for(int i3 = 0;i3 < 5;i3 ++){
                  if(tdc[i1][i2][i3] != -1)cs = cs + tdc[i1][i2][i3];
               }
            }
         }
         if(cs != 0)ef = 1;
      }

      for(int dx = 0;dx < 4;dx ++){
         for(int dy = 0;dy < 5;dy ++){
            if(td[0][dy][dx] == 1)match(80*dx+40*dy-60,70*dy+20,1);
         }
      }
      for(int dx = 0;dx < 5;dx ++){
         for(int dy = 0;dy < 4;dy ++){
            if(td[1][dy][dx] == 1)match(80*dx+40*dy-60,70*dy+20,2);
         }
      }

      for(int dx = 0;dx < 4;dx ++){
         for(int dy = 0;dy < 4;dy ++){
            if(td[2][dy][dx] == 1)match(80*dx+40*dy-60,70*dy+20,3);
         }
      }
      if((co == 2) || (co == 4)){
         switch(pd){
            case 1 : match(mx-40,my,pd) ; break ;
            case 2 : match(mx-20,my-35,pd) ; break ;
            case 3 : match(mx-60,my-35,pd) ; break ;
         }
         og.setFont(new Font("",Font.BOLD,18));
         og.setColor(Color.gray);
         if(co == 2){
            og.drawString("1",mx,my);
         }else{
            og.drawString("2",mx,my);
         }
      }

      if((ef == 0)&&(ln > 2)){
         og.setFont(new Font("",Font.BOLD,30));
         og.setColor(Color.black);
         og.drawString(""+ln+" -> "+(ln-1),310,70);
      }else{
         og.setColor(Color.red);
         if((ln == 2)&&(cs == 0)){
            og.setFont(new Font("",Font.BOLD,30));
            og.drawString("clear!!",310,70);
            ef = 1;
         }else{
            og.setFont(new Font("",Font.BOLD,20));
            og.drawString("NO GOOD",310,70);
         }
      }

      og.setColor(Color.black);
      og.setFont(new Font("",Font.BOLD,24));
      og.drawString("retry",335,272);
      og.drawRect(320,250,80,30);

      g.drawImage(os,0,0,this);

   }

   public void match(int px,int py,int dn){
      switch(dn){
         case 1 : og.setColor(new Color(222,184,135));
                  og.fillRect(px+5,py-3,65,6);
                  og.setColor(new Color(139,0,0));
                  hx[0]=px+60;hx[1]=hx[0]+3;hx[2]=hx[0]+13;hx[3]=hx[0]+16;hx[4]=hx[3];hx[5]=hx[2];hx[6]=hx[1];hx[7]=hx[0];hx[8]=hx[0];
                  hy[0]=py-3;hy[1]=hy[0]-3;hy[2]=hy[1];hy[3]=hy[0];hy[4]=hy[0]+6;hy[5]=hy[4]+3;hy[6]=hy[5];hy[7]=hy[4];hy[8]=hy[0];
                  og.fillPolygon(hx,hy,9);
                  break;
         case 2 : og.setColor(new Color(222,184,135));
                  hx[0]=px+6;hx[1]=hx[0]+35;hx[2]=hx[1]-5;hx[3]=hx[0]-5;hx[4]=hx[0];
                  hy[0]=py+5;hy[1]=hy[0]+60;hy[2]=hy[1]+3;hy[3]=hy[0]+3;hy[4]=hy[0];
                  og.fillPolygon(hx,hy,5);
                  og.setColor(new Color(139,0,0));
                  hx[0]=px+5;hx[1]=hx[0]+4;hx[2]=hx[1]+5;hx[3]=hx[2];hx[4]=hx[3]-5;hx[5]=hx[4]-4;hx[6]=hx[5]-5;hx[7]=hx[6];hx[8]=hx[0];
                  hy[0]=py+4;hy[1]=hy[0];hy[2]=hy[1]+9;hy[3]=hy[2]+4;hy[4]=hy[3]+3;hy[5]=hy[4];hy[6]=hy[5]-9;hy[7]=hy[6]-4;hy[8]=hy[0];
                  og.fillPolygon(hx,hy,9);
                  break;
         case 3 : og.setColor(new Color(222,184,135));
                  hx[0]=px+75;hx[1]=hx[0]+5;hx[2]=hx[1]-35;hx[3]=hx[0]-35;hx[4]=hx[0];
                  hy[0]=py+5;hy[1]=hy[0]+3;hy[2]=hy[1]+60;hy[3]=hy[0]+60;hy[4]=hy[0];
                  og.fillPolygon(hx,hy,5);
                  og.setColor(new Color(139,0,0));
                  hx[0]=px+40;hx[1]=hx[0]+5;hx[2]=hx[1]+4;hx[3]=hx[2]+5;hx[4]=hx[3];hx[5]=hx[4]-5;hx[6]=hx[5]-4;hx[7]=hx[6]-5;hx[8]=hx[0];
                  hy[0]=py+65;hy[1]=hy[0]+3;hy[2]=hy[1];hy[3]=hy[2]-9;hy[4]=hy[3]-4;hy[5]=hy[4]-3;hy[6]=hy[5];hy[7]=hy[6]+9;hy[8]=hy[0];
                  og.fillPolygon(hx,hy,9);
                  break;
      }
   }

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