From 9fdd8a1c4250062d0fa70cd68807c8a731d8c9c8 Mon Sep 17 00:00:00 2001 From: Francesco Bariatti <francesco.bariatti@insa-rennes.fr> Date: Tue, 17 May 2016 19:29:34 +0200 Subject: [PATCH] Renamed update_moves to update_penguin_moves and changed calls to that function and created function to create obstacles bitboard --- AI/src/game/penguin.cpp | 91 +++++++++++++++++++---------------------- AI/src/game/penguin.hpp | 3 +- 2 files changed, 44 insertions(+), 50 deletions(-) diff --git a/AI/src/game/penguin.cpp b/AI/src/game/penguin.cpp index 6848ce6..4d9d6c8 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 3345640..4c32b7c 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; -- GitLab