Skip to content

Instantly share code, notes, and snippets.

@yuri117
Created May 1, 2020 02:18
Show Gist options
  • Save yuri117/d91063359b89c8af59048b9abe318314 to your computer and use it in GitHub Desktop.
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
#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