Created
May 1, 2020 02:18
-
-
Save yuri117/d91063359b89c8af59048b9abe318314 to your computer and use it in GitHub Desktop.
Uma implementação em C que emula um jogo da velha para se jogar em um terminal
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include <stdlib.h> | |
#include <string.h> | |
// Função usada para mostrar o estado do jogo após cada jogada | |
void showGameState(char** gameInfo){ | |
printf("%c |%c |%c |\n", gameInfo[0][0], gameInfo[0][1], gameInfo[0][2]); | |
printf("----+----+-----\n"); | |
printf("%c |%c |%c |\n", gameInfo[1][0], gameInfo[1][1], gameInfo[1][2]); | |
printf("----+----+-----\n"); | |
printf("%c |%c |%c |\n", gameInfo[2][0], gameInfo[2][1], gameInfo[2][2]); | |
} | |
// Função usada para começar uma jogada o valor na matriz por um 'X' ou 'O' | |
void changeGameState(int pos, char** gameInfo, char player){ | |
if(pos <= 3){ | |
if (gameInfo[0][pos - 1] == 'X' || gameInfo[0][pos - 1] == 'O' ) | |
printf("Jogada inválida! Escolha outra casa\n"); | |
else | |
gameInfo[0][pos - 1] = player; | |
} | |
else if (pos <= 6){ | |
if (gameInfo[1][pos - 4] == 'X' || gameInfo[1][pos - 4] == 'O' ) | |
printf("Jogada inválida! Escolha outra casa\n"); | |
else | |
gameInfo[1][pos - 4] = player; | |
} | |
else if (pos <= 9){ | |
if (gameInfo[2][pos - 7] == 'X' || gameInfo[2][pos - 7] == 'O' ) | |
printf("Jogada inválida! Escolha outra casa\n"); | |
else | |
gameInfo[2][pos - 7] = player; | |
} | |
else | |
printf("Jogada inválida! Escolha outra casa\n"); | |
} | |
/* | |
* {checkIfAnyoneHasWon} | |
* Função responsável por determinar se alguém venceu | |
* se a função retornar 0 ninguém venceu ainda | |
* xoro significa "X or O" | |
*/ | |
char checkIfAnyoneHasWon(char** gameInfo, int oddity){ | |
char xoro; | |
if (oddity % 2 == 0) xoro = 'X'; | |
else xoro = 'O'; | |
for (int i = 0; i < 3; i++){ | |
if ((gameInfo[i][0] == gameInfo[i][1]) && (gameInfo[i][1] == gameInfo[i][2])) | |
return xoro; | |
else if ((gameInfo[0][i] == gameInfo[1][i]) && (gameInfo[1][i] == gameInfo[2][i])) | |
return xoro; | |
} | |
//Checando na diagonal principal | |
if ((gameInfo[0][0] == gameInfo[1][1]) && (gameInfo[1][1] == gameInfo[2][2])) | |
return xoro; | |
//Checando na diagonal secundária | |
else if ((gameInfo[0][2] == gameInfo[1][1]) && (gameInfo[1][1] == gameInfo[2][0])) | |
return xoro; | |
else return '0'; | |
} | |
int main(void) { | |
/* | |
* {gameInfo} -> Essa matriz controla a partida | |
* | |
* {oddity} -> Variável que determina se quem vai jogar é o 'X' ou o 'O' | |
* além de ser responsável por determinar se deu velha (empate) | |
* | |
* {jogadas} -> Eu havia programado o jogo para funcionar a cada jogada que a pessoa | |
* fizesse, mas no runcodes ele quer todas as jogadas de uma vez, então criei um | |
* vetor pra guardar todas as posições | |
*/ | |
char** gameInfo; | |
// Alocação de espaço para a matriz | |
gameInfo = (char **) malloc(3 * sizeof(char *)); | |
for (int i = 0; i < 3; i++){ | |
gameInfo[i] = (char *) malloc (3 * sizeof(char *)); | |
} | |
//Preenchendo a matriz com valores padrão | |
//Desculpa por não pensar numa maneira elegante de preencher a matriz ;( | |
gameInfo[0][0] = '1'; | |
gameInfo[0][1] = '2'; | |
gameInfo[0][2] = '3'; | |
gameInfo[1][0] = '4'; | |
gameInfo[1][1] = '5'; | |
gameInfo[1][2] = '6'; | |
gameInfo[2][0] = '7'; | |
gameInfo[2][1] = '8'; | |
gameInfo[2][2] = '9'; | |
// Essa variável verifica de quem é a vez | |
int oddity = 0; | |
//Começo do jogo | |
showGameState(gameInfo); | |
printf("Jogo da Velha!\n"); | |
//Enquanto ninguém vencer, a partida continua | |
while (checkIfAnyoneHasWon(gameInfo, oddity) == '0'){ | |
//Analisando quem vai jogar | |
if (oddity % 2 == 0) printf("Escolha um número para jogar, jogador X!\n"); | |
else printf("Escolha um número para jogar, jogador O!\n"); | |
int position; | |
scanf("%d", &position); | |
//Mude o número da tabela por uma marca dependendo de quem for a vez de jogar | |
if (oddity % 2 == 0){ | |
changeGameState(position , gameInfo, 'X'); | |
} | |
else{ | |
changeGameState(position, gameInfo, 'O'); | |
} | |
//Passando a vez pro outro jogador | |
oddity++; | |
showGameState(gameInfo); | |
if (oddity == 7){ | |
printf("Deu velha!\n"); | |
exit(0); | |
} | |
} | |
if (checkIfAnyoneHasWon(gameInfo, oddity) == 'X') | |
printf("Fim do jogo! O jogador O venceu!"); | |
else | |
printf("Fim do jogo! O jogador X venceu!"); | |
for (int i = 0; i < 3; i++){ | |
free(gameInfo[i]); | |
} | |
free(gameInfo); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment