diff --git a/AI/src/game/penguin.cpp b/AI/src/game/penguin.cpp
index 6848ce67dce6deefcd7df5d1dd7e5bcb545a6e40..4d9d6c83c7d66423bfe91af8b99385ea4be33cff 100644
--- a/AI/src/game/penguin.cpp
+++ b/AI/src/game/penguin.cpp
@@ -43,28 +43,15 @@ namespace game
 			if(json_state["score"].count("blue")) { state.score_blue = json_state["score"]["blue"]; }
 		}
 
-		//Update moves on all penguins
-		uint64_t obstacles = (~(state.one_fish | state.two_fish | state.three_fish));
-		obstacles |= ((uint64_t) 1) << (state.p1_red & 63);
-		obstacles |= ((uint64_t) 1) << (state.p2_red & 63);
-		obstacles |= ((uint64_t) 1) << (state.p3_red & 63);
-		obstacles |= ((uint64_t) 1) << (state.p4_red & 63);
-		obstacles |= ((uint64_t) 1) << (state.p1_blue & 63);
-		obstacles |= ((uint64_t) 1) << (state.p2_blue & 63);
-		obstacles |= ((uint64_t) 1) << (state.p3_blue & 63);
-		obstacles |= ((uint64_t) 1) << (state.p4_blue & 63);
-
+		// We compute the moves for all penguin
+		uint64_t obstacles = create_obstacles_bitboard();
 		state.nb_moves_red = 0;
 		state.nb_moves_blue = 0;
-		state.nb_moves_red += update_moves(&state.p1_red, obstacles);
-		state.nb_moves_red += update_moves(&state.p2_red, obstacles);
-		state.nb_moves_red += update_moves(&state.p3_red, obstacles);
-		state.nb_moves_red += update_moves(&state.p4_red, obstacles);
-		state.nb_moves_blue += update_moves(&state.p1_blue, obstacles);
-		state.nb_moves_blue += update_moves(&state.p2_blue, obstacles);
-		state.nb_moves_blue += update_moves(&state.p3_blue, obstacles);
-		state.nb_moves_blue += update_moves(&state.p4_blue, obstacles);
-
+		for(int i = 0; i < 4; i++)
+		{
+			state.nb_moves_red += update_penguin_moves(&state.peng_red[i], obstacles);
+			state.nb_moves_blue += update_penguin_moves(&state.peng_blue[i], obstacles);
+		}
 		if (state.nb_moves_red == 0)
 		{
 			state.canPlay_red = false;
@@ -181,13 +168,35 @@ namespace game
 		(*p) = (8 * (rel_move +1)) + ((*p) & 63);
 	}
 
-	int penguin::update_moves(uint32_t* p, uint64_t obstacles)
+	/* Create bitboard of obstacles: 1 if there is an obstacle, 0 if the penguin can
+		move freely on the tile
+	*/
+	uint64_t penguin::create_obstacles_bitboard()
+	{
+		uint64_t obstacles = (~(state.one_fish | state.two_fish | state.three_fish));
+		for(int i = 0; i < 4; i++)
+		{
+			obstacles |= ((uint64_t) 1) << PENGUIN_POS(state.peng_red[i]);
+			obstacles |= ((uint64_t) 1) << PENGUIN_POS(state.peng_blue[i]);
+		}
+		return obstacles;
+	}
+
+	/* Updates the moves of a signle penguin.
+		This computes the moves in every direction according to the penguin position and the obstacles.
+		Parameters:
+			- p: a penguin that will be updated. Only his position is used and the rest is computed
+			- obstacles: a bitboard of obstacles: 1 means an obstacle in that tile
+		Returns:
+			Total moves of this penguin.
+	*/
+	int penguin::update_penguin_moves(uint32_t* p, uint64_t obstacles)
 	{
-	#define IsFree(i) (((obstacles >> (i)) & 1) == 0)
-		int pos = (*p) & 63;
+		#define IsFree(i) (((obstacles >> (i)) & 1) == 0)
+		int pos = PENGUIN_POS(*p);
 		(*p) = pos; //Reset the penguin to all zeros except the position
 		int i = pos;
-		uint32_t nbmoves = 0;
+		uint32_t nbmoves = 0; //Nb of moves in one direction
 		uint32_t total_moves = 0;
 
 		//Direction A
@@ -209,7 +218,7 @@ namespace game
 		//Direction C
 		nbmoves = 0;
 		i = pos;
-		while((i-8 > 0) && (i%15 != 0) && IsFree(i-8))
+		while((i-8 >= 0) && (i%15 != 0) && IsFree(i-8))
 		{
 			i -= 8;
 			nbmoves++; total_moves++;
@@ -300,36 +309,24 @@ namespace game
 				else
 					state.score_blue += 3;
 				//We replace this tile with an empty one (0 in the bitboard)
-				state.one_fish = state.one_fish & ~(((uint64_t) 1) << PENGUIN_POS(*peng));
+				state.three_fish = state.three_fish & ~(((uint64_t) 1) << PENGUIN_POS(*peng));
 			}
 
 			// MOVE THE PENGUIN
 			move_penguin(peng, rel_move);
 		}
 		// END CAN_WE PLAY. We will now compute the moves for every penguin and for the player.
-
-		//Update moves on all penguins of the next player
-		uint64_t obstacles = (~(state.one_fish | state.two_fish | state.three_fish));
-		obstacles |= ((uint64_t) 1) << (state.p1_red & 63);
-		obstacles |= ((uint64_t) 1) << (state.p2_red & 63);
-		obstacles |= ((uint64_t) 1) << (state.p3_red & 63);
-		obstacles |= ((uint64_t) 1) << (state.p4_red & 63);
-		obstacles |= ((uint64_t) 1) << (state.p1_blue & 63);
-		obstacles |= ((uint64_t) 1) << (state.p2_blue & 63);
-		obstacles |= ((uint64_t) 1) << (state.p3_blue & 63);
-		obstacles |= ((uint64_t) 1) << (state.p4_blue & 63);
+		uint64_t obstacles = create_obstacles_bitboard();
 
 		state.nb_moves_red = 0;
 		state.nb_moves_blue = 0;
 
 		if (state.current_player_red) //Red just played
 		{
-			if(state.canPlay_blue)
+			if(state.canPlay_blue) //If blue couldn't play last turn there is no way he could play this new turn
 			{
-				state.nb_moves_blue += update_moves(&state.p1_blue, obstacles);
-				state.nb_moves_blue += update_moves(&state.p2_blue, obstacles);
-				state.nb_moves_blue += update_moves(&state.p3_blue, obstacles);
-				state.nb_moves_blue += update_moves(&state.p4_blue, obstacles);
+				for(int i = 0; i < 4; i++)
+					state.nb_moves_blue += update_penguin_moves(&state.peng_blue[i], obstacles);
 				if (state.nb_moves_blue == 0)
 				{
 					state.canPlay_blue = false;
@@ -338,19 +335,16 @@ namespace game
 			}
 			else
 			{
-				state.nb_moves_blue = 1;
+				state.nb_moves_blue = 1; //We create an artificial move so that the mcts works
 			}
-
 			state.current_player_red = false;
 		}
 		else //Blue just played
 		{
 			if(state.canPlay_red)
 			{
-				state.nb_moves_red += update_moves(&state.p1_red, obstacles);
-				state.nb_moves_red += update_moves(&state.p2_red, obstacles);
-				state.nb_moves_red += update_moves(&state.p3_red, obstacles);
-				state.nb_moves_red += update_moves(&state.p4_red, obstacles);
+				for(int i = 0; i < 4; i++)
+					state.nb_moves_red += update_penguin_moves(&state.peng_red[i], obstacles);
 				if (state.nb_moves_red == 0)
 				{
 					state.canPlay_red = false;
@@ -361,7 +355,6 @@ namespace game
 			{
 				state.nb_moves_red = 1;
 			}
-
 			state.current_player_red = true;
 		}
 	}
diff --git a/AI/src/game/penguin.hpp b/AI/src/game/penguin.hpp
index 33456409ba4d2d45abdb7f13cd8b110cd28a83a9..4c32b7c8389a267fcae26be56fc161eaaeaccf7f 100644
--- a/AI/src/game/penguin.hpp
+++ b/AI/src/game/penguin.hpp
@@ -83,7 +83,8 @@ namespace game
 			//TODO: modify/delete functions
 			penguin_state state;
 			void move_penguin(uint32_t* p, uint16_t rel_move);
-			int update_moves(uint32_t* p, uint64_t obstacles);
+			uint64_t create_obstacles_bitboard();
+			int update_penguin_moves(uint32_t* p, uint64_t obstacles);
 
 			const uint8_t RED = 0;
 			const uint8_t BLUE = 1;