From d9a21531f00c671fa6091f7c25047ab4e17bf201 Mon Sep 17 00:00:00 2001 From: Sabrina <sabrinalap98@gmail.com> Date: Fri, 4 Apr 2025 15:11:19 +0200 Subject: [PATCH] Mode smartAI fonctionnel --- Makefile | 7 ++- puissance4 | Bin 21072 -> 21248 bytes src/board.c | 4 +- src/main.c | 2 +- src/smartAI.h | 13 +++++ src/winnerCheck.c | 124 +++++++++++----------------------------------- 6 files changed, 50 insertions(+), 100 deletions(-) diff --git a/Makefile b/Makefile index 5615fc1..b49a908 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ -puissance4: main.o twoPlayers.o board.o randomAI.o winnerCheck.o +puissance4: main.o twoPlayers.o board.o randomAI.o winnerCheck.o smartAI.o @echo "first rule which must create the puissance4 executable" - gcc main.o twoPlayers.o board.o randomAI.o winnerCheck.o -o puissance4 + gcc main.o twoPlayers.o board.o randomAI.o winnerCheck.o smartAI.o -o puissance4 main.o : src/main.c gcc -Wall -Wextra -c src/main.c @@ -17,6 +17,9 @@ randomAI.o : src/randomAI.c src/randomAI.h winnerCheck.o : src/winnerCheck.c src/winnerCheck.h gcc -Wall -Wextra -c src/winnerCheck.c +smartAI.o : src/smartAI.c src/smartAI.h + gcc -Wall -Wextra -c src/smartAI.c + clean: @echo "this rule must clean everything up (including candidate files in testbed)" $(MAKE) -C testbed clean diff --git a/puissance4 b/puissance4 index b3441d6b1a713cd5c12c285222be1208e96776b9..1084deb680f98e69a3ea65796a3dcb24250ff9aa 100755 GIT binary patch delta 4902 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 delta 3337 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 Sj!K)nFvy&#%yaUsAT<D~4rd+! diff --git a/src/board.c b/src/board.c index 6e4186c..20bad7f 100644 --- a/src/board.c +++ b/src/board.c @@ -65,8 +65,8 @@ void print_game(struct board *board){ } int current_line(struct board board, int no_col){ - int no_line = board.line-1; - while(board.data[no_line][no_col] != Vide){ + int no_line = board.line - 1; + while (no_line >= 0 && board.data[no_line][no_col] != Vide) { no_line--; } return no_line; diff --git a/src/main.c b/src/main.c index a24f9b0..3acfb6d 100644 --- a/src/main.c +++ b/src/main.c @@ -15,7 +15,7 @@ int main(int argc, char **argv){ play_with_randomAI(board); break; case 2: - //play_with_smartAI(board); + play_with_smartAI(board); break; case 3: play_two_players(board); diff --git a/src/smartAI.h b/src/smartAI.h index e69de29..99d569d 100644 --- a/src/smartAI.h +++ b/src/smartAI.h @@ -0,0 +1,13 @@ +#include <stdlib.h> +#include <stdio.h> +#include "board.h" +#include "winnerCheck.h" + +#ifndef randomAI_h +#define randomAI_h + +int is_possible_to_win(struct board *board); +int is_possible_to_block_player(struct board *board); +void play_with_smartAI(struct board board); + +#endif \ No newline at end of file diff --git a/src/winnerCheck.c b/src/winnerCheck.c index 50d2095..dd06dd4 100644 --- a/src/winnerCheck.c +++ b/src/winnerCheck.c @@ -1,124 +1,58 @@ #include "winnerCheck.h" bool row_of_four(struct board *board){ - int sum = 1; - int i = 0; - int old_i = -1; - while(i < board->col - 1){ - old_i = i; - i++; - if(board->data[board->last_pos_x][i] == board->last_symbole && board->data[board->last_pos_x][old_i] == board->last_symbole){ - sum++; - } - if(sum == 4){ - return true; + for (int col = 0; col < board->col - 3; col++) { + if (board->data[board->last_pos_x][col] != Vide && + board->data[board->last_pos_x][col] == board->data[board->last_pos_x][col+1] && + board->data[board->last_pos_x][col] == board->data[board->last_pos_x][col+2] && + board->data[board->last_pos_x][col] == board->data[board->last_pos_x][col+3]) { + return true; // Il y a une victoire } } return false; } bool col_of_four(struct board *board){ - int sum = 1; - int i = 0; - int old_i = -1; - while(i < board->line -1){ - old_i = i; - i++; - if(board->data[i][board->last_pos_y] == board->last_symbole && board->data[old_i][board->last_pos_y] == board->last_symbole){ - sum++; - } - - if(sum == 4){ - return true; + for (int row = 0; row < board->line - 3; row++) { + if (board->data[row][board->last_pos_y] != Vide && + board->data[row][board->last_pos_y] == board->data[row+1][board->last_pos_y] && + board->data[row][board->last_pos_y] == board->data[row+2][board->last_pos_y] && + board->data[row][board->last_pos_y] == board->data[row+3][board->last_pos_y]) { + return true; // Il y a une victoire } } return false; } bool diag_of_four_left_right(struct board *board){ - int sum = 1; // Nous commençons à 1 car le dernier symbole est déjà compté - int current_x = board->last_pos_x; - int current_y = board->last_pos_y; - int oldx = -1; - int oldy = -1; - - // Vérification de la diagonale supérieure gauche à la diagonale inférieure droite - while (current_x > 0 && current_y > 0) { - oldx = current_x; - oldy = current_y; - current_x--; - current_y--; - - if (board->data[current_x][current_y] == board->last_symbole && board->data[oldx][oldy] == board->last_symbole) { - sum++; // Increment only if we find consecutive symbols + for (int row = 0; row < board->line - 3; row++) { + for (int col = 0; col < board->col - 3; col++) { + if (board->data[row][col] != Vide && + board->data[row][col] == board->data[row+1][col+1] && + board->data[row][col] == board->data[row+2][col+2] && + board->data[row][col] == board->data[row+3][col+3]) { + return true; // Il y a une victoire + } } } - - // Réinitialisation des coordonnées - current_x = board->last_pos_x; - current_y = board->last_pos_y; - - // Vérification de la diagonale inférieure droite à la diagonale supérieure gauche - while (current_x < board->line - 1 && current_y < board->col - 1) { - oldx = current_x; - oldy = current_y; - current_x++; - current_y++; - - if (board->data[current_x][current_y] == board->last_symbole && board->data[oldx][oldy] == board->last_symbole) { - sum++; // Increment only if we find consecutive symbols - } - } - - // Vérifie si sum est exactement égal à 4 - if (sum == 4) { - return true; // We found 4 consecutive symbols - } return false; // No 4 consecutive symbols found } bool diag_of_four_right_left(struct board *board){ - int sum = 1; // On commence à 1 car le dernier symbole est déjà compté - int current_x = board->last_pos_x; - int current_y = board->last_pos_y; - int oldx = -1; - int oldy = -1; - - // Vérification de la diagonale montante gauche à la diagonale descendante droite - while (current_x > 0 && current_y < board->col - 1) { - oldx = current_x; - oldy = current_y; - current_x--; - current_y++; - - if (board->data[current_x][current_y] == board->last_symbole && board->data[oldx][oldy] == board->last_symbole) { - sum++; // Incrémenter seulement si les symboles sont consécutifs - } - } - - // Réinitialisation des coordonnées - current_x = board->last_pos_x; - current_y = board->last_pos_y; - - // Vérification de la diagonale descendante gauche à la diagonale montante droite - while (current_x < board->line - 1 && current_y >= 0) { - oldx = current_x; - oldy = current_y; - current_x++; - current_y--; - - if (board->data[current_x][current_y] == board->last_symbole && board->data[oldx][oldy] == board->last_symbole) { - sum++; // Incrémenter seulement si les symboles sont consécutifs + for (int row = 0; row < board->line - 3; row++) { + for (int col = 3; col < board->col; col++) { + if (board->data[row][col] != Vide && + board->data[row][col] == board->data[row+1][col-1] && + board->data[row][col] == board->data[row+2][col-2] && + board->data[row][col] == board->data[row+3][col-3]) { + return true; // Il y a une victoire + } } } - - // Vérifie si sum est exactement égal à 4 - if (sum == 4) { - return true; // Si 4 symboles consécutifs sont trouvés, retourner true - } return false; // Sinon, retourner false } bool winner(struct board board){ + //printf("kasjh\n\n\n\n"); return row_of_four(&board) || diag_of_four_left_right(&board) || diag_of_four_right_left(&board) || col_of_four(&board); } \ No newline at end of file -- GitLab