Jogo da Velha em C/C++

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>


 // Procedimentos

 void Jogo();
 void Instrucao();
 void Estatisticas();
 void Renomear_Jogadores();
 void Sobre();
 void Obter_Linha_Coluna();

 void Declarando_Vencedor(int jogador);

 // Variáveis globais
 int A[3][3], linha, coluna;
 int NumeroDeVitoriasDoJogador1 = 0;
 int NumeroDeVitoriasDoJogador2 = 0;
 int NumeroDeEmpates = 0;

 char NomeDoJogador1[12] = "JOGADOR 1", NomeDoJogador2[12] = "JOGADOR 2";

 int main(){

   int op=0;
     while (op != 6){
  
      printf("\t\t---------------------------------------------------\n");
      printf("\t\t\t\tJOGO DA VELHA\n");
      printf("\t\t---------------------------------------------------\n\n");   
     
      // Menu de opções 
      printf(" 1 - JOGAR\n");
      printf(" 2 - INSTRU%c%cES\n",384,229);
      printf(" 3 - ESTAT%cSTICAS\n",470);
      printf(" 4 - RENOMEAR JOGADORES\n");
      printf(" 5 - SOBRE\n");
      printf(" 6 - SAIR\n\n");

        op=0;
        while (op<1 || op>6){
          printf(" Digite op%c%co: ",135,454);
          scanf("%d",&op);
        }
      
       system("cls");
       // Desvio para o procedimento
       if (op == 1) Jogo();
       if (op == 2) Instrucao();
       if (op == 3) Estatisticas();
       if (op == 4) Renomear_Jogadores();
       if (op == 5) Sobre();
      
       if (op != 6){
          printf("  ");
          system("pause");
          system("cls");
       }
   }
   return 0;
 }



 void Jogo(){
      
    int Jogador=1;
    int cont_A=0, cont_B=0;
    int FimDoJogo=0;
   
    //Inicializando a matriz
     for (int i=0; i<3; ++i){
       for (int j=0; j<3; ++j)
         A[i][j]=0;
     }
  
   while (FimDoJogo == 0){
    
      // Verifica se existe alguma coluna totalmente preenchida por um mesmo caractere
      cont_A=0, cont_B=0;
      for (int i=0; i<3; ++i){
       
          for (int j=0; j<3; ++j){
            if (A[i][j]==1) cont_A++; 
            if (A[i][j]==2) cont_B++;
          }
           if (cont_A == 3) break; else cont_A=0;
           if (cont_B == 3) break; else cont_B=0;
     } if ((cont_A == 3) || (cont_B == 3)) {Declarando_Vencedor(Jogador); FimDoJogo=1;}
    
    
    
     // Verifica se existe alguma linha totalmente preenchida por um mesmo caractere
     cont_A=0, cont_B=0;
     for (int i=0; i<3; ++i){
       
          for (int j=0; j<3; ++j){
            if (A[j][i]==1) cont_A++; 
            if (A[j][i]==2) cont_B++;
          }
           if (cont_A == 3) break; else cont_A=0;
           if (cont_B == 3) break; else cont_B=0;
     } if ((cont_A == 3) || (cont_B == 3)) {Declarando_Vencedor(Jogador); FimDoJogo=1;}
    
    
    
     // Verifica a Diagonal Principal
     cont_A = 0; cont_B = 0;
     for (int i=0; i<3; ++i){
            if (A[i][i]==1) cont_A++;
            if (A[i][i]==2) cont_B++;
     } if ((cont_A == 3) || (cont_B == 3)) {Declarando_Vencedor(Jogador); FimDoJogo=1;}
    
    
    
     // Verifica a Diagonal Secundaria
     cont_A = 0; cont_B = 0;
     for (int i=0; i<3; ++i){
            if (A[i][2-i]==1) cont_A++;
            if (A[i][2-i]==2) cont_B++;
     } if ((cont_A == 3) || (cont_B == 3)) {Declarando_Vencedor(Jogador); FimDoJogo=1;}
    
    
    
     // Verifica se houve empate
     cont_A = 0;
     for (int i=0; i<3; ++i){
         for (int j=0; j<3; ++j){
            if (A[i][j]!=0) cont_A++;
         }
     } if ((cont_A == 9) && (FimDoJogo != 1)) {printf("\n\tEMPATE! TENTEM NOVAMENTE!"); FimDoJogo=2;}
    
    
    
     if (FimDoJogo == 0){
        if (Jogador==1) printf("\n\t%s",NomeDoJogador1);
           else printf("\n\t%s",NomeDoJogador2);
     }
     printf("\n\n");
   
   
    
     // Estética do jogo 
     for (int i=0; i<5; ++i){
        if (i == 0) printf("\n\t\tC 1  C 2  C 3\n");
        if (i%2==0){
          printf("\n\t   L %d\t",i/2+1);
          for (int a=0; a<3; ++a){
            if (A[a][i/2] == 0) printf("    "); else {if (A[a][i/2] == 1) printf("  X "); else printf("  0 ");}
             if (a!=2) printf("|");
          }
        }
           else printf("\n\t\t---------------");
     } printf("\n\n\n");
   
   
   
   
      if ((FimDoJogo == 1) || (FimDoJogo==2)){
         if ((FimDoJogo == 1) && (Jogador == 1)) NumeroDeVitoriasDoJogador2++;
         if ((FimDoJogo == 1) && (Jogador == 2)) NumeroDeVitoriasDoJogador1++;
         if (FimDoJogo == 2) NumeroDeEmpates++;
      }
      else {
        // Obtem as coordenada do usuário (verificando se estas são válidas)
        Obter_Linha_Coluna();
   
         // Atualiza o jogo
         if (Jogador == 1) {A[coluna-1][linha-1]=1; Jogador = 2;}
         else {A[coluna-1][linha-1]=2; Jogador = 1;}
     
        system("cls");
      }
   }
 }


 void Declarando_Vencedor(int jogador){
    if (jogador == 1) printf("\n\tPARABENS %s! VOCE GANHOU!",NomeDoJogador2);
       else printf("\n\tPARABENS %s! VOCE GANHOU!",NomeDoJogador1);
 }


 void Obter_Linha_Coluna(){

    linha=0;
    // Só serão aceitos valores entre 1(inclusive) e 3(inclusive)
    while (linha<1 || linha>3){
      printf("  [L] Linha..: ");
      scanf("%d",&linha);
    }
   
    coluna=0;
    // Só serão aceitos valores entre 1(inclusive) e 3(inclusive)
    while (coluna<1 || coluna>3){
      printf("  [C] Coluna.: ");
      scanf("%d",&coluna);
    }
   
    // Recursividade
    while (A[coluna-1][linha-1] != 0) Obter_Linha_Coluna();
}


 void Instrucao(){
   printf("\n\n\t- O TABULEIRO %c UMA MATRIZ DE TR%cS LINHAS POR TR%cS COLUNAS.\n\n",144,210,210);
  
   printf("\t- OS JOGADORES JOGAM ALTERNADAMENTE, UMA MARCA%c%cO POR VEZ,\n\t",384,455);
   printf("NUMA POSI%c%cO QUE ESTEJA VAZIA.\n\n",384,455);
  
   printf("\t- A MISS%cO %c CONSEGUIR TR%cS X'S OU TR%cS 0'S, NA HORIZONTAL\n\t",455,144,210,210);
   printf("OU VERTICAL OU DIAGONAL, E AO MESMO TEMPO, QUANDO POSS%cVEL,\n\t",470);
   printf("IMPEDIR O ADVERS%cRIO DE GANHAR NA PR%cXIMA JOGADA.\n\n",181,224);
 }


 void Estatisticas(){
    printf("\n\n\tN%cMERO DE VIT%cRIAS DO JOGADOR 1.: %d\n",233,224,NumeroDeVitoriasDoJogador1);
    printf("\tN%cMERO DE VIT%cRIAS DO JOGADOR 2.: %d\n",233,224,NumeroDeVitoriasDoJogador2);
    printf("\tN%cMERO DE EMPATES...............: %d\n\n",233,NumeroDeEmpates);
 }


 void Renomear_Jogadores(){
    int op = 0;
   
    printf("\n\n 1 - RENOMEAR JOGADOR 1\n");
    printf(" 2 - RENOMEAR JOGADOR 2\n");
    printf(" 3 - SAIR\n");
   
    while (op!=3){
       op = 0;  
       while ((op<1) || (op>3)){
          printf("\n Digite op%c%co: ",135,454);
          scanf("%d",&op);
       }
   
       if (op == 1){
          printf("\n  NOME DO JOGADOR 1: ");
          scanf("%s",&NomeDoJogador1);
       }
   
       if (op == 2){
          printf("\n  NOME DO JOGADOR 2: ");
          scanf("%s",&NomeDoJogador2);
       }
    }
 }


 void Sobre(){
    printf("\n  IFBA: INSTITUTO FEDERAL DE EDUCA%c%cO, CI%cNCIA E TECNOLOGIA DA BAHIA.\n",384,455,210);
    printf("   CAMPUS VALEN%cA.\n\n\n",384);
    printf("    FUNDADOR: JO%cO MATHEUS SANTOS ASSIS.\n\n",455);
    printf("    CO-FUNDADOR: MATHIAS SANTOS ASSIS.\n\n");
 }






Artigos relacionados em C/C++:


  • Somando duas matrizes em C/C++
  • Construindo uma tabuada no Visual Studio 2011
  • Adivinhando um número em C/C++
  • Programa com operações matemáticas C/C++
  • Imprime um número N vezes, o número (N-1) ene menos uma vezes, e assim sucessivamente em C/C++
  • Programa com todos os comandos em C/C++
  • Desenhando um X na tela em C/C++
  • Somando dois números em C/C++
  • Sequência de Fibonacci em C/C++
  • Programa que ler uma matriz quadrada e imprime a sua diagonal principal em C/C++
  • Multiplicando duas matrizes em C/C++





  • Feito no Dev C++ 4.9.9.2 | Executável

    
    Feito no Dev C++ 4.9.9.2 | Executável

    

    Feito no Dev C++ 4.9.9.2 | Executável