Programmation bas niveau (BNV) Help

Correction : Tic-Tac-Toe

Code source de la correction

# Coda - BNV - Tic Tac Toe
# Makefile NAME = tic-tac-toe SRCS = main.c \ board.c \ moves.c \ computer.c all : $(NAME) $(NAME): $(SRCS) gcc $(SRCS) -o $(NAME) fclean: rm -f $(NAME) re: fclean all
#include "tic-tac-toe.h" int main() { char **board; int winner; int end; int move; // j'initialise le plateau de jeu (board.c) board = init_board(); winner = -1; end = -1; // je lance la boucle de jeu while(end == -1) { // j'affiche le plateau de jeu (board.c) display_board(board); // je demande à l'utilisateur l'action qu'il veut faire (moves.c) move = ask_player_move(board); if(move != -1) // si l'action du joueur peut être faite { sleep(2); // pause de 2 secondes display_board(board); // j'affiche le plateau computer_move(board); // je fais l'action de l'ordinateur sleep(2); // pause de 2 secondes system("clear"); // je rafraichis le terminal winner = check_win(board); // je vérifie si quelqu'un a gagné (board.c) if(winner != -1) // si quelqu'un a gagné { end = 1; // je dis à la boucle de se terminer au prochain tour if(winner == 1) // 1 : victoire du joueur { printf("C'est gagné !\n"); } else // 0 : victoire de l'ordinateur { printf("C'est perdu!\n"); } } else { // je vérifie si il n'y a pas un match nul end = check_end(board); } } } if(winner == -1) { printf("Match nul!\n"); } free(board); return 0; }
#include "tic-tac-toe.h" char ** init_board() { char ** board; int i; int j; i = 0; board = malloc(4 * sizeof(*board)); // le tableau aura 3 lignes board[3] = NULL; while(i < 3) { board[i] = malloc(4 * sizeof(char)); // chaque ligne aura 3 colonnes board[i][3] = `\0`; j = 0; while(j < 3) { board[i][j] = ' '; // je remplis avec des espaces pour que ça s'affiche "vide" sur le terminal j++; } i++; } return board; } /* J'affiche le tableau mis en forme sur le terminal */ void display_board(char **board) { int i; i = 0; printf("\n"); while(i < 3) { printf("%c | %c | %c\n", board[i][0], board[i][1], board[i][2]); if( i < 2) { printf("---------\n"); } i++; } printf("\n"); } /* le fonction compte s'il reste des cases vides pour savoir si on a pas un match nul */ int check_end(char **board) { int i; int j; int empty; i = 0; empty = 0; while(i < 3) { j = 0; while(j < 3) { if(board[i][j] == ' ') { empty++; } j++; } i++; } if(empty > 0) { return -1; } return 1; } /* Je vérifie chaque ligne, chaque colonne et chaque diagonale pour voir si quelqu'un a gagné */ int check_win(char **board) { if((board[0][0] == 'X') && (board[0][1] == 'X') && (board[0][2] == 'X')) { return 1; } else if(board[1][0] == 'X' && board[1][1] == 'X' && board[1][2] == 'X') { return 1; } else if(board[2][0] == 'X' && board[2][1] == 'X' && board[2][2] == 'X') { return 1; } else if(board[0][0] == 'X' && board[1][0] == 'X' && board[2][0] == 'X') { return 1; } else if(board[0][1] == 'X' && board[1][1] == 'X' && board[2][1] == 'X') { return 1; } else if(board[0][2] == 'X' && board[1][2] == 'X' && board[2][2] == 'X') { return 1; } else if(board[0][0] == 'X' && board[1][1] == 'X' && board[2][2] == 'X') { return 1; } else if(board[0][2] == 'X' && board[1][1] == 'X' && board[2][0] == 'X') { return 1; } if((board[0][0] == 'O') && (board[0][1] == 'O') && (board[0][2] == 'O')) { return 0; } else if(board[1][0] == 'O' && board[1][1] == 'O' && board[1][2] == 'O') { return 0; } else if(board[2][0] == 'O' && board[2][1] == 'O' && board[2][2] == 'O') { return 0; } else if(board[0][0] == 'O' && board[1][0] == 'O' && board[2][0] == 'O') { return 0; } else if(board[0][1] == 'O' && board[1][1] == 'O' && board[2][1] == 'O') { return 0; } else if(board[0][2] == 'O' && board[1][2] == 'O' && board[2][2] == 'O') { return 0; } else if(board[0][0] == 'O' && board[1][1] == 'O' && board[2][2] == 'O') { return 0; } else if(board[0][2] == 'O' && board[1][1] == 'O' && board[2][0] == 'O') { return 0; } return -1; }
#include "tic-tac-toe.h" /* cet ordinateur est bête il remplit la première case dispo */ int computer_move(char **board) { int i; int j; i = 0; while(i < 3) { j = 0; while( j < 3) { if(board[i][j] == ' ') { board[i][j] = 'O'; return 0; } j++; } i++; } return -1; }
#include "tic-tac-toe.h" /* Je vérifie si la case où le joueur veut jouer est vide */ int check_player_move(char **board, int move) { if(move == 0 && board[0][0] != ' ') { return -1; } else if(move == 1&& board[0][1] != ' ') { return -1; } else if(move == 2 && board[0][2] != ' ') { return -1; } else if(move == 3 && board[1][0] != ' ') { return -1; } else if(move == 4 && board[1][1] != ' ') { return -1; } else if(move == 5 && board[1][2] != ' ') { return -1; } else if(move == 6 && board[2][0] != ' ') { return -1; } else if(move == 7 && board[2][1] != ' ') { return -1; } else if(move == 8 && board[2][2] != ' ') { return -1; } else { return 0; } } /* Je fais l'action du joueur */ void player_move(char **board, int move) { if(move == 0) { board[0][0] = 'X'; } else if(move == 1) { board[0][1] = 'X'; } else if(move == 2) { board[0][2] = 'X'; } else if(move == 3) { board[1][0] = 'X'; } else if(move == 4) { board[1][1] = 'X'; } else if(move == 5) { board[1][2] = 'X'; } else if(move == 6) { board[2][0] = 'X'; } else if(move == 7) { board[2][1] = 'X'; } else if(move == 8) { board[2][2] = 'X'; } } /* Je demande son action au joueur */ int ask_player_move(char **board) { int choice; printf("Choisissez où jouer : \n"); scanf("%d", &choice); if(check_player_move(board, choice) != -1) { player_move(board, choice); return 0; } else { printf("Vous ne pouvez pas jouer à cet endroit!\n"); return -1; } }
#ifndef __TIC_TAC_TOE_H__ #define __TIC_TAC_TOE_H__ #include <stdlib.h> #include <stdio.h> #include <unistd.h> /* board.c */ char ** init_board(); void display_board(char **board); int check_win(char **board); int check_end(char **board); /* moves.c */ int ask_player_move(char **board); void player_move(char **board, int move); int check_player_move(char **board, int move); /* computer.c */ int computer_move(char **board); #endif
23 October 2025