Você está na página 1de 5

#include <stdio.

h>
#include <stdlib.h>
#include <time.h>

#define TAMANHO_TABULEIRO 3

// Estrutura para armazenar informações do jogador


typedef struct {
char nome[50];
int pontuacao;
} Jogador;

// Função para inicializar o tabuleiro


char** inicializarTabuleiro(int tamanho) {
char** tabuleiro = (char**)malloc(tamanho * sizeof(char*));
for (int i = 0; i < tamanho; i++) {
tabuleiro[i] = (char*)malloc(tamanho * sizeof(char));
for (int j = 0; j < tamanho; j++) {
tabuleiro[i][j] = ' ';
}
}
return tabuleiro;
}

// Função para imprimir o tabuleiro


void imprimirTabuleiro(char** tabuleiro, int tamanho) {
for (int i = 0; i < tamanho; i++) {
for (int j = 0; j < tamanho; j++) {
printf(" %c ", tabuleiro[i][j]);
if (j < tamanho - 1) {
printf("|");
}
}
printf("\n");
if (i < tamanho - 1) {
for (int k = 0; k < tamanho * 4 - 1; k++) {
printf("-");
}
printf("\n");
}
}
}

// Função para verificar se uma célula está vazia


int celulaVazia(char** tabuleiro, int linha, int coluna) {
return tabuleiro[linha][coluna] == ' ';
}

// Função para verificar se há um vencedor


int verificarVencedor(char** tabuleiro, int tamanho, char jogador) {
// Verificar linhas e colunas
for (int i = 0; i < tamanho; i++) {
if ((tabuleiro[i][0] == jogador && tabuleiro[i][1] == jogador &&
tabuleiro[i][2] == jogador) ||
(tabuleiro[0][i] == jogador && tabuleiro[1][i] == jogador &&
tabuleiro[2][i] == jogador)) {
return 1; // Vencedor encontrado
}
}
// Verificar diagonais
if ((tabuleiro[0][0] == jogador && tabuleiro[1][1] == jogador && tabuleiro[2]
[2] == jogador) ||
(tabuleiro[0][2] == jogador && tabuleiro[1][1] == jogador && tabuleiro[2]
[0] == jogador)) {
return 1; // Vencedor encontrado
}
return 0; // Nenhum vencedor ainda
}

// Função para jogada do computador


void jogadaComputador(char** tabuleiro, int tamanho, char jogador) {
int linha, coluna;
do {
linha = rand() % tamanho;
coluna = rand() % tamanho;
} while (!celulaVazia(tabuleiro, linha, coluna));

tabuleiro[linha][coluna] = jogador;
}

// Função para liberar a memória do tabuleiro


void liberarTabuleiro(char** tabuleiro, int tamanho) {
for (int i = 0; i < tamanho; i++) {
free(tabuleiro[i]);
}
free(tabuleiro);
}

int main() {
// Inicialização do gerador de números aleatórios para jogada do computador
srand(time(NULL));

// Menu principal
int opcao;
do {
printf("\n----- Menu -----\n");
printf("1. Jogar contra outro jogador\n");
printf("2. Jogar contra o computador\n");
printf("3. Ver Ranking\n");
printf("4. Créditos\n");
printf("5. Sair\n");
printf("Escolha uma opção: ");
scanf("%d", &opcao);

switch (opcao) {
case 1: {
// Jogo contra outro jogador
char** tabuleiro = inicializarTabuleiro(TAMANHO_TABULEIRO);
int jogadas = 0;

Jogador jogador1, jogador2;


printf("Nome do Jogador 1: ");
scanf("%s", jogador1.nome);
jogador1.pontuacao = 0;

printf("Nome do Jogador 2: ");


scanf("%s", jogador2.nome);
jogador2.pontuacao = 0;
while (1) {
printf("\n%s (X)\n", jogador1.nome);
imprimirTabuleiro(tabuleiro, TAMANHO_TABULEIRO);
int linha, coluna;
printf("Digite a linha e coluna (separadas por espaço): ");
scanf("%d %d", &linha, &coluna);

if (celulaVazia(tabuleiro, linha - 1, coluna - 1)) {


tabuleiro[linha - 1][coluna - 1] = 'X';
jogadas++;
} else {
printf("Célula ocupada. Tente novamente.\n");
continue;
}

if (verificarVencedor(tabuleiro, TAMANHO_TABULEIRO, 'X')) {


printf("\n%s venceu!\n", jogador1.nome);
jogador1.pontuacao++;
break;
}

if (jogadas == TAMANHO_TABULEIRO * TAMANHO_TABULEIRO) {


printf("\nEmpate!\n");
break;
}

printf("\n%s (O)\n", jogador2.nome);


imprimirTabuleiro(tabuleiro, TAMANHO_TABULEIRO);
printf("Digite a linha e coluna (separadas por espaço): ");
scanf("%d %d", &linha, &coluna);

if (celulaVazia(tabuleiro, linha - 1, coluna - 1)) {


tabuleiro[linha - 1][coluna - 1] = 'O';
jogadas++;
} else {
printf("Célula ocupada. Tente novamente.\n");
continue;
}

if (verificarVencedor(tabuleiro, TAMANHO_TABULEIRO, 'O')) {


printf("\n%s venceu!\n", jogador2.nome);
jogador2.pontuacao++;
break;
}
}

liberarTabuleiro(tabuleiro, TAMANHO_TABULEIRO);
break;
}
case 2: {
// Jogo contra o computador
char** tabuleiro = inicializarTabuleiro(TAMANHO_TABULEIRO);
int jogadas = 0;

Jogador jogador1, jogador2;


printf("Nome do Jogador: ");
scanf("%s", jogador1.nome);
jogador1.pontuacao = 0;
jogador2.pontuacao = 0;

while (1) {
printf("\n%s (X)\n", jogador1.nome);
imprimirTabuleiro(tabuleiro, TAMANHO_TABULEIRO);
int linha, coluna;
printf("Digite a linha e coluna (separadas por espaço): ");
scanf("%d %d", &linha, &coluna);

if (celulaVazia(tabuleiro, linha - 1, coluna - 1)) {


tabuleiro[linha - 1][coluna - 1] = 'X';
jogadas++;
} else {
printf("Célula ocupada. Tente novamente.\n");
continue;
}

if (verificarVencedor(tabuleiro, TAMANHO_TABULEIRO, 'X')) {


printf("\n%s venceu!\n", jogador1.nome);
jogador1.pontuacao++;
break;
}

if (jogadas == TAMANHO_TABULEIRO * TAMANHO_TABULEIRO) {


printf("\nEmpate!\n");
break;
}

printf("\n%s (O)\n", jogador2.nome);


imprimirTabuleiro(tabuleiro, TAMANHO_TABULEIRO);
jogadaComputador(tabuleiro, TAMANHO_TABULEIRO, 'O');
jogadas++;

if (verificarVencedor(tabuleiro, TAMANHO_TABULEIRO, 'O')) {


printf("\n%s venceu!\n", jogador2.nome);
jogador2.pontuacao++;
break;
}
}

liberarTabuleiro(tabuleiro, TAMANHO_TABULEIRO);
break;
}
case 3: {
// Ver ranking
FILE* arquivo = fopen("ranking.txt", "r");
if (arquivo == NULL) {
printf("Nenhum dado no ranking ainda.\n");
} else {
printf("\n----- Ranking -----\n");
char nome[50];
int pontuacao;
while (fscanf(arquivo, "%s %d", nome, &pontuacao) != EOF) {
printf("%s: %d\n", nome, pontuacao);
}
fclose(arquivo);
}
break;
}
case 4:
// Créditos
printf("\nDesenvolvido por [1-Giovanna Vogeley\n2-André Guilherme\
n3-Yann Wanderlei\n4-Maria Eduarda\n5-Mariana de Carvalho.]\n");
break;
case 5:
// Sair do jogo
printf("\nSaindo do jogo. Até a próxima!\n");
break;
default:
printf("\nOpção inválida. Tente novamente.\n");
}
} while (opcao != 5);

return 0;
}

Você também pode gostar