Skip to content

Instantly share code, notes, and snippets.

@souenzzo
Created May 14, 2016 16:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save souenzzo/10b3259dab6e04d41cc961a40c98323f to your computer and use it in GitHub Desktop.
Save souenzzo/10b3259dab6e04d41cc961a40c98323f to your computer and use it in GitHub Desktop.
Jogo da velha em C. Acho que nunca perde.
// Compilar com 'gcc -o velha.x velha.c'
#include <stdio.h> //printf, scanf
#include <stdlib.h> //rand()
#define printt(t) for (int i=0;i<9;i++)printf("%c%c",t[i]?t[i]:' ',(i%3==2)?'\n':' ')
#define eh_valida(t,j) ( (j<9&j>=0)?t[j]?0:1:0 )
#define check_lin(t,c,n,i) ( t[i]+t[i+3]+t[i+6]==n*c )
#define empty_lin(t,i) ( t[i]?t[i+3]?i+6:i+3:i )
#define check_col(t,c,n,i) ( t[(3*i)]+t[(3*i)+1]+t[(3*i)+2]==n*c )
#define empty_col(t,i) ( t[3*i]?t[(3*i)+1]?(3*i)+2:(3*i)+1:3*i )
#define check_diagr(t,c,n) ( t[0]+t[4]+t[8]==n*c )
#define empty_diagr(t) ( t[0]?t[4]?8:4:0 )
#define check_diagl(t,c,n) ( t[2]+t[4]+t[6]==n*c )
#define empty_diagl(t) ( t[2]?t[4]?6:4:2 )
int vencedor (int *tabela)
{ // Retorna o vencedor ou 0 caso haja jogadas possíves
for (int i=0;i<3;i++)
{
if (check_lin(tabela,'X',3,i) | check_col(tabela,'X',3,i)) return 'X';
if (check_lin(tabela,'O',3,i) | check_col(tabela,'O',3,i)) return 'O';
}
if (check_diagr(tabela,'X',3) | check_diagl(tabela,'X',3)) return 'X';
if (check_diagr(tabela,'O',3) | check_diagl(tabela,'O',3)) return 'O';
for (int i=0;i<9;i++) if (tabela[i] == 0) return 0;
return 'V';
}
int can_win(int *tabela, int c)
{ // Retorna a posição que o jogador 'c' deve jogar para ganhar, ou -1.
for (int i=0;i<3;i++)
{
if (check_lin(tabela,c,2,i)) return empty_lin(tabela,i);
if (check_col(tabela,c,2,i)) return empty_col(tabela,i);
}
if (check_diagr(tabela,c,2)) return empty_diagr(tabela);
if (check_diagl(tabela,c,2)) return empty_diagl(tabela);
return -1;
}
int cpu_plays(int *tabela, int c, int o)
{ // Toda IA do CPU é feita aqui.
int jogada = can_win(tabela,c);
if (jogada != -1) { tabela[jogada] = c; return jogada; }
jogada = can_win(tabela,o);
if (jogada != -1) { tabela[jogada] = c; return jogada; }
if (eh_valida(tabela,0)) { tabela[0] = c; return 0; }
if (eh_valida(tabela,8)) { tabela[8] = c; return 8; }
if (eh_valida(tabela,2) | eh_valida(tabela,6))
if ( tabela[1] + tabela[5] == 0) { tabela[2] = c; return 2; }
else { tabela[6] = c; return 6; }
while ( ! eh_valida (tabela,jogada)) jogada = rand()%9;
tabela[jogada] = c;
return jogada;
}
void player_plays(int *tabela, int c)
{
int jogada;
while (1)
{
printt(tabela);
printf("Vez do jogador '%c': ",c);
scanf("%d",&jogada);
if ( eh_valida(tabela,jogada-1) )
{
tabela[jogada-1] = c;
return;
}
else printf("Jogada %d inválida, tente novamente\n",jogada);
}
}
int main (int argc, char **argv) // Vamos começar a brincadeira !
{
int cpu, jogada,v=0,tabela[9],jogador='X'; // Variaveis que vou usar
char buffer[50];
for (int i =0; i<9;i++) tabela[i]=0; // Limpando tabela
printf("Bem vindo ao jogo da velha!\nJogar contra o CPU?[S/n] ");
scanf("%s",buffer); // Le resposta do usuário
cpu = (buffer[0]=='s') | (buffer[0]=='S'); // Ativa IA caso a resposta começe com 's'
if (cpu)
{
printf("Deseja começar?[S/n] ");
scanf("%s",buffer);
jogador=((buffer[0]=='s')|(buffer[0]=='S'))?'O':'X';
}
while ( v == 0 ) // Repete enquanto ninguém ganhar
{
if ( (jogador == 'X') && cpu )
printf("CPU jogou %c em %d\n", 'X',cpu_plays(tabela,'X','O'));
else player_plays(tabela,jogador);
jogador = (jogador=='X')?'O':'X';
v = vencedor(tabela); // Testa para ver se alguém ganhou
}
if ( v == 'V' ) printf("Deu velha!\n");
else printf("O jogador %c venceu!\n",v);
printt(tabela);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment