X-Git-Url: https://git.piment-noir.org/?p=Project_algorithmic_C.git;a=blobdiff_plain;f=lib%2Fothello.c;h=5d9970c6941a0942d8e948a90541a0a55a06fdbd;hp=e1290b4f3f39e6455e8711e784404827552c77aa;hb=bbbe0570290fabaa78053bf74b5571ff43b589ae;hpb=cca9463e74e618b99f79d6b2c29b9b3f4f5a1511 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; }