import java.applet.*;
import java.awt.*;

public class pong extends Applet implements Runnable
{
	private Thread t;

	private int ballx;
	private int bally;
	private int balldx;
	private int balldy;
	private int ballsize;

	private int paddlex;
	private int paddley;
	private int paddledy;
	private int paddle2x;
	private int paddle2y;
	private int paddle2dy;

	private Image offscreenImage;
	private Graphics offscr;
	private int width, height;

	private char paused;

	private int paddlewidth;
	private int paddleheight;

	private int score;
	private int score2;

	private int textx, text2x;
	private int texty, text2y;

	private Font font;
	private Font font2;

	public void init()
	{
		paused = 's';

		font = new Font("Courier", Font.BOLD, 36);
		

		font2 = new Font("Courier", Font.PLAIN, 12);

		t = new Thread(this);
		t.start();

		width = size().width;
		height = size().height;

		paddlewidth = 15;
		paddleheight = 30;

		textx = -30;
		texty = 100;

		text2x = -30;
		text2y = 150;

		ballx = 300;
		bally = 100;
		ballsize = 10;
		balldx = (int)(Math.random()*28-14);
		balldy = (int)(Math.random()*16-8);

		if ((balldx < 4)&& (balldx > -4))
			if (balldx > 0)
				balldx += 4;
			else
				balldx -= 4;

		if ((balldy < 3)&& (balldx > -3))
			if (balldy > 0)
				balldy += 3;
			else
				balldy -= 3;

		paddlex = 30;
		paddley = 200;
		paddledy = 0;

		paddle2x = width-20;
		paddle2y = 200;
		paddle2dy = 0;

		score = 0;
		score2 = 0;

		// Create offscreen Image
		offscreenImage = createImage(width, height);
		offscr = offscreenImage.getGraphics();
	}

	public void run()
	{
		while(true)
		{
			repaint();

			try {
				t.sleep(50);
			} catch (InterruptedException e) { ; }
			if (paused == 'n')
			{
				if (ballx+ballsize>width)
				{
					score += 1;
					ballx = 300;
					bally = 100;
					balldx = (int)(Math.random()*20-10);
					balldy = (int)(Math.random()*12-6);

					if ((balldx < 4)&& (balldx > -4))
						if (balldx > 0)
							balldx += 4;
						else
							balldx -= 4;

					if ((balldy < 2)&& (balldx > -2))
						if (balldx > 0)
							balldx += 2;
						else
							balldx -= 2;
					paused = 'y';
				}
				if (ballx < 0)
				{
					score2 += 1;
					ballx = 300;
					bally = 100;
					balldx = (int)(Math.random()*20-10);
					balldy = (int)(Math.random()*12-6);

					if ((balldx < 4)&& (balldx > -4))
						if (balldx > 0)
							balldx += 4;
						else
							balldx -= 4;

					if ((balldy < 2)&& (balldx > -2))
						if (balldx > 0)
							balldx += 2;
						else
							balldx -= 2;
					paused = 'y';
				}	

				if ((bally < 30)||(bally+ballsize>height))
					balldy *= -1;

				ballx += balldx;
				bally += balldy;

				if ((ballx < paddlex+paddlewidth)&&
				    (ballx > paddlex)&&
				    (bally < paddley+paddleheight)&&
				    (bally+ballsize > paddley))
					if (balldx < 0)
					{
						balldx -= 1;
						balldx *= -1;
					}

				if ((ballx < paddle2x+paddlewidth)&&
				    (ballx+ballsize > paddle2x)&&
				    (bally < paddle2y+paddleheight)&&
				    (bally+ballsize > paddle2y))
					if (balldx > 0)
					{
						balldx += 1;
						balldx *= -1;
					}

				paddley += paddledy;

				if (paddley < 30)
					paddley = 30;
				if (paddley > height)
					paddley = height;

				paddle2y += paddle2dy;

				if (paddle2y < 30)
					paddle2y = 30;
				if (paddle2y > height)
					paddle2y = height;

			}
		}
	}

	public void paint(Graphics g)
	{
		offscr.setColor(Color.black);
		offscr.fillRect(0, 0, width, height);

		if ((paused == 'y')||(paused == 'n'))
		{			
			offscr.setColor(Color.blue);
			offscr.fillOval(ballx,bally,ballsize,ballsize);

			offscr.setColor(Color.yellow);
			offscr.fillRect(paddlex, paddley, paddlewidth, paddleheight);

			offscr.setColor(Color.green);
			offscr.fillRect(paddle2x, paddle2y, paddlewidth, paddleheight);

			offscr.setColor(Color.green);
			offscr.drawString("Green Score: "+score2,width-140,20);

			offscr.setColor(Color.yellow);
			offscr.drawString("Yellow Score: "+score,50,20);
		}
		if (paused == 's')
		{
			offscr.setColor(Color.white);
			offscr.drawString("Click to begin",230,100);
		}

		if (paused == 'i')
		{
			if (textx < 250)
			{
				offscr.setColor(Color.red);
				offscr.drawString("Pong",textx,texty);

				textx += 5;
			}
			else
			{
				if (text2x < 237)
				{
					offscr.setColor(Color.red);
					offscr.drawString("Pong",textx,texty);

					offscr.setColor(Color.yellow);
					offscr.drawString("By Adam",text2x,text2y);

					text2x += 5;
				}
				else
				{
					offscr.setColor(Color.red);
					offscr.drawString("Pong",textx,texty);

					offscr.setColor(Color.yellow);
					offscr.drawString("By Adam",text2x,text2y);

					offscr.setColor(Color.magenta);
					offscr.drawString("Click to continue",230,200);
				}
			}
		}

		g.drawImage(offscreenImage, 0, 0, this);
	}

	public void update(Graphics g)
	{
		paint(g);
	}

	public boolean gotFocus(Event e, Object obj)
	{
		if (paused == 's')
		{
			setFont(font);
			paused = 'i';
		}

		return super.gotFocus(e,obj);
	}

	public boolean mouseDown(Event e, int x, int y)
	{
		if (paused == 'i')
		{
			setFont(font2);
			paused = 'y';
		}

		return true;
	}

	public boolean keyUp(Event e, int key)
	{
		if ((key == 1004)||(key == 1005))
			paddledy = 0;

		if ((key == 119)||(key == 115))
			paddle2dy = 0;

		if (key == 32)
			if (paused == 'y');
				paused = 'n';

		return (true);
	}

	public boolean keyDown(Event e, int key)
	{
		if (key == 1005)
			paddledy = 6;
		if (key == 1004)
			paddledy = -6;

		if (key == 115)
			paddle2dy = 6;
		if (key == 119)
			paddle2dy = -6;

		return true;
	}
}

