Created
May 14, 2016 16:30
-
-
Save souenzzo/10b3259dab6e04d41cc961a40c98323f to your computer and use it in GitHub Desktop.
Jogo da velha em C. Acho que nunca perde.
This file contains 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
// 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