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

public class labyrinth extends Applet implements Runnable{

   int td[][] = {{0,1,1,1,0,0},{1,0,1,0,1,1},{1,1,0,1,1,0},{1,0,1,0,1,1},{0,1,1,1,0,0},{0,1,0,1,0,0}};
   int rn = 0,rs,kl,cs,fg = 0;
   int pn[] = new int[4];
   int px;
   Image sky;
   Button re = new Button("  reset  ");
   Thread th = null;
   Image os;
   Graphics og;

   public void init(){
      setLayout(new BorderLayout());
      Panel pan = new Panel();
      pan.setLayout(new FlowLayout());
      pan.add(re);
      add("South",pan);
      os = createImage(510,190);
      og = os.getGraphics();
      setBackground(Color.white);
      sky = getImage(getDocumentBase(),"Picture/sky.gif");
      addMouseListener(
         new MouseAdapter(){
            public void mousePressed(MouseEvent e){
               if(cs == -20){
                  fg = 1;
               }else{
                  if(rs == 2){
                     px = (e.getX()-135)/120;
                  }else if(rs == 3){
                     px = (e.getX()-75)/120;
                  }else if(rs == 4){
                     px = (e.getX()-15)/120;
                  }
                  td[rn][pn[px]] = -1 * td[rn][pn[px]];
                  td[pn[px]][rn] = -1 * td[pn[px]][rn];
                  rn = pn[px];
               }
               repaint();
            }
         }
      );
      re.addActionListener(new ActionListener(){
         public void actionPerformed(ActionEvent e){
            rn = 0;
            fg = 0;
            for(int s1 = 0;s1 < 6;s1 ++){
               for(int s2 = 0;s2 < 6;s2 ++){
                  td[s2][s1] = td[s2][s1] * td[s2][s1];
               }
            }
            repaint();
         }
      });
   }

   public void paint(Graphics g){
      og.setColor(Color.white);
      og.fillRect(0,0,510,190);
      for(int cc = 0;cc < 255;cc ++){
         og.setColor(new Color(255-cc/2,255-cc/2,255-cc/2));
         og.drawLine(254-cc,0,254-cc,190);
         og.drawLine(255+cc,0,255+cc,190);
      }
      cs = 0;
      for(int s1 = 0;s1 < 6;s1 ++){
         for(int s2 = 0;s2 < 6;s2 ++){
            cs = cs + td[s2][s1];
         }
      }
      if(fg == 0){
         if(cs == -20){
            door(210,30,-1);
         }else{
            rs = 0;
            for(int tt = 0;tt < 6;tt ++)rs = rs + td[rn][tt] * td[rn][tt];
            kl = 0;
            if(rs == 2){
               for(int dn = 0;dn < 6;dn ++){
                 if(td[rn][dn] != 0){
                     door(120 * kl + 150,30,dn);
                     pn[kl] = dn;
                     kl ++;
                  }
               }
            }else if(rs == 3){
               for(int dn = 0;dn < 6;dn ++){
                 if(td[rn][dn] != 0){
                     door(120 * kl + 90,30,dn);
                     pn[kl] = dn;
                     kl ++;
                  }
               }
            }else if(rs == 4){
               for(int dn = 0;dn < 6;dn ++){
                  if(td[rn][dn] != 0){
                     door(120 * kl + 30,30,dn);
                     pn[kl] = dn;
                     kl ++;
                  }
               }
            }
         }
      }else{
         og.drawImage(sky,210,30,90,120,this);
         og.setColor(Color.black);
         og.drawRect(210,30,90,120);
      }
      g.drawImage(os,0,0,this);
   }

   public void door(int dx,int dy,int nn){
      og.setColor(new Color(192,99,71));
      og.fillRoundRect(dx,dy,90,120,10,10);
      og.setColor(Color.black);
      og.drawRoundRect(dx,dy,90,120,10,10);
      og.setColor(new Color(250,235,215));
      og.fillRoundRect(dx+10,dy+10,70,45,10,10);
      og.fillRoundRect(dx+10,dy+65,70,45,10,10);
      og.setColor(Color.black);
      og.drawRoundRect(dx+10,dy+10,70,45,10,10);
      og.drawRoundRect(dx+10,dy+65,70,45,10,10);
      og.setColor(new Color(192,192,192));
      og.fillOval(dx+76,dy+54,12,12);
      og.setColor(Color.black);
      og.drawOval(dx+76,dy+54,12,12);
      og.setColor(Color.blue);
      og.setFont(new Font("",Font.PLAIN,30));
      if(nn == -1){
         og.drawString("Exit",dx+20,dy+45);
      }else{
         og.drawString(""+(nn+1),dx+37,dy+45);
      }
   }

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