package de.android.reversi;
 
+import java.util.Collections;
 import java.util.List;
+import java.util.Random;
 
 import de.android.reversi.logic.ReversiLogic;
 
         if (depth == 0 || allowedPositions.isEmpty()) {
             return this.heuristic(board, player); //the heuristic value of node
         }
+
+        //Selects a move from the set of legal moves. In a random way :)
+        Collections.shuffle(allowedPositions, new Random());
+
         if (player == maxPlayer) {
             for (final Position child : allowedPositions) {
                 //TODO: This clone sucks. I must re design this program. :( I should just need the array :(
         final int beta = Integer.MAX_VALUE;
         Position bestMove = null;
 
+        //Selects a move from the set of legal moves. In a random way :)
+        Collections.shuffle(allowedPositions, new Random());
+
         for (final Position child : allowedPositions) {
             //TODO: This clone sucks. I must re design this program. :( I should just need the array :(
             //What I need is an undo movement function. In that way I do not need to clone/copy the whole board :(
      * @param player
      * @return
      */
-    //es la mobilidad para el oponente.
-    //cuanto más baja sea la movilidad para el oponente este metodo devuelve un valor mas alto.
+    //es la mobilidad para el oponente. minimaxAB tiene oponente como PE así que aquí me llega justo lo que quiero, el oponente.
+    //cuanto más baja sea la movilidad para el oponente este metodo devuelve un valor mas alto. Mejor para el jugador actual.
     private int getMobilityForOpponent(final Board board, final Player player) {
         final int mobility = board.allowedPositions(player).size();
 
         return ((diskSquareTable * 10) + (mobility * 5) + (frontierDiscs * 5));
     }
 
-    //es la puntuacion para el oponente.
-    //cuanto más alta sea la puntuación para el oponente este metodo devuelve un valor mas bajo.
+    //es la puntuacion para el jugador actual.
+    //cuanto más alta sea la puntuación para el jugador actual este metodo devuelve un valor mas alto (mejor para él)
     private int diskSquareTable(final Board board, final Player player) {
+        //Hay que hacerlo porque minimaxAB tiene oponente como PE. Si quiero el jugador actual tengo que calcular el oponente
+        //del jugador que me ofrece minimaxAB
+        final Player opponent = ReversiLogic.opponent(player);
         int total = 0;
 
         for (short column = 0; column < Board.NUMBER_OF_COLUMNS; column++) {
             for (short row = 0; row < Board.NUMBER_OF_ROWS; row++) {
-                if (board.getGameBoard()[column][row].getPlayer() == player) {
+                if (board.getGameBoard()[column][row].getPlayer() == opponent) {
                     //TODO change the disk square table depending on the state of the game
                     //see: http://www.site-constructor.com/othello/Present/BoardLocationValue.html
                     total += this.values[column][row];
                 }
             }
         }
-        return (300 - total);
+        return total;
     }
 
-    //discos frontera para el oponente
-    //cuantos mas discos frontera tenga el oponente mejor.
+    //discos frontera para el jugador actual.
+    //cuantos mas discos frontera tenga el jugador actual peor para él.
     private int frontierDiscs(final Board board, final Player player) {
+        //Hay que hacerlo porque minimaxAB tiene oponente como PE. Si quiero el jugador actual tengo que calcular el oponente
+        //del jugador que me ofrece minimaxAB
+        final Player opponent = ReversiLogic.opponent(player);
         int result = 0;
 
         for (short column = 0; column < Board.NUMBER_OF_COLUMNS; column++) {
             for (short row = 0; row < Board.NUMBER_OF_ROWS; row++) {
-                if (board.getGameBoard()[column][row].getPlayer() == player) {
+                if (board.getGameBoard()[column][row].getPlayer() == opponent) {
                     if (board.idFrontierDisc(column, row)) {
                         result++;
                     }
             }
         }
 
-        return result;
+        return (64 - result);
     }
 }