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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
E1E~&Y9smFU

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