From: Jérôme Benoit Date: Fri, 5 May 2017 12:33:30 +0000 (+0200) Subject: Implement the helper functions needed to list the playble shots X-Git-Url: https://git.piment-noir.org/?p=Project_algorithmic_C.git;a=commitdiff_plain;h=bbbe0570290fabaa78053bf74b5571ff43b589ae Implement the helper functions needed to list the playble 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 e1290b4..5d9970c 100644 --- a/lib/othello.c +++ b/lib/othello.c @@ -180,25 +180,34 @@ 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]) { - unsigned int nb_pawns_reserved = 0; +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 pawn 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)) { - return 0; + return 0; } if (is_box_type(moving_y, moving_x, pawn_array, current_player)) { break; } - nb_pawns_reserved++; + 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 panws */ - if (nb_pawns_reserved > 0) { + /* now reverse the needed pawns */ + 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)) { @@ -206,25 +215,41 @@ static unsigned int reverse_one_direction(int y, int x, int direction, unsigned direction_to_coordinates(direction, &moving_y, &moving_x); } } - return nb_pawns_reserved; + 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_reserved = 0; + unsigned int nb_pawns_reversed = 0; if (!is_valid_coordinates(y, x) || !is_box_type(y, x, pawn_array, empty)) { return 0; } for (unsigned int direction = north; direction <= north_west; direction++) { - nb_pawns_reserved += 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_reserved == 0) { + if (nb_pawns_reversed == 0) { return 0; } set_pawn(y, x, current_player, pawn_array); - return nb_pawns_reserved; + return nb_pawns_reversed; } diff --git a/lib/othello.h b/lib/othello.h index dc6784e..9800676 100644 --- a/lib/othello.h +++ b/lib/othello.h @@ -45,6 +45,6 @@ bool is_board_full(unsigned int pawn_array[board_size][board_size]); unsigned int count_pawns_type(unsigned int pawn_array[board_size][board_size], unsigned int type); -unsigned int valid_shot(int y, int x, unsigned int current_player, unsigned int pawn_array[board_size][board_size]); +unsigned int valid_shot(int y, int x, unsigned int current_player, unsigned int pawn_array[board_size][board_size]); #endif /* OTHELLO_H */