code: package tracks.singlePlayer.deprecated.sampleMCTS;
  
  import java.util.ArrayList;
  import java.util.Random;
  
  import core.game.Observation;
  import core.game.StateObservation;
  import core.player.AbstractPlayer;
  import ontology.Types;
  import tools.ElapsedCpuTimer;
  
  /**
   * Created with IntelliJ IDEA.
   * User: ssamot
   * Date: 14/11/13
   * Time: 21:45
   * This is a Java port from Tom Schaul's VGDL - https://github.com/schaul/py-vgdl
   */
  public class Agent extends AbstractPlayer {
  
      public int num_actions;
      public Types.ACTIONS[] actions;
  
      /**
       * Random generator for the agent.
       */
      private SingleMCTSPlayer mctsPlayer;
  
      /**
       * Public constructor with state observation and time due.
       * @param so state observation of the current game.
       * @param elapsedTimer Timer for the controller creation.
       */
      public Agent(StateObservation so, ElapsedCpuTimer elapsedTimer)
      {
          //Get the actions in a static array.
          ArrayList<Types.ACTIONS> act = so.getAvailableActions();
          actions = new Types.ACTIONS[act.size()];
          for(int i = 0; i < actions.length; ++i)
          {
              actions[i] = act.get(i);
          }
          num_actions = actions.length;
  
          //Create the player.
          mctsPlayer = new SingleMCTSPlayer(new Random(), num_actions, actions);
      }
  
  
      /**
       * Picks an action. This function is called every game step to request an
       * action from the player.
       * @param stateObs Observation of the current state.
       * @param elapsedTimer Timer when the action returned is due.
       * @return An action for the current state
       */
      public Types.ACTIONS act(StateObservation stateObs, ElapsedCpuTimer elapsedTimer) {
  
          ArrayList<Observation> obs[] = stateObs.getFromAvatarSpritesPositions();
          ArrayList<Observation> grid[][] = stateObs.getObservationGrid();
  
          //Set the state observation object as the new root of the tree.
          mctsPlayer.init(stateObs);
  
          //Determine the action using MCTS...
          int action = mctsPlayer.run(elapsedTimer);
  
          //... and return it.
          return actions[action];
      }
  
      /**
       * Function called when the game is over. This method must finish before CompetitionParameters.TEAR_DOWN_TIME,
       *  or the agent will be DISQUALIFIED
       * @param stateObservation the game state at the end of the game
       * @param elapsedCpuTimer timer when this method is meant to finish.
       */
      public void result(StateObservation stateObservation, ElapsedCpuTimer elapsedCpuTimer)
      {
  //        System.out.println("MCTS avg iters: " + SingleMCTSPlayer.iters / SingleMCTSPlayer.num);
          //Include your code here to know how it all ended.
          //System.out.println("Game over? " + stateObservation.isGameOver());
      }
  
  
  }
  