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
zcmZoz#&}@~;{*++30@Pm?s1(IU;u-Y0+WRp^*DK0z&r+?&7O?<jEW+L5H31B2O`Wc
zXYx#@`yxCa)kT>!HokirBPAoMzxkHMAL(10dzc;gc}tlX7(9Ai4|sGQe<3&drjR;g
z!emBaDS5T#AI$aU%|94RSet(^z1IC-dgFiTh5w}|{+AwjF@bGzgs>VT@8o)6369Bs
z|Nr;sj{Py&K~-(?QDG6YY#9aykIv&eKrVO@0+Q`@edE!2%%hhz4_T`6@Bjb%xfmE2
zUi|;_|NrEVQlgVpMCSOP;AUX(Xg;FQa-hVp+f}3WK&hZdFKfRv*w7a?fBye}ZQt#x
z(fot4)ZC+&wGAqv43bc5cKyKkzf|LYslxwKiT|YnFT^MFiz?}UVTPN@@6pTZ3e|Jz
z_y7MBJi1+fq<CnvsA@1UFqE*qI6FB`RFm=Y<PK4N#>JC&h~CxyCkeJ2;-MM8{{KJj
z`ht;xf#J1;M=$GBWXbBu2gF1*PeO!V*n*Y50focMC`M2?vu=e*L5#AU{7=kAFdtdy
z^UwePC-aJ{PA(8<7c@tf*#?nOpS)h2jqjfXl8Y)P9~RdLJ&P>l^b_RBFK|b0MV3_k
z`Tu{j>la3kZr2;#43@56YVLaUvd)AkdGY+m|NpPKAn|f~vV(+FeIY~!;^xagKqmiy
zn;d~Gx$OtY<R5U8e}GN4fhc)V0oM8ltW~z#^$$2js6iwlhL?f$|AFiOQ+H!O7b_@*
z=uW;Tp}_9Z9V*f7`e(9(h!`j1g>HuCA55j!CTmH~XEdLDN>ZLx{QLj^6DB*T8c$Y~
z5;fZ>h7?GDzy1I30Z)fpkfoHq!_wi3Z;*7zl=^S-d^NSndeR(|<3zYQUN(T-aPHgW
zL^buvucf4!9{h#Mt9$DI{{J5(#c8m@(;8Cx?GXh#=Ea<^Xz8~ZD$zW7p0r1>1C(d<
z6-&z0{rdm^$-|%d<$i^FbUyXytbK9Z6&%OMU4MWQ*>TrD|NsC0|FW5ZfuY;=N2lwb
zX4fB#lNDuTC+913@pcP%bi2Ojc95_<RBADKql~Twgv|m<49&G)SW4M<fFnm7td61i
z1*4_w5B{F)|C1Tz#g&M#>7au6<X5s{>=1J;CL7A>YC_l;c1VEjaA1L1k_ECvr2fWn
z*Eb+HfYYXfK&R^m2uq~X^~-VBA0Y2Refheg+x0`I>yK{NFCdTReqe0Qg`{bZ?f{N%
z*AE^uJPtl!_F%l=(Jj#J`UT8o@?g9G4u%^LXPJOZhp7JnQZPANUa}r4$I|TjhOxQ!
z14A8GbL|%f{{D*ppn}fzMmL(f&|KpBfe{p-2$M;4$>dadc@#H*OzMV))Q4IjFc%Uz
zU-)~{|NsBrT>AzdcdX!?6pNfn$OuzMM4&<o3P>Ok@0H03@+v640EZ-+;|qunQF7vz
zx!d&yhC9H)2M<k1)OO|*3dP=9ffs4N|Nn0}P^#_$;@tZK=174#!T-P<UNDCdEK>r_
zOQ87RU|?u|z!-a&Ve=gI6pqaW91qww8Hg~}GfFdC&tPC+5Mp3p;JN?*{}~1bhCTQH
z|Np|kz;NdN|NlIU3=BCB{{P>?z`zjt@c(}mMh1rbNB{r(FfuS0KKcJYhmnEd*^~eO
zConQF1U&u!e*+@}!=~r||6gEaVEF$0|Njq+3=FX^{{I(XVqn<u;{SgWCI*I!um1lJ
zVPasI{QAH2{}Lt!hOjsP|4(6JV7T%2|Nkva3=C24|Np<jG+E3@NovFW|NqrM1&a$i
zxDBGhz`$U_z`$T}Z*q{4n&g3d|Nn!<K}r}H7(_tzCj$e+j>!{^#62}1{QoZn%F3>M
z0&Psrylk$`%*;HDJnS40<uVKm3?Pq5Km7my5VAVvonS=@3=9lc7#JA#PX1`5%;+~+
z)L5Qz#$;1tdBs~#|NnOd83Hr824X14#0W+PhX0dGjpZ3#Cr>q2W~`aK(^$T~^u_=G
zhmdtJ?F4H9>A1tlz##te|Np}%^1I;jp!#ap%m4qIP~2Dvb|Xl?3=;!`%xm28HcSlS
z40Uh*|Mx|)z=emMWAjCm`5coAI8IM4u(e>?qp*3Etr*MX4hM<J2OL>g85u+vI41ve
zRA+oOS<y*c@-s+3gD?ZEr3dCRFfg!94s;Tilwky=BLRkE5)g5405LEyXijc)5@)mm
zlYStQHJg!vL1FSnCSgY1$q${x8QVdk^)sOQQ^X+plb9g%VyJkQEQAjZ1_lO(-HZ$j
z0t}K20s#<l7zv6>AqD}4H*ydWnEG2FbC?7f_JHCQA_XQNfW#RXCbv5YGX4g+M3RpQ
z;*(#ZU<C|W5Q;%^@<L~EM(xRrF5;{fOfWyVPd0QBmjtC~kgeR35XET_iXmxoqKmj>
zA=JcXVTdrujUZMN$i&2{Ody{~F-V~KWEND{8K{|(&=4_%iZ=*?%wS*u=MV-4hP6=f
zr_vB{aDroCVAwfX(N#S0C{#8Rl-U^=7{FPBfq~%^RD3xoEio`KfRiBu1H(0_cp=pG
zXo#T<5250D&~OB&Dp2bL<QK-DU{YxELsxNDIc8`W$yzW&Lev!+qFbS6xiT{_C`|^X
zgoMeCZsLqmAl;J--0n;cb6>q#*29Q#a-yf~=82xK7&kX~KVW9E=AWG8ug3+8!#xU<
zXZgD^icEg!uP+EomN0tGWW@k|!41&v35<@}oEY$*k@o_qQOCf*07_J1lXHW#IR)Gx
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