import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.Font.*;

public class TicTac extends Applet implements MouseListener, KeyListener
{
	static final int OK = 0;
  	static final int WIN = 1;
    	static final int LOSE = 2;
    	static final int STALEMATE = 3;

	static final int PLAYER = 12;
	static final int COMPUTER = 15;

	boolean GameOver = false;
 
	int Board[] = new int[9];

	static final int BOARDWALL = 240;

	Image ZeroImage;  /* Player is the circle */
	Image CrossImage;

	String Results = "Lets begin!";

    /** Initialize the applet. Resize and load images. */
    public void init() 
    {
	this.setFont(new Font("SansSerif", Font.BOLD, 20));
	ZeroImage = getImage(getCodeBase(), "zero.gif");
	CrossImage = getImage(getCodeBase(), "cross.gif");
	this.addMouseListener(this);
	this.addKeyListener(this);
    }
	
void CleanStart()    
{
	this.requestFocus();
	for(int i = 0; i < 9; i++)
	{
	    Board[i] = 0;
	}
	GameOver = false;
	Results = "Lets begin!";
	repaint();
      return;
}

/** Paint it.   */
 public void paint(Graphics g)
 {
	/* Player is the circle */
	g.setColor(Color.black);
	int xoff = BOARDWALL / 3;
	int yoff = BOARDWALL / 3;
	g.drawLine(xoff, 0, xoff, BOARDWALL);
	g.drawLine(2*xoff, 0, 2*xoff, BOARDWALL);
	g.drawLine(0, yoff, BOARDWALL, yoff);
	g.drawLine(0, 2*yoff, BOARDWALL, 2*yoff);
	g.drawString(Results, 70, 280);
	int i = 0;
	for (int r = 0 ; r < 3 ; r++)
	{
	    for (int c = 0 ; c < 3 ; c++, i++) 
	    {
		if (Board[i]== PLAYER) 
		{
		    g.drawImage(ZeroImage, c*xoff + 1, r*yoff + 1, this);
		} 
		if (Board[i]== COMPUTER) 
		{
		    g.drawImage(CrossImage, c*xoff + 1, r*yoff + 1, this);
		}
	    }
	}
    }

    /** User move. return true if legal     */
    boolean PlayerMove(int m)	
    {
	/* if its on the board */
	if ((m < 0) || (m > 8))
	{
	    return false;
	}
	/* if its not taken already */
	if ((Board[m] == PLAYER)||(Board[m]== COMPUTER))
	{
	    return false;
	}
	Board[m]= PLAYER;
	return true;
    }

    void ProcessPlayerMove()
    {
  	    repaint();
          switch(status())
    	    {
      	case WIN:
	      case LOSE:
	      case STALEMATE:
		   GameOver = true;
		   break;		
	      case OK:
		   ComputerMove(); 
   	    }
          return;	
    }	

    /** Computer move. return true if legal     */
    void ComputerMove()
    {
	/* if two squares belong to the computer and the third is blank
	   it adds up to 30 */
      int winner = 30; 
	for (int i = 0; i < 2; i++)
	{
	   if(Board[0] + Board[1] + Board[2]== winner)
	   {
		if(Board[0] == 0)
		{
		   Board[0] = COMPUTER;
		   winner = 0;
		   break;
		}
		if(Board[1] == 0)
		{
		   Board[1] = COMPUTER;
		   winner = 0;
		   break;
		}			
		if(Board[2] == 0)
		{
		   Board[2] = COMPUTER;
		   winner = 0;
		   break;
		}						
	   }	
	   if(Board[0] + Board[3] + Board[6]== winner) 	 	
	   {
		if(Board[0] == 0)
		{
		   Board[0] = COMPUTER;
		   winner = 0;
		   break;
		}
		if(Board[3] == 0)
		{
		   Board[3] = COMPUTER;
		   winner = 0;
		   break;
		}			
		if(Board[6] == 0)
		{
		   Board[6] = COMPUTER;
		   winner = 0;
		   break;
		}						
	   }	
 	   if(Board[0] + Board[4] + Board[8]== winner)
	   {
		if(Board[0] == 0)
		{
		   Board[0] = COMPUTER;
		   winner = 0;
		   break;
		}
		if(Board[4] == 0)
		{
		   Board[4] = COMPUTER;
		   winner = 0;
		   break;
		}			
		if(Board[8] == 0)
		{
		   Board[8] = COMPUTER;
		   winner = 0;
		   break;
		}						
	   }	
	   if(Board[1] + Board[4] + Board[7]== winner) 	 	
	   {
		if(Board[1] == 0)
		{
		   Board[1] = COMPUTER;
		   winner = 0;
		   break;
		}
		if(Board[4] == 0)
		{
		   Board[4] = COMPUTER;
		   winner = 0;
		   break;
		}			
		if(Board[7] == 0)
		{
		   Board[7] = COMPUTER;
		   winner = 0;
		   break;
		}						
	   }	
	   if(Board[2] + Board[5] + Board[8]== winner)
	   {
		if(Board[2] == 0)
		{
		   Board[2] = COMPUTER;
		   winner = 0;
		   break;
		}
		if(Board[5] == 0)
		{
		   Board[5] = COMPUTER;
		   winner = 0;
		   break;
		}			
		if(Board[8] == 0)
		{
		   Board[8] = COMPUTER;
		   winner = 0;
		   break;
		}						
	   }	
	   if(Board[2] + Board[4] + Board[6]== winner) 	 	
	   {
		if(Board[2] == 0)
		{
		   Board[2] = COMPUTER;
		   winner = 0;
		   break;
		}
		if(Board[4] == 0)
		{
		   Board[4] = COMPUTER;
		   winner = 0;
		   break;
		}			
		if(Board[6] == 0)
		{
		   Board[6] = COMPUTER;
		   winner = 0;
		   break;
		}						
	   }	
	   if(Board[3] + Board[4] + Board[5]== winner)
	   {
		if(Board[3] == 0)
		{
		   Board[3] = COMPUTER;
		   winner = 0;
		   break;
		}
		if(Board[4] == 0)
		{
		   Board[4] = COMPUTER;
		   winner = 0;
		   break;
		}			
		if(Board[5] == 0)
		{
		   Board[5] = COMPUTER;
		   winner = 0;
		   break;
		}						
	   }	
	   if(Board[6] + Board[7] + Board[8]== winner) 	 	
	   {
		if(Board[6] == 0)
		{
		   Board[6] = COMPUTER;
		   winner = 0;
		   break;
		}
		if(Board[7] == 0)
		{
		   Board[7] = COMPUTER;
		   winner = 0;
		   break;
		}			
		if(Board[8] == 0)
		{
		   Board[8] = COMPUTER;
		   winner = 0;
		   break;
		}						
	   }	
	   /* if two squares belong to the player and the third is blank
	   	it adds up to 24 */
	   winner = 24;
	}	
	/* if no winning moves exist (gone twice thru the loop)the value
	   is still 24 - select a move from the array ranked in order of 
	   strategic importance 	*/
	if (winner == 24)
	{
	   for (int i = 0; i < 9; i++)
	   {
	      int moves[] = {4,0,2,6,8,7,5,3,1};	
	      if (Board[moves[i]]== 0)
	      {
	          Board[moves[i]] = COMPUTER;
		    break;	
	      }
	   }
	}
	repaint();
	switch (status()) 
	{
	    case WIN:
	    case LOSE:
	    case STALEMATE:
	      GameOver = true;
	    case OK:
	}
	return;
    }

    /** Figure what the status of the game is.     */
    int status()
    {
	int full = STALEMATE;
	/* First check if there is a stalemate */
	for (int i = 0; i < 9; i++)
	{
	    if ((Board[i] != PLAYER) && (Board[i] != COMPUTER))
	    {
		  full = OK;
	    }
	}
	if(full == STALEMATE)
	{
	    Results = "Its a draw!";
	    return STALEMATE;
	}	
	/* Then check if the computer(45) or the player(36) has won */
	int winner = 45;
	for (int i = 0; i < 2; i++)
	{
	   if(Board[0] + Board[1] + Board[2]== winner) 	 	
	   {
		break;	
	   }
	   if(Board[0] + Board[3] + Board[6]== winner) 	 	
	   {
		break;	
	   }
	   if(Board[0] + Board[4] + Board[8]== winner) 	 	
	   {
		break;	
	   }
	   if(Board[1] + Board[4] + Board[7]== winner) 	 	
	   {
		break;	
	   }
	   if(Board[2] + Board[4] + Board[6]== winner) 	 	
	   {
		break;	
	   }
	   if(Board[2] + Board[5] + Board[8]== winner) 	 	
	   {
		break;	
	   }
	   if(Board[3] + Board[4] + Board[5]== winner) 	 	
	   {
		break;	
	   }
	   if(Board[6] + Board[7] + Board[8]== winner) 	 	
	   {
		break;	
	   }
	   winner -= 9;
	}
	if(winner == 45)
	{
          Results = "I WIN!";	
	    return LOSE;
	}
	if(winner == 36)
	{
	    Results = "You Won";
	    return WIN;
	}
	Results = "";
      return OK;
   }
    
    /** The user has clicked in the applet. Figure out where
        and see if a legal move is possible. If it is a legal
        move, respond with a legal move (if possible).  */
    public void mouseReleased(MouseEvent e)
    {	
	 int x = e.getX();
	 int y = e.getY();

       Graphics g = getGraphics();
	 int xoff = BOARDWALL / 2;
	 int yoff = BOARDWALL / 2;

	 // Figure out the row/column
	 int c = (x * 3) / BOARDWALL;
	 int r = (y * 3) / BOARDWALL;
	 if ((PlayerMove(c + (r * 3))) && (GameOver == false))
	 {
	     ProcessPlayerMove();	
	 }
   }

   public void mousePressed(MouseEvent e) {
   }

   public void mouseClicked(MouseEvent e) {
   }

   public void mouseEntered(MouseEvent e) {
   }

   public void mouseExited(MouseEvent e) {
   }

   public void keyReleased(KeyEvent e)
   {	
 	CleanStart();
   }	
	
   public void keyPressed(KeyEvent e) {
   }

   public void keyTyped(KeyEvent e) {
   }

   public void destroy()
   {
      removeMouseListener(this);
	removeKeyListener(this);
   }
   
   public String getAppletInfo() 
   {
	return "TicTacToe by Jay Lipp";
   }
}
