Correction : Tic-Tac-Toe
# 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