//  A simple solitaire game
//
//  Karl Hornell, February 28, 1996

import java.awt.*;

public class solitaire extends java.applet.Applet
{
	int i,j,k,deadBalls;
	int pointX,pointY,pickX=-1,pickY=-1,dragX=-1,dragY=-1;
	int map[];
	boolean drawBoard;

	public void init()
	{
		map = new int[81];
		fillMap();
		resize(280,190);
		repaint();
	}

	public void fillMap()
	{
		for (i=0;i<81;i++)
			map[i]=1;
		for (i=0;i<3;i++)
			for (j=0;j<3;j++)
			{
				map[i*9+j]=-1;
				map[i*9+j+6]=-1;
				map[i*9+j+54]=-1;
				map[i*9+j+60]=-1;
			}
		map[40]=0;
		drawBoard=true;
		deadBalls=0;
	}

	public void fixBox(Graphics g,int x,int y,int w,int h,Color c)
	{
		g.setColor(c);
		g.fillRect(x,y,w,h);
	}

	public void fixDisc(Graphics g,int x,int y,int r,Color c)
	{
		g.setColor(c);
		g.fillOval(x,y,r,r);
	}

	public void fixCircle(Graphics g,int x,int y,int r,Color c)
	{
		g.setColor(c);
		g.drawOval(x,y,r,r);
	}

	public void boardBall(Graphics g,int x,int y)
	{
		g.setColor(Color.blue);
		g.fillRect(x,y,16,16);
		fixDisc(g,x+1,y+1,15,Color.black);
		fixDisc(g,x,y,14,Color.cyan);
		fixDisc(g,x+6,y+6,7,Color.blue);
		fixDisc(g,x+1,y+1,8,Color.white);
		fixDisc(g,x+9,y+9,3,Color.white);
	}

	public void deadBall(Graphics g,int x,int y)
	{
		fixDisc(g,x+3,y+3,14,Color.gray);
		fixDisc(g,x,y,14,Color.cyan);
		fixDisc(g,x+6,y+6,7,Color.gray);
		fixDisc(g,x+1,y+1,8,Color.white);
		fixDisc(g,x+9,y+9,3,Color.white);
	}

	public void boardHole(Graphics g,int x,int y)
	{
		g.setColor(Color.blue);
		g.fillRect(x,y,16,16);
		fixDisc(g,x+1,y+1,12,Color.black);
		fixDisc(g,x+4,y+4,10,Color.blue);
		g.setColor(Color.cyan);
		g.drawArc(x,y,14,14,-135,180);
	}

	public boolean mouseDown(java.awt.Event evt, int x, int y)
	{
		pointX=-100;
		pointY=-100;
		pickX=-1;
		pickY=-1;
		i=(y-18)/17;
		j=(x-18)/17;
		if ((i>-1)&&(i<9)&&(j>-1)&&(j<9))
		{
			if (map[i*9+j]==1)
			{
				pickX=j;
				pickY=i;
				pointY=y;
				pointX=x;
			}
		}
		else if ((x>206)&&(x<266)&&(y>166)&&(y<190))
		{
			fillMap();
			repaint();
		}
		return false;
	}

	public boolean mouseDrag(java.awt.Event evt, int x, int y)
	{
		dragX=-1;
		if ((x>(pointX-8))&&(x1))
				if ((map[pickX+9*pickY-18]==0)&&(map[pickX+9*pickY-9]==1))
				{
					dragX=pickX;
					dragY=pickY-2;
				}
			if ((y>pointY+14)&&(pickY<7))
				if ((map[pickX+9*pickY+18]==0)&&(map[pickX+9*pickY+9]==1))
				{
					dragX=pickX;
					dragY=pickY+2;
				}
		}
		else if ((y>(pointY-8))&&(y1))
				if ((map[pickX+9*pickY-2]==0)&&(map[pickX+9*pickY-1]==1))
				{
					dragX=pickX-2;
					dragY=pickY;
				}
			if ((x>pointX+14)&&(pickX<7))
				if ((map[pickX+9*pickY+2]==0)&&(map[pickX+9*pickY+1]==1))
				{
					dragX=pickX+2;
					dragY=pickY;
				}
		}
		return false;
	}

	public boolean mouseUp(java.awt.Event evt, int x, int y)
	{
		if (dragX>-1)
		{
			drawBoard=false;
			repaint();
		}
		return false;
	}

	public void update(Graphics g)
	{
		paint(g);
	}

	public void paint(Graphics g)
	{
		if (drawBoard)
		{
			g.setColor(Color.lightGray);
			g.fillRect(0,0,size().width,size().height);
			fixBox(g,207,166,60,24,Color.black);
			fixBox(g,208,167,58,22,Color.blue);
			g.setColor(Color.cyan);
			g.drawString("Restart",215,183);
			fixDisc(g,2,2,187,Color.gray);
			fixDisc(g,0,0,185,Color.blue);
			fixDisc(g,0,0,183,Color.cyan);
			fixDisc(g,2,2,183,Color.black);
			fixDisc(g,2,2,181,Color.blue);
			fixCircle(g,8,8,171,Color.cyan);
			fixCircle(g,7,7,171,Color.black);

			for (i=0;i<9;i++)
				for (j=0;j<9;j++)
					if (map[i*9+j]>-1)
						if (map[i*9+j]==0)
							boardHole(g,18+j*17,18+i*17);
						else
							boardBall(g,18+j*17,18+i*17);
			for (i=0;i