Universidade Federal de Minas Gerais
Instituto de Ciências Exatas
Departamento de Ciência da Computação
Algoritmos e Estruturas de Dados I
#include
<stdio.h>
#include
<stdlib.h>
//Programa
para jogar JOGO DA VELHA
//Casa em
uma "grade" pode estar livre ou...
enum CASA
{ LIVRE, CRUZ, BOLA};
//tabuleiro/"grade"
representado com um arranjo
enum CASA
t[9];
//o
resultado parcial ou final
enum
RESULTADO{JOGANDO, USUARIOGANHOU, COMPUTADORGANHOU, EMPATE};
//indices
das 8 possibilidades de vitoria
int
ind[8][3]={{0,1,2},{3,4,5},{6,7,8},{0,3,6},{1,4,7},{2,5,8},{0,4,8},{2,4,6}};
void
iniciarTabuleiro(){
int ii;
for(ii=0; ii<9; ii++)t[ii]=LIVRE;
}
void
escreverTabuleiro(){
int ii;
char tc[9];
printf("\n");
for(ii=0; ii<9; ii++) tc[ii]=t[ii]==LIVRE?'
':(t[ii]==CRUZ?'X':'O');
printf("%c|%c|%c\n",
tc[0],tc[1],tc[2]);
printf("------\n");
printf("%c|%c|%c\n",
tc[3],tc[4],tc[5]);
printf("------\n");
printf("%c|%c|%c\n",
tc[6],tc[7],tc[8]);
printf("\n");
}
void
apresentarPrograma(){
printf("Programa para jogar Jogo
da Velha\n");
}
int
usuarioComeca(){
printf("Digite 1,2 ou 3:\n"
"1 - Sair, 2 - Voce inicia, 3 - Computador
inicia\n");
int resp;
scanf("%d", &resp); // deveria
testar scanf retorna 1
if(resp==1){
printf("adeus!\n"); exit(0);
}else return resp==2; // deveria acionar
interacao se resp!=3
}
void
lerJogada(){
int casa, ocupado;
do{ //laco garante uma jogada valida
do{ //laco
garante uma leitura
printf("Entre com numero de 1 a
9:");
scanf("%d,", &casa);
printf("Sua jogada (X) foi linha:%d
e coluna:%d\n",
(casa-1)/3+1, (casa-1)%3+1);
if(casa<1||casa>9)
printf("entrada deve estar entre 1 e 9\n");
}while(casa<1||casa>9);
ocupado=t[casa-1]!=LIVRE;
if(ocupado) printf("posicao ja
ocupada, tente outra!\n");
}while(ocupado);
t[casa-1]=CRUZ;
}
void
jogar(){
printf("Espaco para treinamento do
aprendiz...\n");
}
enum
RESULTADO estadoDoJogo(){
int reta, ponto;
int ii;
//verifica se existe linha/coluna/diag com
cruz ou bola
for(reta=0; reta<8; reta++){
if(t[ind[reta][0]]==CRUZ&&t[ind[reta][1]]==CRUZ&&t[ind[reta][2]]==CRUZ)
return USUARIOGANHOU;
if(t[ind[reta][0]]==BOLA&&t[ind[reta][1]]==BOLA&&t[ind[reta][2]]==BOLA)
return COMPUTADORGANHOU;
}
//verifica se ainda existe posicao livre
for(ii=0; ii<9; ii++)if(t[ii]==LIVRE)
return JOGANDO;
//se ninguem ganhou e não existe posicao
livre...
return EMPATE;
}
void
apresentarResultado(enum RESULTADO r){
switch(r){
case EMPATE:
printf("O jogo empatou!\n");
break;
case USUARIOGANHOU:
printf("Parabens voce
ganhou!\n"); break;
case COMPUTADORGANHOU:
printf("Voce perdeu...\n");
break;
default: printf("algo podre...erro
42\n");
}
}
int
main(int argc, char *argv[]) {
apresentarPrograma();
int vezDoUsuario=usuarioComeca();
iniciarTabuleiro();
enum RESULTADO estado;
estado=JOGANDO;
do{
if(vezDoUsuario) lerJogada();
else jogar();
vezDoUsuario=!vezDoUsuario;
escreverTabuleiro();
estado=estadoDoJogo();
}while(estado==JOGANDO);
apresentarResultado(estado);
system("PAUSE");
return 0;
}