From: Jérôme Benoit Date: Fri, 5 May 2017 18:24:34 +0000 (+0200) Subject: Merge branch 'master' into playable_shots X-Git-Url: https://git.piment-noir.org/?p=Project_algorithmic_C.git;a=commitdiff_plain;h=6d7fa659380189a35b8d7cce9f0417b4ed1ce3a5;hp=b5cb4c1247e32f76b64166ac0b776de776374631 Merge branch 'master' into playable_shots Signed-off-by: Jérôme Benoit --- diff --git a/lib/debug.c b/lib/debug.c index c7f4dfb..6532079 100644 --- a/lib/debug.c +++ b/lib/debug.c @@ -32,3 +32,7 @@ void display_array(int base_y, int base_x, unsigned int pawn_array[board_size][b } } } + +/* void dbg_mvprintv(int y, int x, ) { + +} */ diff --git a/lib/othello.c b/lib/othello.c index dd92cfb..5d9970c 100644 --- a/lib/othello.c +++ b/lib/othello.c @@ -180,11 +180,11 @@ unsigned int eval_winner(unsigned int nb_white, unsigned int nb_black) { } } -static unsigned int reverse_one_direction(int y, int x, int direction, unsigned int current_player, unsigned int pawn_array[board_size][board_size]) { +static unsigned int count_pawn_to_reverse_one_direction(int y, int x, int direction, unsigned int current_player, unsigned int pawn_array[board_size][board_size]) { unsigned int nb_pawns_reversed = 0; int moving_y = y, moving_x = x; - /* count for pawns to reverse in the chosen direction */ + /* count the pawns to reverse in the chosen direction */ direction_to_coordinates(direction, &moving_y, &moving_x); while (true) { if (!is_valid_coordinates(moving_y, moving_x) || is_box_type(moving_y, moving_x, pawn_array, empty)) { @@ -196,9 +196,18 @@ static unsigned int reverse_one_direction(int y, int x, int direction, unsigned nb_pawns_reversed++; direction_to_coordinates(direction, &moving_y, &moving_x); } + return nb_pawns_reversed; +} + +/* revert the pawns if needed in one direction */ +static unsigned int reverse_one_direction(int y, int x, int direction, unsigned int current_player, unsigned int pawn_array[board_size][board_size], bool dry_run) { + unsigned int nb_pawns_reversed = 0; + int moving_y = y, moving_x = x; + + nb_pawns_reversed = count_pawn_to_reverse_one_direction(moving_y, moving_x, direction, current_player, pawn_array); /* now reverse the needed pawns */ - if (nb_pawns_reversed > 0) { + if (nb_pawns_reversed > 0 && !dry_run) { moving_y = y, moving_x = x; direction_to_coordinates(direction, &moving_y, &moving_x); while (!is_box_type(moving_y, moving_x, pawn_array, current_player)) { @@ -209,6 +218,22 @@ static unsigned int reverse_one_direction(int y, int x, int direction, unsigned return nb_pawns_reversed; } +/* loop optimized version of valid_shot changing nothing to the pawns 2D array */ +static bool is_legal_shot(int y, int x, unsigned int current_player, unsigned int pawn_array[board_size][board_size]) { + unsigned int nb_pawns_reversed = 0; + + if (!is_valid_coordinates(y, x) || !is_box_type(y, x, pawn_array, empty)) { + return false; + } + + for (unsigned int direction = north; direction <= north_west; direction++) { + nb_pawns_reversed += reverse_one_direction(y, x, direction, current_player, pawn_array, true); + if (nb_pawns_reversed > 0) { + return true; + } + } +} + /* play the shot if legal and flip or reverse the necessary pawns */ unsigned int valid_shot(int y, int x, unsigned int current_player, unsigned int pawn_array[board_size][board_size]) { unsigned int nb_pawns_reversed = 0; @@ -218,7 +243,7 @@ unsigned int valid_shot(int y, int x, unsigned int current_player, unsigned int } for (unsigned int direction = north; direction <= north_west; direction++) { - nb_pawns_reversed += reverse_one_direction(y, x, direction, current_player, pawn_array); + nb_pawns_reversed += reverse_one_direction(y, x, direction, current_player, pawn_array, false); } if (nb_pawns_reversed == 0) {