import java.awt.*;
import java.applet.*;
import java.lang.*;

public class Snake extends Applet implements Runnable
{
	Thread runner;
	int Forste = 1;
	SnakeBit Hode, Hale, Ekstra, Slett;
	int Retn = 1;
	int Vent = 10;
	int Slutt = 1;
	int AntIgjen = 0;
	int Tatt = 1;
	int Tegn = 0;
	int Poeng = 0;
	String lPoeng = "0";
	int KakeX = 250;
	int KakeY = 2;
	int OldKakeX, OldKakeY;
	
	public void init()
	{
		int i = 0;
		
		Hode = new SnakeBit(110,100);
		Hale = Hode;
		for (i=1;i<=100;i++)
		{
			Ekstra = new SnakeBit(110,100);
			Ekstra.Neste = Hale;
			Hale = Ekstra;			
		}
		Slett = Hale;
		Slutt = 1;
	}

	public void update(Graphics g)
	{
		paint(g);
	}

	public void paint(Graphics g)
	{
		if (Forste == 1)
		{
			g.setColor(Color.black);
			g.fillRect(1,1,299,199);	
			g.setColor(Color.red);
			g.drawRect(10,22,280,160);
			g.setColor(Color.yellow);			
			g.drawString("Snake", 10, 18);

			g.setColor(Color.yellow);
			Ekstra = Hale;
			while (Ekstra.Neste != null)
			{
				g.drawLine(Ekstra.x,Ekstra.y,Ekstra.x,Ekstra.y);
				Ekstra = Ekstra.Neste;
			}

			Forste = 0;
		}
		
		if (Tegn == 1)
		{
			g.setColor(Color.black);
			g.fillRect(OldKakeX,OldKakeY,10,10);				

			g.setColor(Color.white);
			g.fillRect(KakeX,KakeY,10,10);				
			
			lPoeng = lPoeng.valueOf(Poeng);
			g.setColor(Color.black);
			g.fillRect(100,1,90,20);
			g.setColor(Color.yellow);
			g.drawString("Poeng: " + lPoeng, 100, 18);

			Tegn = 0;
		}
		
		g.setColor(Color.yellow);		
		g.drawLine(Hode.x,Hode.y,Hode.x,Hode.y);
		
		g.setColor(Color.black);		
		g.drawLine(Slett.x,Slett.y,Slett.x,Slett.y);
		g.drawLine(Hale.x,Hale.y,Hale.x,Hale.y);
		g.drawLine(Hale.Neste.x,Hale.Neste.y,Hale.Neste.x,Hale.Neste.y);
		g.drawLine(Hale.Neste.Neste.x,Hale.Neste.Neste.y,Hale.Neste.Neste.x,Hale.Neste.Neste.y);
	}
	
	public void start()
	{
		if (runner == null)
		{
			runner = new Thread(this);
			runner.start();
		}
	}
	
	public void stop()
	{
		if (runner != null)
		{
			runner.stop();
			runner = null;
		}
	}
	
	public void run()
	{
		while(true)
		{
		while(Slutt == 0)
		{
			try {Thread.sleep(Vent); }
			catch (InterruptedException e) {}

			if (Tatt == 1)
			{
				OldKakeX = KakeX;
				OldKakeY = KakeY;
				KakeX = (int) (Math.random()*270 +11);
				KakeY = (int) (Math.random()*150 +23);
				Tegn = 1;
				Tatt = 0;
			}

			switch ((int) (Retn))
			{
				case 1:
					Ekstra = new SnakeBit(Hode.x+1,Hode.y);
					break;
				case 2:
					Ekstra = new SnakeBit(Hode.x-1,Hode.y);
					break;
				case 3:
					Ekstra = new SnakeBit(Hode.x,Hode.y+1);
					break;
				case 4:
					Ekstra = new SnakeBit(Hode.x,Hode.y-1);
					break;
			}
			
			Hode.Neste = Ekstra;
			Hode = Ekstra;
			
			if (AntIgjen <= 0)
			{
				Ekstra = Hale;
				Slett = Hale;
				Hale = Hale.Neste;
				Ekstra = null;
			}
			
			AntIgjen--;
			
			// Sjekker for kake
			if (Hode.x >= KakeX & Hode.x <= KakeX+10 & Hode.y >= KakeY & Hode.y <= KakeY+10 & Tatt == 0)
			{
				Tatt = 1;
				AntIgjen = 50;
				Poeng = Poeng +10;
			}

						
			
			// Sjekker for kręsj
			Ekstra = Hale.Neste.Neste.Neste;
			while (Ekstra!=Hode)
			{
				if (Hode.x==Ekstra.x & Hode.y==Ekstra.y) {Slutt = 1;}
				Ekstra = Ekstra.Neste;
			}
			if (Hode.x <= 10) {Slutt = 1;}
			if (Hode.x >= 290) {Slutt = 1;}
			if (Hode.y <= 22) {Slutt = 1;}
			if (Hode.y >= 182) {Slutt = 1;}
			
			
			repaint();
		}
		}
	}
	
	public boolean keyDown(Event e, int key)
	{
		if (key == Event.RIGHT) 
		{
			Retn = 1;
			return true;
		}
		
		if (key == Event.LEFT) 
		{
			Retn = 2;
			return true;
		}
		
		if (key == Event.DOWN) 
		{
			Retn = 3;
			return true;
		}
		
		if (key == Event.UP) 
		{
			Retn = 4;
			return true;
		}
		
		if (key == Event.HOME) 
		{
			Slutt = 0;
			Poeng = 0;
			lPoeng = "0";
			Tatt = 1;
			Retn = 1;
			Tegn = 1;
			AntIgjen = 0;
			Forste = 1;
			
	//		Ekstra = Hale;
	//		while (Ekstra.Neste !=null)
	//		{
	//			Ekstra = Hale.Neste;
	//			Hale = null;			
	//		}
		
			
			int i = 0;
		
			Hode = new SnakeBit(110,100);
			Hale = Hode;
			for (i=1;i<=100;i++)
			{
				Ekstra = new SnakeBit(110,100);
				Ekstra.Neste = Hale;
				Hale = Ekstra;			
			}
			Slett = Hale;

			
			return true;
		}

		
		return true;
	}
	
	
	public void destroy()
	{
	
	}

	
}	