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);
//        if(currentBoard.isEmpty()){
//            int random = new Random().nextInt(TaTeTi.MAX_CELLS * TaTeTi.MAX_CELLS);
//            return availableMoves.get(random);
//        }   
//        else{
//            }
            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){ // TODO: revisar
                        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;
//        }
    }