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

public class f_maze extends Applet implements Runnable{

   Thread th = null;
   Image os;
   Graphics og;
   int td[][][] = new int[5][13][13];
   int mx,my,x0,y0,x1,y1;
   int wd,sw;
   Button mk;

   public void init(){

      os = createImage(450,450);
      og = os.getGraphics();

      c_maze();

      setLayout(new BorderLayout());
      Panel pan = new Panel();
      pan.setLayout(new FlowLayout());
      pan.add(mk = new Button("  make  "));
      add("South",pan);

      addMouseListener(
         new MouseAdapter(){
            public void mousePressed(MouseEvent e){
               x0 = e.getX();
               y0 = e.getY();
               repaint();
            }
         } 
      );

      addMouseMotionListener(
         new MouseMotionAdapter(){
            public void mouseDragged(MouseEvent e){
               x1 = e.getX();
               y1 = e.getY();
               if((x1-x0) > 15){
                  if(td[0][my][mx+1] != 1)mx ++;
                  x0 = x0 + 15;
               }else if((x1-x0) < -15){
                  if(td[0][my][mx-1] != 1)mx --;
                  x0 = x0 - 15;
               }else if((y1-y0) > 15){
                  if(td[0][my+1][mx] != 1)my ++;
                  y0 = y0 + 15;
               }else if((y1-y0) < -15){
                  if(td[0][my-1][mx] != 1)my --;
                  y0 = y0 - 15;
               }
               repaint();
            }
         }
      );

      mk.addActionListener(new ActionListener(){
         public void actionPerformed(ActionEvent e){
            c_maze();;
            repaint();
         } 
      });

   }

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

      for(int i1 = 0;i1 < 13;i1 ++){
         for(int i2 = 0;i2 < 13;i2 ++){
            if(td[1][i2][i1]==1)w_draw(i1*15+20,i2*15+20);
            if(td[2][i2][i1]==1)w_draw(i1*15+235,i2*15+20);
            if(td[3][i2][i1]==1)w_draw(i1*15+20,i2*15+235);
            if(td[4][i2][i1]==1)w_draw(i1*15+235,i2*15+235);
         }
      }
      og.setColor(Color.blue);
      og.fillOval(mx*15+20,my*15+20,15,15);
      og.fillOval(mx*15+235,my*15+20,15,15);
      og.fillOval(mx*15+20,my*15+235,15,15);
      og.fillOval(mx*15+235,my*15+235,15,15);
      og.setColor(Color.red);
      og.setFont(new Font("",Font.BOLD,15));
      og.drawString("G",167+20,178+20);
      og.drawString("G",167+235,178+20);
      og.drawString("G",167+20,178+235);
      og.drawString("G",167+235,178+235);

      if((mx == 11)&&(my == 11)){
         og.setFont(new Font("",Font.BOLD,54));
         og.setColor(Color.black);
         og.drawString("GOAL !!",152,252);
         og.setColor(Color.red);
         og.drawString("GOAL !!",150,250);
      }
      g.drawImage(os,0,0,this);
   }

   public void c_maze(){
      mx = 1 ; my = 1 ;
      for(int i1 = 0;i1 < 13;i1 ++){
         for(int i2 = 0;i2 < 13;i2 ++){
            for(int tn = 0;tn < 5;tn ++){
               td[tn][i2][i1] = 0;
            }
            if((i1%2 == 0)&&(i2%2 == 0))td[0][i2][i1] = 1;
            if((i1 == 0)||(i1 == 12)||(i2 == 0)||(i2 == 12)){
               for(int tn = 0;tn < 5;tn ++){
                  td[tn][i2][i1] = 1;
               }
            }
         }
      }
      for(int m1 = 1;m1 < 6;m1 ++){
         wd = (int)(4*Math.random());
         switch(wd){
            case 0 : td[0][m1*2][2-1] = 1 ; break ;
            case 1 : td[0][m1*2-1][2] = 1 ; break ;
            case 2 : td[0][m1*2][2+1] = 1 ; break ;
            case 3 : td[0][m1*2+1][2] = 1 ; break ;
         }
      }
      for(int mx = 2;mx < 6;mx ++){
         for(int my = 1;my < 6;my ++){
            sw = 0;
            while(sw == 0){
               wd = (int)(3*Math.random());
               switch(wd){
                  case 0 : if(td[0][my*2-1][mx*2] != 1){td[0][my*2-1][mx*2] = 1 ; sw = 1 ;} ; break ;
                  case 1 : if(td[0][my*2][mx*2+1] != 1){td[0][my*2][mx*2+1] = 1 ; sw = 1 ;} ; break ;
                  case 2 : if(td[0][my*2+1][mx*2] != 1){td[0][my*2+1][mx*2] = 1 ; sw = 1 ;} ; break ;
               }
            }
         }
      }
      for(int mx = 1;mx < 12;mx ++){
         for(int my = 1;my < 12;my ++){
            if(td[0][my][mx] == 1){
               wd = (int)(4*Math.random());
               td[wd+1][my][mx] = 1;
               wd = (int)(4*Math.random());
               td[wd+1][my][mx] = 1;
            }
         }
      }
   }

   public void w_draw(int dx,int dy){
      og.setColor(new Color(218,165,32));
      og.fillRect(dx,dy,15,15);
      og.setColor(new Color(139,0,0));
      og.drawLine(dx,dy,dx+14,dy);
      og.drawLine(dx,dy+7,dx+14,dy+7);
      og.drawLine(dx,dy+15,dx+14,dy+15);
      og.drawLine(dx+7,dy,dx+7,dy+7);
      og.drawLine(dx,dy+7,dx,dy+15);
   }

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