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