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;
}