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

public class d_lots extends Applet implements Runnable{

   Thread th = null;
   Image os;
   Graphics og;
   int ad0[][][][] = {{{{1,0,0,0},{0,0,0,0}},{{0,1,0,0},{0,0,0,0}},{{0,1,0,1},{0,0,0,0}}},
                      {{{0,1,0,0},{0,0,0,0}},{{0,1,0,0},{1,0,0,0}},{{0,1,0,1},{0,0,0,0}}},
                      {{{0,1,0,0},{0,0,0,0}},{{0,1,0,0},{1,0,0,0}},{{0,1,0,1},{1,0,0,0}}},
                      {{{1,0,0,0},{0,0,0,0}},{{0,1,0,0},{1,0,0,1}},{{0,1,0,1},{0,0,1,0}}},
                      {{{0,1,0,0},{1,0,0,1}},{{0,1,0,0},{1,0,0,0}},{{0,1,0,1},{0,0,0,0}}},
                      {{{0,0,1,0},{1,0,0,1}},{{0,1,0,0},{1,0,1,0}},{{0,1,0,1},{0,0,0,0}}}};
   int td[][][] = new int[3][2][4] , ad[][][] = new int[3][2][4];
   int ch[] = new int[5];
   int sa,si,sp,lv;
   int px,py;
   String al[][] = {{"A","B","C","D","E"},{"A","B","C","D","E"},{"A","B","C","D","E"}};
   String sw;

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

      d_set();
      addMouseListener(
         new MouseAdapter(){
            public void mousePressed(MouseEvent e){
               px = e.getX() ; py = e.getY() ;
               if((px > 30) && (px < 150)){
                  if(e.getClickCount() == 1){
                     sa = (py - 15) / 120 + 1; 
                  }else if(e.getClickCount() == 2){
                     a_turn();
                  }
               }else if((px > 180) && (px < 330)){
                  if(e.getClickCount() == 1){
                     si = (py - 60) / 90;
                     if(si < 3){
                        for(int i1 = 0;i1 < 2;i1 ++){
                           for(int i2 = 0;i2 < 4;i2 ++){
                              td[si][i1][i2] = ad[sa-1][i1][i2] ;
                           }
                        }
                     }else if((px > 275) && (px < 325) && (py > 360) && (py < 385)){
                        d_set();
                     }else if((px > 215) && (px < 265) && (py > 360) && (py < 385)){
                        lv = (lv + 1) % 6;
                        d_set();
                     }
                  }else if(e.getClickCount() == 2){
                     for(int i1 = 0;i1 < 2;i1 ++){
                        for(int i2 = 0;i2 < 4;i2 ++){
                           td[si][i1][i2] = 0 ;
                        }
                     }
                  }

               }
               repaint();
            }
         }
      );
   }

   public void paint(Graphics g){
      og.setColor(new Color(220,255,220));
      og.fillRect(0,0,360,400);
      og.setColor(Color.white); 
      og.fillRect(195,60,150,270);
      og.setColor(Color.lightGray); 
      og.drawLine(195,150,345,150);
      og.drawLine(195,240,345,240);
      og.setColor(Color.darkGray); 
      for(int d1 = 0;d1 < 3;d1 ++){
         for(int d2 = 0;d2 < 2;d2 ++){
            for(int d3 = 0;d3 < 4;d3 ++){
               if(ad[d1][d2][d3] == 1)og.fillRect(d3*30+30,d1*120+d2*30+60,30,2);
            }
         }
      }
      for(int d1 = 0;d1 < 3;d1 ++){
         for(int d2 = 0;d2 < 5;d2 ++){
            og.fillRect(d2*30+30,d1*120+30,2,90);
         }
      }
      for(int d1 = 0;d1 < 5;d1 ++){
         og.fillRect(d1*30+210,60,2,270);
      }
      for(int d1 = 0;d1 < 3;d1 ++){
         for(int d2 = 0;d2 < 2;d2 ++){
            for(int d3 = 0;d3 < 4;d3 ++){
               if(td[d1][d2][d3] == 1)og.fillRect(d3*30+210,d1*90+d2*30+90,30,2);
            }
         }
      }
      og.setColor(Color.red);
      if(sa != 0){
         og.drawRect(20,120*sa-100,140,110);
      }
      for(int d1 = 0;d1 < 5;d1 ++){
         al[2][d1] = al[0][d1];
      }
      for(int d1 = 0;d1 < 3;d1 ++){
         for(int d2 = 0;d2 < 2;d2 ++){
            for(int d3 = 0;d3 < 4;d3 ++){
               if(td[d1][d2][d3] == 1){
                  sw = al[2][d3] ; al[2][d3] = al[2][d3+1] ; al[2][d3+1] = sw;
               }
            }
         }
      }
      for(int d1 = 0;d1 < 5;d1 ++){
         if(al[2][d1] == al[1][d1]){
            ch[d1] = 1;
         }else{
            ch[d1] = 0;
         }
      }
      og.setFont(new Font("",Font.BOLD,20));
      for(int d1 = 0;d1 < 5;d1 ++){
         og.setColor(Color.black);
         og.drawString(""+al[0][d1],d1*30+205,55);
         og.setColor(Color.blue);
         og.drawString(""+al[0][d1],d1*30+204,54);
      }
      for(int d1 = 0;d1 < 5;d1 ++){
         og.setColor(Color.black);
         og.drawString(""+al[1][d1],d1*30+205,350);
         if(ch[d1] == 1){
            og.setColor(Color.blue);
         }else{
            og.setColor(Color.red);
         }
         og.drawString(""+al[1][d1],d1*30+204,349);
      }
      og.setFont(new Font("",Font.BOLD,16));
      og.setColor(Color.white);
      og.fillRoundRect(215,360,50,25,15,15);
      og.setColor(Color.black);
      og.drawRoundRect(215,360,50,25,15,15);
      og.drawString("Lv"+(lv+1),226,378);
      og.setColor(Color.white);
      og.fillRoundRect(275,360,50,25,15,15);
      og.setColor(Color.black);
      og.drawRoundRect(275,360,50,25,15,15);
      og.drawString("set",287,378);
      sp = 1;
      for(int d1 = 0;d1 < 5;d1 ++){
         sp = sp * ch[d1] ;
      }
      og.setFont(new Font("",Font.BOLD,60));
      if((sp == 1) && (sa != 0)){
         og.setColor(Color.black);
         og.drawString("clear!!",92,232);
         og.setColor(Color.red);
         og.drawString("clear!!",90,230);
      }
      g.drawImage(os,0,0,this);
   }

   public void d_set(){
      for(int d1 = 0;d1 < 3;d1 ++){
         for(int d2 = 0;d2 < 2;d2 ++){
            for(int d3 = 0;d3 < 4;d3 ++){
               td[d1][d2][d3] = 0;
               ad[d1][d2][d3] = ad0[lv][d1][d2][d3];
            }
         }
      }
      for(int d1 = 0;d1 < 5;d1 ++){
         al[1][d1] = al[0][d1];
      }
      for(int kk = 0;kk < 3;kk ++){
         sp = (int)(7 * Math.random()) + 1;
         if(sp != 1){
            sa = sp / 2 ;
            if(sp % 2 == 1)a_turn();
            for(int d2 = 0;d2 < 2;d2 ++){
               for(int d3 = 0;d3 < 4;d3 ++){
                  td[kk][d2][d3] = ad[sa - 1][d2][d3];
               }
            }
         }
      }
      for(int d1 = 0;d1 < 3;d1 ++){
         for(int d2 = 0;d2 < 2;d2 ++){
            for(int d3 = 0;d3 < 4;d3 ++){
               if(td[d1][d2][d3] == 1){
                  sw = al[1][d3] ; al[1][d3] = al[1][d3+1] ; al[1][d3+1] = sw;
               }
            }
         }
      }
      for(int d1 = 0;d1 < 3;d1 ++){
         for(int d2 = 0;d2 < 2;d2 ++){
            for(int d3 = 0;d3 < 4;d3 ++){
               td[d1][d2][d3] = 0;
               ad[d1][d2][d3] = ad0[lv][d1][d2][d3];
            }
         }
      }
      sa = 0 ;
   }

   public void a_turn(){
      sp = ad[sa-1][0][0] ; ad[sa-1][0][0] = ad[sa-1][1][3] ; ad[sa-1][1][3] = sp ;
      sp = ad[sa-1][0][1] ; ad[sa-1][0][1] = ad[sa-1][1][2] ; ad[sa-1][1][2] = sp ;
      sp = ad[sa-1][0][2] ; ad[sa-1][0][2] = ad[sa-1][1][1] ; ad[sa-1][1][1] = sp ;
      sp = ad[sa-1][0][3] ; ad[sa-1][0][3] = ad[sa-1][1][0] ; ad[sa-1][1][0] = sp ;
   }

   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(50);
         }
         catch (InterruptedException e){
         }
      }
   }

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