From b5370a3c192a358c021189225659e3447ca49839 Mon Sep 17 00:00:00 2001
From: "sabrina.lapaire" <sabrina.lapaire@etu.hesge.ch>
Date: Mon, 24 Mar 2025 17:17:57 +0100
Subject: [PATCH] Modifier twoPlayers.c

---
 src/twoPlayers.c | 178 ++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 175 insertions(+), 3 deletions(-)

diff --git a/src/twoPlayers.c b/src/twoPlayers.c
index 92b0314..e0036b7 100644
--- a/src/twoPlayers.c
+++ b/src/twoPlayers.c
@@ -1,9 +1,181 @@
 #include "twoPlayers.h"
 
-void play(){
-    
+int current_line(struct board board, int no_col){
+    int no_line = board.line-1;
+    while(board.data[no_line][no_col] != Vide){
+        no_line--;
+    }
+    return no_line;
 }
 
-bool winner(){
+bool is_full_board(struct board board){
+    for(int i = 0; i < board.line; i++){
+        for(int j = 0; j < board.col; j++){
+            if(board.data[i][j] == Vide){
+                return false;
+            }
+        }
+    }
+    return true;
+}
+
+bool row_of_four(struct board *board){
+    int sum = 0;
+    int i = 0;
+    int old_i = -1;
+    while(i < board->col){
+        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;
+    }
+    return false;
+}
+
+bool col_of_four(struct board *board){
+    int sum = 0;
+    int i = board->line -1;
+    int old_i = -1;
+    while(i >= 0){
+        old_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++;
+        }
+        i--;
+    }
+    if(sum >= 4){
+        return true;
+    }
     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
+        }
+    }
+
+    // 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
+        }
+    }
+
+    // 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){
+    if(row_of_four(&board) || diag_of_four_left_right(&board) || diag_of_four_right_left(&board) || col_of_four(&board)){
+        return true;
+    }
+    return false;
+}
+
+
+void play(struct board board){
+    int no_col = 0;
+    int no_line = 0;
+    int no_round = 1;
+    while(!is_full_board(board)){
+        printf("Column number? (starts at 1):");
+        scanf("%d", &no_col);
+        no_line = current_line(board,no_col - 1);
+        if(no_round % 2 != 0){
+            board.data[no_line][no_col - 1] = Croix;
+            board.last_symbole = Croix;
+        }
+        else{
+            board.data[no_line][no_col - 1] = Cercle;
+            board.last_symbole = Cercle;
+        }
+        board.last_pos_x = no_line;
+        board.last_pos_y = no_col - 1;
+        print_game(&board);
+        if(winner(board)){
+            if(board.last_symbole == Croix){
+                printf("Player one won\n");
+            }
+            else if(board.last_symbole == Cercle){
+                printf("Player two won\n");
+            }
+            break;
+        }
+        no_round++;
+    }
+    if(is_full_board(board)){
+        printf("It is a draw\n");
+    }
+}
-- 
GitLab