diff --git a/main.c b/main.c index dfd9a11273d46915da79d136855adb7c5f58d432..73c56830d18871b324522fed7ee306a2f47bcf3c 100644 --- a/main.c +++ b/main.c @@ -13,16 +13,16 @@ int main() { puissance game; game_init(&game, RAND_AI, DEFAULT_ROW, DEFAULT_COL); - manual_play(&game, 1); - manual_play(&game, 0); - manual_play(&game, 1); + manual_play(&game, 4); print_game(game); manual_play(&game, 0); - manual_play(&game, 2); - manual_play(&game, 0); manual_play(&game, 3); - print_game(game); manual_play(&game, 0); + manual_play(&game, 2); + print_game(game); + manual_play(&game, 6); + print_game(game); + manual_play(&game, 1); print_game(game); game_destroy(&game); diff --git a/puissance.c b/puissance.c index b5fd37b8ef85d49c33e9168ca2741e797dfb9e29..710911558d2ce8574efe6a9ce2643e1e6c197835 100644 --- a/puissance.c +++ b/puissance.c @@ -118,52 +118,92 @@ void print_game(puissance p) { } } -GameResult vertical_game_check(puissance p, int last_col_index_played) { +GameResult get_winning_player(puissance *p) { + // Return the player who have won. + if (p->current_player == PLAYER_ONE) { + p->state = PLAYER_ONE_WIN; + } else { + p->state = PLAYER_TWO_WIN; + } + return p->state; + +} + +GameResult vertical_game_check(puissance *p, int last_col_index_played) { + if (p->state != ONGOING) { + return p->state; + } + bool four_aligned = false; // Get the row index - int last_row_index_played = get_available_row_index(&p, last_col_index_played); - if (last_row_index_played != EMPTY_CELL_VALUE) { - last_row_index_played += 1; // Adjust the index - } + int last_row_index_played = get_available_row_index(p, last_col_index_played) + 1; // Verify if we have enough vertical space. - if (last_row_index_played + NB_SAME_VALUE_ALIGNED_FOR_WIN - 1 < p.row) { - int last_played_value = p.data[last_row_index_played][last_col_index_played]; + if (last_row_index_played + NB_VERIFICATION_FOR_WIN < p->row) { + int last_played_value = p->data[last_row_index_played][last_col_index_played]; four_aligned = true; // Verify if the aligned value are the same - for (int i = 1; i <= NB_SAME_VALUE_ALIGNED_FOR_WIN - 1; i++) { - if (last_played_value != p.data[last_row_index_played + i][last_col_index_played]) { + for (int i = 1; i <= NB_VERIFICATION_FOR_WIN; i++) { + if (last_played_value != p->data[last_row_index_played + i][last_col_index_played]) { four_aligned = false; break; } } if (four_aligned) { - // Return the player who have won. - if (p.current_player == PLAYER_ONE) { - return PLAYER_ONE_WIN; - } else { - return PLAYER_TWO_WIN; + return get_winning_player(p); + } + } + + return ONGOING; +} + +GameResult horizontal_game_check(puissance *p, int last_col_index_played) { + if (p->state != ONGOING) { + return p->state; + } + + bool four_aligned = false; + // Get the row index + int last_row_index_played = get_available_row_index(p, last_col_index_played) + 1; + int last_played_value = p->data[last_row_index_played][last_col_index_played]; + + // Verify the left + if (last_col_index_played - NB_VERIFICATION_FOR_WIN >= 0) { + four_aligned = true; + for (int i = 1; i <= NB_VERIFICATION_FOR_WIN; i++) { + if (last_played_value != p->data[last_row_index_played][last_col_index_played - i]) { + four_aligned = false; + break; + } + } + } + // Verify the right + if (last_col_index_played + NB_VERIFICATION_FOR_WIN < p->col && four_aligned == false) { + four_aligned = true; + for (int i = 1; i <= NB_VERIFICATION_FOR_WIN; i++) { + if (last_played_value != p->data[last_row_index_played][last_col_index_played + i]) { + four_aligned = false; + break; } } } + if (four_aligned) { + return get_winning_player(p); + } + return ONGOING; } GameResult verify_game(puissance *p, int last_col_index_played) { - GameResult result = ONGOING; // Vertical check - result = vertical_game_check(*p, last_col_index_played); - - if (result != ONGOING) { - p->state = result; - return result; - } + vertical_game_check(p, last_col_index_played); + // Horizontal check + horizontal_game_check(p, last_col_index_played); - p->state = result; - return result; + return p->state; } GameResult display_game_result(GameResult gr) { diff --git a/puissance.h b/puissance.h index 662bff9490ac4f8240fd0ebfb21b1e4a5fc2903b..a70f220882cbee3795f622ba4d3a025cea84f3aa 100644 --- a/puissance.h +++ b/puissance.h @@ -15,8 +15,9 @@ #define DEFAULT_COL 7 #define PLAYER_ONE_STRING "X" #define PLAYER_TWO_STRING "O" -#define EMPTY_CELL_VALUE -1 +#define EMPTY_CELL_VALUE -2 #define NB_SAME_VALUE_ALIGNED_FOR_WIN 4 +#define NB_VERIFICATION_FOR_WIN (NB_SAME_VALUE_ALIGNED_FOR_WIN - 1) typedef enum { RAND_AI,