import java.applet.*;
 import java.awt.*;
 
 public class maze extends Applet implements Runnable
 {
 	private Thread	 m_maze = null;
 	int xdim;
 	int ydim;
 	int xsize=900;
 	int ysize=500;
 	int[][] cell=new int[200][100];
 	int[][] path=new int[200][100];
 	int[][] deadend=new int[1000][2];
 //	TextArea ta=new TextArea("getting text",5,60);
 	String str;
 	int level=0;
 	int maxlevel=0;
 	int endx;
 	int endy;
 	int maxdepth;
 	TextField xfield,yfield,tfpixel;
 	Label xlabel,ylabel,lpixel;
 	Button but1;
 
 	public maze()
 	{
 	}
 
 	public void init()
 	{
 		resize(xsize,ysize);
 		setBackground(Color.white);
 		setLayout(null);	
 //		add(ta);
 //		ta.reshape(500,300,400,100);
 		xfield=new TextField("10",5);
 		add(xfield);
 		yfield=new TextField("10",5);
 		add(yfield);
 		tfpixel=new TextField("900",5);
 		add(tfpixel);
 		xlabel=new Label("Width");
 		ylabel=new Label("Height");
 		lpixel=new Label("Pixels");
 		add(xlabel);
 		add(ylabel);
 		add(lpixel);
 		but1=new Button("submit");
 		add(but1);
 		xlabel.reshape(50,ysize-25,50,20);
 		xfield.reshape(100,ysize-25,50,20);
 		ylabel.reshape(200,ysize-25,50,20);
 		yfield.reshape(250,ysize-25,50,20);
 		ylabel.reshape(200,ysize-25,50,20);
 		yfield.reshape(250,ysize-25,50,20);
 		lpixel.reshape(350,ysize-25,50,20);
 		tfpixel.reshape(400,ysize-25,50,20);
 		but1.reshape(500,ysize-25,50,20);
 	}
 
 
 	public boolean action(Event evt, Object arg)
 	{
 		if (evt.target instanceof Button)
 		{
 			xdim=Integer.parseInt(xfield.getText());
 			ydim=Integer.parseInt(yfield.getText());
 			maxdepth=xdim*ydim*3/2;
 			xsize=Math.min(900,Math.max(600,Integer.parseInt(tfpixel.getText())));
 			ysize=xsize*5/9;
 			resize(xsize,ysize);
 			xlabel.reshape(50,ysize-25,50,20);
 			xfield.reshape(100,ysize-25,50,20);
 			ylabel.reshape(200,ysize-25,50,20);
 			yfield.reshape(250,ysize-25,50,20);
 			ylabel.reshape(200,ysize-25,50,20);
 			yfield.reshape(250,ysize-25,50,20);
 			lpixel.reshape(350,ysize-25,50,20);
 			tfpixel.reshape(400,ysize-25,50,20);
 			but1.reshape(500,ysize-25,50,20);
 			setarray();
 			return true;
 		}
 		else
 			return false;
 	}
 
 	public void paint(Graphics g)
 	{
 		if ((xdim>0)&&(ydim>0))
 		{
 			int size=(int)(Math.min((float)((xsize-1)/xdim),(float)((ysize-26)/ydim)));
 			g.setColor(Color.black);
 			for (int i=0; i=1)
 						g.drawLine(i*size,j*size,(i+1)*size,j*size);
 					if (cell[i][j]%4>=2)
 						g.drawLine((i+1)*size,j*size,(i+1)*size,(j+1)*size);
 					if (cell[i][j]%8>=4)
 						g.drawLine(i*size,(j+1)*size,(i+1)*size,(j+1)*size);
 					if (cell[i][j]%16>=8)
 						g.drawLine(i*size,j*size,i*size,(j+1)*size); 
 				} 
 			}	
 			g.setColor(Color.red);
 			g.fillOval(endx*size,endy*size,size,size);	
 		}
 	}
 
 	public void setarray()
 	{
 //		str=null;
 		maxlevel=0;
 		maxlevel=0;
 		level=0;
 		for (int i=0; i=20)&&(ydim>=20))
 		{
 			for (int i=xhole1-1; i0) /* move up */
 				if (path[x][y-1]==0)
 				{
 					level++;
 					moveup(x,y-1);
 					level--;
 				}
 				else
 					cell[x][y]+=1;
 		}
 		else if ((r==2)||(r==3))
 		{
 			if (x+10) /* move up */
 				if (path[x][y-1]==0)
 				{
 					level++;
 					moveup(x,y-1);
 					level--;
 				}
 				else
 				{
 					cell[x][y]+=1;
 				}
 		}
 		else if ((r==0)||(r==5))
 		{
 			if (x+10) /* move up */
 				if (path[x][y-1]==0)
 				{
 					level++;
 					moveup(x,y-1);
 					level--;
 				}
 				else
 					cell[x][y]+=1;
 		}
 		else if ((r==1)||(r==4))
 		{
 			if (x+10) /* move up */
 			{
 				if (path[x][y-1]==0)
 				{
 					level++;
 					moveup(x,y-1);
 					level--;
 				}
 				else
 				{
 					cell[x][y]+=1;
 				}
 			}
 		}
 		else if ((r==2)||(r==3))
 		{
 			if (x>0) /* move left */
 			{
 				if (path[x-1][y]==0)
 				{
 					level++;
 					moveleft(x-1,y);
 					level--;
 				}
 				else
 				{
 					cell[x][y]+=8;
 				}
 			}
 		}
 		else if ((r==4)||(r==5))
 		{
 			if (y+10) /* move up */
 			{
 				if (path[x][y-1]==0)
 				{
 					level++;
 					moveup(x,y-1);
 					level--;
 				}
 				else
 				{
 					cell[x][y]+=1;
 				}
 			}
 		}
 		else if ((r==0)||(r==5))
 		{
 			if (x>0) /* move left */
 			{
 				if (path[x-1][y]==0)
 				{
 					level++;
 					moveleft(x-1,y);
 					level--;
 				}
 				else
 				{
 					cell[x][y]+=8;
 				}
 			}
 		}
 		else if ((r==1)||(r==3))
 		{
 			if (y+10) /* move up */
 			{
 				if (path[x][y-1]==0)
 				{
 					level++;
 					moveup(x,y-1);
 					level--;
 				}
 				else
 				{
 					cell[x][y]+=1;
 				}
 			}
 		}
 		else if ((r==1)||(r==4))
 		{
 			if (x>0) /* move left */
 			{
 				if (path[x-1][y]==0)
 				{
 					level++;
 					moveleft(x-1,y);
 					level--;
 				}
 				else
 				{
 					cell[x][y]+=8;
 				}
 			}
 		}
 		else if ((r==0)||(r==2))
 		{
 			if (y+10) /* move up */
 			{
 				if (path[x][y-1]==0)
 				{
 					level++;
 					moveup(x,y-1);
 					level--;
 				}
 				else
 				{
 					cell[x][y]+=1;
 				}
 			}
 		}
 		else if ((r==2)||(r==3))
 		{
 			if (x+10) /* move left */
 			{
 				if (path[x-1][y]==0)
 				{
 					level++;
 					moveleft(x-1,y);
 					level--;
 				}
 				else
 				{
 					cell[x][y]+=8;
 				}
 			}
 		}
 //		Second step
 		if ((r==2)||(r==4))
 		{
 			if (y>0) /* move up */
 			{
 				if (path[x][y-1]==0)
 				{
 					level++;
 					moveup(x,y-1);
 					level--;
 				}
 				else
 				{
 					cell[x][y]+=1;
 				}
 			}
 		}
 		else if ((r==0)||(r==5))
 		{
 			if (x+10) /* move left */
 			{
 				if (path[x-1][y]==0)
 				{
 					level++;
 					moveleft(x-1,y);
 					level--;
 				}
 				else
 				{
 					cell[x][y]+=8;
 				}
 			}
 		}
 //		Third step
 		if ((r==3)||(r==5))
 		{
 			if (y>0) /* move up */
 			{
 				if (path[x][y-1]==0)
 				{
 					level++;
 					moveup(x,y-1);
 					level--;
 				}
 				else
 				{
 					cell[x][y]+=1;
 				}
 			}
 		}
 		else if ((r==1)||(r==4))
 		{
 			if (x+10) /* move left */
 			{
 				if (path[x-1][y]==0)
 				{
 					level++;
 					moveleft(x-1,y);
 					level--;
 				}
 				else
 				{
 					cell[x][y]+=8;
 				}
 			}
 		}
 		if (cell[x][y]==11)
 			update(x,y);
 	}
 
 	public void movedown(int x, int y)
 	{
 		path[x][y]=1;
 		int r=(int)(Math.random()*6);
 //		First step
 		if ((r==0)||(r==1))
 		{
 			if (y+10) /* move left */
 			{
 				if (path[x-1][y]==0)
 				{
 					level++;
 					moveleft(x-1,y);
 					level--;
 				}
 				else
 				{
 					cell[x][y]+=8;
 				}
 			}
 		}
 //		Second step
 		if ((r==2)||(r==4))
 		{
 			if (y+10) /* move left */
 			{
 				if (path[x-1][y]==0)
 				{
 					level++;
 					moveleft(x-1,y);
 					level--;
 				}
 				else
 				{
 					cell[x][y]+=8;
 				}
 			}
 		}
 //		Third step
 		if ((r==3)||(r==5))
 		{
 			if (y+10) /* move left */
 			{
 				if (path[x-1][y]==0)
 				{
 					level++;
 					moveleft(x-1,y);
 					level--;
 				}
 				else
 				{
 					cell[x][y]+=8;
 				}
 			}
 		}
 		if (cell[x][y]==14)
 			update(x,y);
 	}
 
 	public void update(int x, int y)
 	{
 		if (level>maxlevel) 
 		{
 			endx=x;
 			endy=y;
 			maxlevel=level;
 		} 
 	}
 
 	public void start()
 	{
 		if (m_maze == null)
 		{
 			m_maze = new Thread(this);
 			m_maze.start();
 		}
 	}
 	
 	public void stop()
 	{
 		if (m_maze != null)
 		{
 			m_maze.stop();
 			m_maze = null;
 		}
 	}
 
 	public void run()
 	{
 	} 
 }