Advertisement
juneba

jogo_da_velha.trabalho.c

Sep 28th, 2012
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.73 KB | None | 0 0
  1. /*
  2.  
  3. Universidade de Brasilia
  4. Instituto de Ciencias Exatas
  5. Departamento de Ciencia da Computacao
  6. Computacao Basica – 01/2012
  7. Aluno(a): Wagner Alberto Soares Junior
  8. Matricula: 12/0023857
  9. Turma: A
  10. Versão do compilador: versão do gcc 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)
  11. Descricao: O programa consiste em um jogo da velha baseado em matrizes,
  12. a grande vantagem de ser baseado em matrizes se deve ao fato de assim
  13. podermos modificar o tamanho do jogo para qualquer valor entre 3 e 12,
  14. o valor deve ser passado como parâmetro no início do programa para que
  15. a área útil da matriz seja inicializada.
  16.  
  17.  
  18. */
  19.  
  20. #include <stdio.h>
  21.  
  22.  
  23.  
  24. #include "cbtactoe_library.h"
  25.  
  26.  
  27. /*a função verificarFim funciona da seguinte maneira, para ela é passado os parâmetros Tabuleiro, linha do cursor atual,
  28. coluna do cursor atual, tamReal da matriz inicalizada e o simbolo atual. Nela são feitas as verificações se houveram ganhadores
  29. somente na linha e coluna e se o número estiver em uma diagonal  faço o teste para ver se houve vitória na jogada. */
  30.  
  31.  
  32.  
  33. int verificarFim (char tabuleiro[][23],int linha_cursor,int coluna_cursor,int tamReal,char simbolo_atual) {
  34.     int vitoria=1;
  35.     int i=0;
  36.  
  37.  
  38.     /*testou se houve ganhadores na coluna marcada*/    
  39.     while (i<tamReal && vitoria) {
  40.         vitoria=1;
  41.             if (simbolo_atual!=tabuleiro[linha_cursor][i]) {
  42.                 vitoria=0;
  43.             }
  44.         i+=2;
  45.  
  46.     }
  47.     /*testou se houve ganhadores na linha marcada, essa condição só é testada
  48.     também se não houve vitória na ultima linha.*/
  49.     if (vitoria==0){
  50.         i=0;
  51.         vitoria=1;
  52.         while (i<tamReal && vitoria){
  53.  
  54.             if (simbolo_atual!=tabuleiro[i][coluna_cursor]){
  55.                 vitoria=0;
  56.  
  57.             }
  58.         i+=2;
  59.         }
  60.     }
  61.     /*testou se houve ganhadores na diagonal principal, a condição para que seja testado
  62.     se houve vitoria na diagonal principal , é de que o indice da linha tem que ser igual
  63.     o da coluna, essa condição só é testada também se não houve vitória na ultima linha.*/
  64.     if (linha_cursor==coluna_cursor){
  65.         if (vitoria==0){
  66.             i=0;
  67.             vitoria=1;
  68.             while (i<tamReal && vitoria){
  69.                 if (simbolo_atual!=tabuleiro[i][i]){
  70.                     vitoria=0;
  71.                 }
  72.             i+=2;
  73.             }
  74.         }
  75.     }  
  76.     /*aqui testo se foi marcado algum valor na diagonal secundária, para eu saber se
  77.     é a diagonal secundária eu uso a seguinte condição, o indice i+ o indice j, tem que
  78.     ser igual ao tamanhoReal menos um, já que numa matriz 3x3 seria 5 o tamReal todos os
  79.     valores da diagonal secundária terão a soma do indice 4,essa condição só é testada também
  80.     se não houve vitória na ultima linha.*/
  81.     if (linha_cursor+coluna_cursor==tamReal-1){
  82.         if(vitoria==0){
  83.             i=0;
  84.             vitoria=1;
  85.             while (i<tamReal && vitoria){
  86.                 if(tabuleiro[tamReal-i-1][i]!=simbolo_atual)
  87.                     vitoria=0;
  88.             i+=2;
  89.             }
  90.            
  91.         }
  92.     }
  93.     /*se houve vitória retorno 1*/
  94.     if (vitoria) {
  95.         return 1;
  96.     }
  97.     else {
  98.         /* se não ouve vitoria retorno 0*/
  99.         return 0;
  100.     }
  101. }
  102.  
  103. /*aqui trato a entrada que o jogador fez, essa função é rodada 30 vezes por segundo.
  104. ela nada mais faz do que tratar cada valor que foi inserido pelo usuário no jogo.*/
  105. int  tratarInput (char tabuleiro[][23],int tamanho,int *linha_cursor,int *coluna_cursor,char *simbolo_atual,int *jogadas,int valor,char *resultado) {
  106.         int tamReal=tamanho+tamanho-1;
  107.        
  108.         /*esse switch é a alma da função para cada caso ele faz uma coisa.*/
  109.         switch (valor) {
  110.                     /*aqui trato de abortar o jogo caso o usuário pressione q*/
  111.                     case 'q':
  112.                     case 'Q':
  113.                         return 'q';
  114.                         break;
  115.  
  116.                     /*aqui movo o cursor para CIMA caso esteja em uma posição válida*/                      
  117.                     case CIMA:
  118.                         if (*linha_cursor>0)
  119.                             *linha_cursor-=2;
  120.                             break;
  121.                     /*aqui movo o cursor para BAIXO caso esteja em uma posição válida*/
  122.                     case BAIXO:
  123.                         if (*linha_cursor<tamReal-1)
  124.                             *linha_cursor+=2;
  125.                             break;
  126.                     case ESQUERDA:
  127.                     /*aqui movo o cursor para ESQUERDA caso esteja em uma posição válida*/
  128.                         if (*coluna_cursor>0)
  129.                             *coluna_cursor-=2;
  130.                             break;
  131.                     case DIREITA :
  132.                     /*aqui movo o cursor para DIREITA caso esteja em uma posição válida*/
  133.                         if (*coluna_cursor<tamReal-2)
  134.                             *coluna_cursor+=2;
  135.                         break;
  136.                     case ENTER :
  137.  
  138.                         /*primeiro verifico se o local que o usuário quer marcar está vazio
  139.                         se estiver marco com o simbolo atual*/
  140.                         if (tabuleiro[*linha_cursor][*coluna_cursor]==VAZIO){
  141.                             tabuleiro[*linha_cursor][*coluna_cursor]=*simbolo_atual;
  142.                             *jogadas=*jogadas+1;
  143.                             /*apos isso verifico o final do jogo, se alguém ganhou marco o resultado com o símbolo atual*/
  144.                             if (verificarFim(tabuleiro,*linha_cursor,*coluna_cursor,tamReal,*simbolo_atual)){
  145.                                 *resultado=*simbolo_atual;
  146.                                 return 'q';
  147.                             }
  148.                             /*sempre faço o teste para saber se houveram empates,já q quando não houverem mais jogadas
  149.                             disponíveis tenho q declarar empate.*/
  150.                             if (*jogadas==(tamanho)*(tamanho)){
  151.                                 *resultado=EMPATE;
  152.                                 return 'q';
  153.                             }
  154.  
  155.                             else {
  156.                                 /*se houverem jogadas válidas ainda, mudo o símbolo do jogador.*/
  157.                                 if (*simbolo_atual==NOUGHT){
  158.                                     *simbolo_atual=CROSS;
  159.                                 }
  160.                                 else {
  161.                                     *simbolo_atual=NOUGHT;
  162.                                 }
  163.                             }
  164.                         }
  165.                     /*quando nada é feito simplesmente aborto o loop*/
  166.                     default :
  167.                         break;
  168.         }
  169.          return 0;
  170. }
  171.        
  172.  
  173. /*aqui simplesmente inicializo o tabuleiro nas posições válidas*/
  174. void inicializarTabuleiro (char tabuleiro[][23],int tamanho) {
  175.     int tamReal;
  176.     int i,j,k;
  177.     tamReal=tamanho+tamanho-1;
  178.        
  179.     for (i=0;i<tamReal;i++){
  180.         for (j=0;j<tamReal;j++){
  181.             if (j%2==1)
  182.                 tabuleiro[i][j]=BORDA;
  183.             else
  184.                 tabuleiro[i][j]=VAZIO;
  185.         }
  186.         if (i%2==1){
  187.             for (k=0;k<tamReal;k++){
  188.                 tabuleiro[i][k]=BORDA;
  189.             }
  190.        
  191.         }
  192.  
  193.     }
  194.    
  195.  
  196. }
  197.  
  198. /*essa função é a parte principal do jogo, aqui que fica o loop infinito
  199. para que o jogo tenha andamento*/
  200. void run (int tamanho){
  201.         char tabuleiro[23][23],simbolo_atual,resultado;
  202.         int jogadas,game,valor,linha_cursor,coluna_cursor;
  203.        
  204.         inicializarNcurses();
  205.         inicializarTabuleiro(tabuleiro,tamanho);
  206.         game=linha_cursor=coluna_cursor=jogadas=0;
  207.         simbolo_atual='O';
  208.  
  209.         while (game==0){
  210.             /*loop infinito enquanto nao houverem ganhadores ou seja abortado*/
  211.                
  212.                 controlarFPS();
  213.                 mostrarTela(tabuleiro,tamanho,linha_cursor,coluna_cursor,simbolo_atual);
  214.                 valor = receberTecla();
  215.                 game=tratarInput(tabuleiro,tamanho,&linha_cursor,&coluna_cursor,&simbolo_atual,&jogadas,valor,&resultado);
  216.         }      
  217.  
  218.         finalizarNcurses();
  219.         mostrarResultado(tabuleiro,tamanho,resultado);
  220.        
  221. }
  222.  
  223.  
  224. /*na main , simplesmente testa-se se o tamanho da matriz é válido ou se houveram 2 parâmetros somente
  225. passados para o programa.*/
  226. int main  (int argc, char* argv[]) {
  227.     int tamanho;
  228.  
  229.     sscanf(argv[1],"%d",&tamanho);
  230.     if (tamanho>=3 && tamanho <=12 && argc==2){
  231.         run (tamanho);
  232.        
  233.     }
  234.     else {
  235.         printf("ERRO: O PROGRAMA SERÀ ABORTADO,INSIRA UM VALOR ENTRE 3 e 12 E SOMENTE UM PARAMETRO\n");
  236.  
  237.     }
  238.  
  239.  
  240.  
  241.  
  242.     return 0;
  243. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement