

import java.io.*;
import java.util.*;

public class OthelloGPPlayer extends OthelloPlayer
{

        String function;


	OthelloGPPlayer(int color, String definition)
	{
	  super(color);

	  function = definition;

	}
	



  public double evalFunction(
			     double black_edges,
			     double black_corners,
			     double black_near_corners) {

    StringTokenizer stok = new StringTokenizer(function);

    return evalSubFunction(stok,black_edges,
			   black_corners, black_near_corners);

  }

  public double  evalSubFunction(StringTokenizer stok, 
				 double black_edges,
				 double black_corners,
				 double black_near_corners) { 
    String item;



      item = stok.nextToken();

      if (item.equals("("))
	item = stok.nextToken();
      if (item.equals(")"))
	item = stok.nextToken();
      if (item.equals("))"))
	item = stok.nextToken();
      if (item.equals(")))"))
	item = stok.nextToken();
      if (item.equals("))))"))
	item = stok.nextToken();
      if (item.equals("+")) {
	return evalSubFunction(stok,
			       black_edges,
			       black_corners,
			       black_near_corners) + 
	  evalSubFunction(stok,black_edges,
			  black_corners, black_near_corners);
      }
      if (item.equals("-")) {
	return evalSubFunction(stok,
			       black_edges,
			       black_corners,
			       black_near_corners) - 
	  evalSubFunction(stok,black_edges,
			  black_corners,
			  black_near_corners);
      }
      if (item.equals("*")) {
	return evalSubFunction(stok,
			       black_edges,
			       black_corners,
			       black_near_corners) * 
	  evalSubFunction(stok,black_edges,
			  black_corners,
			  black_near_corners);
      }
      if (item.equals("/")) {
	return divide(evalSubFunction(stok,
				      black_edges,
				      black_corners,
				      black_near_corners), 
	  evalSubFunction(stok,black_edges,
			  black_corners,
			  black_near_corners));
      }
      if (item.equals("black_edges")) {
	return black_edges;
      }
      if (item.equals("black_corners")) {
	return black_corners;
      }
      if (item.equals("black_near_corners")) {
	return black_near_corners;
      }
      if (item.equals("8")) {
	return 8.0;
      }
      if (item.equals("3")) {
	return 3.0;
      }

    System.out.println("Parse Error");
    return 0.0;
  }

        // This method gets over written with the evaluation function of players.
        public double evalMove(OthelloBoard board, Move move) {
	  
	  OthelloBoard tempBoard = board.copy();

	  tempBoard.makeMove(color, move.col(), move.row());

	  tempBoard.updateBoardStatistics();

	  
	  
	  //double result = ((double)tempBoard.num_white_edges - (double)tempBoard.num_black) *
	  //	     ((double)tempBoard.num_black - 10);


	  //double result = ((double)tempBoard.num_white - (double)tempBoard.num_black);

	  //   double result = divide((double)tempBoard.num_white,
	  //			    divide((double)tempBoard.num_white_edges-(double)tempBoard.num_black, (double)tempBoard.num_black));

	     //	  System.out.println("Result = " + result);
	    
	double result = evalFunction(
				     (double)tempBoard.num_black_edges,
				     (double)tempBoard.num_black_corners,
				     (double)tempBoard.num_black_near_corners);

	  return result;
	}


        public double divide(double x, double y) {
    
	  if (y==0) {
	    return x;
	  } else {
	    return x/y;
	  }
	}
}
