Jvsierra

Jogo da Velha

Nov 8th, 2017
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.69 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. //Matriz principal.
  5. int m[3][3];
  6.  
  7. //Variáveis auxiliares para os laços FOR.
  8. int i, j;
  9.  
  10. //Variáveis que indicarão a linha e a coluna escolhidas pelo(s) usuário(s) em cada jogada.
  11. int linha = 0, coluna = 0;
  12.  
  13. //Variável que indicará se ainda há jogadas possiveis ou não (game loop).
  14. int jogoAcabou = 0;
  15.  
  16. //Atribui o valor 0 para todas as posições da matriz principal.
  17. void inicializaMatriz();
  18. //Função que mostra a matriz a cada jogada, mostrando 'X' se o valor for 1, 'O' se for -1 e '.' se for 0.
  19. void imprimeMatriz();
  20. /*Checa se a linha ou a coluna digitadas pelo usuário já estão preenchidas, se são um valor inválido, e, se não for, preenche
  21. a posição indicada pelo usuário.*/
  22. void checaRepetidoInvalidoEPreencheMatriz(int l, int c, int turno);
  23. //Checa se algum dos jogadores ganhou a partida ou se deu velha.
  24. int checaVitoria(int n);
  25.  
  26. int main(){
  27.   inicializaMatriz();
  28.   imprimeMatriz();
  29.  
  30.   while(jogoAcabou == 0){
  31.     printf("Jogador 1 (linha, coluna):\n");
  32.     scanf("%d %d", &linha, &coluna);
  33.     checaRepetidoInvalidoEPreencheMatriz(linha, coluna, 1);
  34.     imprimeMatriz();
  35.     jogoAcabou = checaVitoria(1);
  36.  
  37.     if(jogoAcabou == 0){
  38.         printf("Jogador 2 (linha, coluna):\n");
  39.         scanf("%d %d", &linha, &coluna);
  40.         checaRepetidoInvalidoEPreencheMatriz(linha, coluna, -1);
  41.         imprimeMatriz();
  42.         jogoAcabou = checaVitoria(-1);
  43.     }
  44.   }
  45.  
  46.   if(jogoAcabou == 1){
  47.     printf("O jogador 1 ganhou!\n");
  48.   }else if(jogoAcabou == -1){
  49.     printf("O jogador 2 ganhou!\n");
  50.   }else{
  51.     printf("Deu velha!\n");
  52.   }
  53.  
  54.   return 0;
  55. }
  56.  
  57. void inicializaMatriz(){
  58.     for(i = 0; i < 3; i++){
  59.         for(j = 0; j < 3; j++){
  60.             m[i][j] = 0;
  61.         }
  62.     }
  63. }
  64.  
  65. void imprimeMatriz(){
  66.     for(i = 0; i < 3; i++){
  67.         printf(" |");
  68.         for(j = 0; j < 3; j++){
  69.             if(m[i][j] == 0){
  70.                 printf(" . |");
  71.             }else if(m[i][j] == 1){
  72.                 printf(" X |");
  73.             }else{
  74.                 printf(" O |");
  75.             }
  76.         }
  77.  
  78.         printf("\n");
  79.         printf("----------------");
  80.         printf("\n");
  81.     }
  82. }
  83.  
  84. int checaVitoria(int n){
  85.     int res = 0, numOc = 0;
  86.  
  87.     for(i = 0; i < 3; i++){
  88.         for(j = 0; j < 3; j++){
  89.             if(i == 0){
  90.                 if(m[i][j] == n && m[i+1][j] == n && m[i+2][j] == n){
  91.                     //Checa as colunas
  92.                     res = n;
  93.                 }else if(j == 0 && m[i][j] == n && m[i+1][j+1] == n && m[i+2][j+2] == n){
  94.                     //Checa a diagonal principal
  95.                     res = n;
  96.                 }
  97.             }
  98.  
  99.             if(j == 0){
  100.                 if(m[i][j] == n && m[i][j+1] == n && m[i][j+2] == n){
  101.                     //Checa as linhas
  102.                     res = n;
  103.                 }else if(i == 2 && m[i][j] == n && m[i-1][j+1] == n && m[i-2][j+2] == n){
  104.                     //Checa a diagonal secundária
  105.                     res = n;
  106.                 }
  107.             }
  108.         }
  109.     }
  110.  
  111.     if(res == 0){
  112.         for(i = 0; i < 3; i++){
  113.             for(j = 0; j < 3; j++){
  114.                 if(m[i][j] == 0){
  115.                     numOc++;
  116.                 }
  117.             }
  118.         }
  119.         if(numOc == 0){
  120.             //Deu velha
  121.             res = 2;
  122.         }
  123.     }
  124.  
  125.     return res;
  126. }
  127.  
  128. void checaRepetidoInvalidoEPreencheMatriz(int l, int c, int turno){
  129.     while(m[l-1][c-1] != 0 || l > 3 || l < 1 || c > 3 || c < 1){
  130.         printf("Valores invalidos ou ja preenchidos. Digite um valor valido:\n");
  131.         scanf("%d %d", &l, &c);
  132.     }
  133.  
  134.     if(turno == 1){
  135.         m[l-1][c-1] = 1;
  136.     }else{
  137.         m[l-1][c-1] = -1;
  138.     }
  139. }
Advertisement
Add Comment
Please, Sign In to add comment