import java.applet.*;
import java.awt.event.*;
import java.awt.*;
import java.io.*;
import java.net.*;

public class Snake extends Applet implements Runnable, KeyListener {
	Graphics2D offScreenGraphics;
	Image offScreenImage, notepad;
	Font font, scoreFont, titleFont;
	Dimension screen;
	Thread gameThread;
	Game game;
	int bestScore;
	
	public void init() {
		screen = getSize();
		/* extract the background image from the jar */
		URL imgURL = Snake.class.getResource("/notepad.png");
		notepad = getToolkit().getImage(imgURL);
		offScreenImage = createImage(screen.width, screen.height);
		offScreenGraphics = (Graphics2D)offScreenImage.getGraphics();
		offScreenGraphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
		try {
			/* extract the custom font from the jar */
			URL fontURL = Snake.class.getResource("/ANMARI__.ttf");
			font = Font.createFont(Font.TRUETYPE_FONT, fontURL.openStream());
			scoreFont = font.deriveFont(16f);
			titleFont = font.deriveFont(24f);
		} catch (Exception e) {}
		bestScore = 0;
		createGame();
		addKeyListener(this);
		gameThread = new Thread(this);
		gameThread.start();
	}
	
	public void paint(Graphics g) {
		offScreenGraphics.drawImage(notepad, 0, 0, null);
		game.drawBoard(offScreenGraphics);
		offScreenGraphics.setFont(titleFont);
		offScreenGraphics.drawString("Hand Drawn Snake", 70, 85);
		offScreenGraphics.setFont(scoreFont);
		offScreenGraphics.drawString("SCORE: " + game.score + " BEST: " + bestScore, 100, 380);
		offScreenGraphics.drawRect(0, 0, screen.width-1, screen.height-1);
		offScreenGraphics.drawRect(1, 1, screen.width-3, screen.height-3);
		g.drawImage(offScreenImage, 0, 0, null);
	}
	
	public void update(Graphics g) {
		paint(g);
	}
	
	public void run() {
		for(;;) {
			repaint();
			try {
				Thread.sleep(150);
			} catch (InterruptedException ie) {}
			game.moveSnake();
			if(game.checkCollision()) {
				try {
					Thread.sleep(1000);
				} catch (InterruptedException ie) {}
				bestScore = (int)Math.max(bestScore, game.score);
				createGame();
			}
		}
	}
	
	void createGame() {
		game = new Game(11, 11, 20, 75, 125);
	}
	
	public void destroy() {
		gameThread = null;
	}
	
	public void keyPressed(KeyEvent e) {
			if (e.getKeyCode() == KeyEvent.VK_LEFT) 	game.changeDirection(0);
			if (e.getKeyCode() == KeyEvent.VK_UP) 		game.changeDirection(1);
			if (e.getKeyCode() == KeyEvent.VK_RIGHT) 	game.changeDirection(2);
			if (e.getKeyCode() == KeyEvent.VK_DOWN) 	game.changeDirection(3);
	}
	public void keyReleased(KeyEvent e) {}
	public void keyTyped(KeyEvent e) {}

} 
