public Board chooseMove() throws Exception{
        int ties = 1;
        double bestValue = Double.NEGATIVE_INFINITY, currentValue;
        Board bestMove = null, currentMove;
        double[] results = new double[TaTeTi.MAX_CELLS*TaTeTi.MAX_CELLS];
        LinkedList<Board> availableMoves = eg.getAvailableMovesForPlayer(cellValue, currentBoard);
        Iterator it = availableMoves.iterator();
        Random rand = new Random();        
        while (it.hasNext()){
            currentMove = (Board)it.next();
            currentValue = vEstimate(currentMove, false);
            if(currentValue >= bestValue){
                if(currentValue == bestValue){ 
                    bestMove = (Math.random()>=(0.5/ties)) ? bestMove : currentMove;
                    ties++;
                }
                else{
                    bestMove = currentMove;
                }
                bestValue = currentValue;
            }            
        }
        
        for(int i=0; i<availableMoves.size();i++)
            results[i] = vEstimate(availableMoves.get(i),false);
        
        if(TaTeTi.print){
            for(int i=0; i<availableMoves.size();i++){
                if(results[i]==bestValue){
                    System.out.println("Movida con puntaje maximo: ");
                    vEstimate(availableMoves.get(i),true);
                    availableMoves.get(i).print();
                    System.out.println("puntaje: " + results[i]);
                }
            }
            if(bestMove!=null){
                System.out.println("Movida elegida: ");
                bestMove.print();
                System.out.println("value for best move: " + bestValue);
                vEstimate(bestMove, true);
            }
        }
        return bestMove;
    }