Ir ao conteúdo
  • Cadastre-se

joel bafumba liseli

Membro Júnior
  • Posts

    1
  • Cadastrado em

  • Última visita

posts postados por joel bafumba liseli

  1. #include <stdio.h>

    #include <stdlib.h>

    #include <time.h>

    /*O programa cria duas tabelas uma com as minas (TAB) e outra com '*'(TAB_user) conforme o jogador abrir as casas da TAB_user

    o programa confere no TABe executa a ação resultante da opção escolhida abrir, marcar mina ou duvida.

    */

     

    void imprimirTAB(char **TAB_user,int l, int c);

    void minas(char **TAB, int l,int c, int M);// colocar minas no TAB sem repetição + contagem de minas ao redor

    void terminar (char **TAB, int l);// liberar a mémoria ocupada

    int numMinas(char **TAB, int jl, int jc, int l, int c);// contar minas ao redor

    void inicializarTAB(char **TAB,int l, int c, int tipo);// tipo = 0 (para usuario) e tipo = 1(tabuleiro escondido)

    void jogoValido(char **TAB, char **TAB_user,int jl, int jc, int l, int c);

    int conferir(char **TAB_user, int l, int c, int M, int minaCerta);// conferir se mina aberta depois da cada jogada

    void jogoDuvida (char **TAB_user, int jl,int jc); // marcar duvida

    int jogoMinas (char **TAB, char **TAB_user, int jl,int jc);// marcar mina

    int conferirLocalMinas(int **v,int linha, int coluna, int n);// conferir se casa escolhida para minha já possui uma mina

     

    int main()

    {

    srand(time(0));

    int saida;// confere marcagem certa de mina

    int numValido = 0, numMina = 0;// numero de casa aberta certa e casa de minas marcada corretamente

    int i,j,l,c,jl,jc,M, dado, resultado = 0; // dado armazena o numero de inteiro guardado no buffer

    char tipo, legenda = 219;

    do {

        printf ("Numero de linhas : ");dado = scanf ("%d",&l); while (getchar() !='\n'); // getchar() limpa o buffer

        }while(l<=0 || dado !=1);

    do {

        printf ("Numero de colunas : ");dado = scanf ("%d",&c); while (getchar() !='\n');

        }while(c<=0 || dado !=1);

    do {

        printf ("Numero de Minas : ");dado = scanf ("%d",&M);while (getchar() !='\n');

        }while((M >(l*c)) || M<=0 || dado !=1);

     

    // TAB escondido

    char **TAB;

    TAB =(char **)malloc(l*sizeof(char *));

    for (i=0;i<l;++i)

    TAB = (char *)malloc(c*sizeof(char));

    inicializarTAB(TAB,l,c,1);

    minas(TAB,l,c,M);

     

    // TAB revelado para uso do usuario

    char **TAB_user;

    TAB_user =(char **)malloc(l*sizeof(char *));

    for (i=0;i<l;++i)

    TAB_user = (char *)malloc(c*sizeof(char));

    inicializarTAB(TAB_user,l,c,0);

     

     

    // coração do jogo

     do {

    system ("cls");

    imprimirTAB(TAB,l,c);// ver a localização das minas

    imprimirTAB(TAB_user,l,c);// Tabela do usuario que vai abrindo aos poucos

    printf ("\n\n\t Sua jogada \n\n");

    printf (" linha, coluna, acao (v, d, m) : "); scanf ("%d %d %c",&jl, &jc, &tipo);

    if (tipo == 'v')

         jogoValido(TAB,TAB_user,jl,jc,l,c);

    else if (tipo == 'd')

         jogoDuvida(TAB_user,jl,jc);

    else if (tipo == 'm')

         { saida = jogoMinas(TAB,TAB_user,jl,jc);

         if (saida == 1)

          {numMina++;}

     }// incrementar quando marcar a mina certo

    else

         printf (" Jogada impossivel. tente v, d ou m !!!! ");

     

    resultado = conferir(TAB_user,l,c,M, numMina);

     

    }while(numMina != M && resultado !=0 && resultado !=2 );/* marcar todas as minas || abrir uma mina || abrir todas as casas e algumas minas */

    if (resultado == 0)

    {

    system ("cls");

    printf ("\n\n\t\t ->GAME OVER, Pisou em uma mina !!\n\n ");

    printf ("\t LEGENDA \n\n\t %c : Mina pisada \n", legenda);

    printf ("\t M: Minas nao descobertas \n", legenda);

    printf ("\t X : Minas mal marcada \n\n\n");

    for(i=0;i<l;++i)

    {

    for (j=0;j<c;j++)

    {if(TAB[j]== 'M' && TAB_user[j] =='*')

        TAB_user[j] = 'M';}

    }

    for(i=0;i<l;++i)

    {

    for (j=0;j<c;j++)

    {if(TAB[j] != 'M' && TAB_user[j] =='m')

        TAB_user[j] = 'X';}// minas mal marcadas 

    }

    imprimirTAB(TAB_user,l,c);// mostrar localização de todas as minas + casas já abertas

    printf ("\n\n");

     

    }

    else

    {

    system ("cls");

    printf ("\n\n\t\t voce Ganhou !!\n\n");

    imprimirTAB(TAB_user,l,c);

     

    }

     

    terminar(TAB,l);

    terminar(TAB_user,l);

     

        system ("PAUSE");

        return 0;

    }

     

    void imprimirTAB(char **TAB_user,int l, int c)

    {     //imprime o tabuleiro

        int i, j;

        printf("   ");

        for(j=0;j<c;j++)

            printf(" %d  ",j);

        printf("\n");

        for(i=0;i<l;i++){

     

            printf("  +");

            for(j=0;j<c;j++)

                printf("---+");

            printf("\n%d |",i);

            for(j=0;j<c;j++)

                {

             printf(" %c |",TAB_user[j]);

            }

     

            printf(" %d\n",i);

        }

        printf("  +");

        for(j=0;j<c;j++)

            printf("---+");

        printf("\n   ");

        for(j=0;j<c;j++)

            printf(" %d  ",j);

        printf("\n");

    }

     

     

    void minas(char **TAB, int l , int c, int M) // gerar os locais da minhas sem repetição

    {int i,j, linha, coluna,n=1;

    int **v;

    v=(int **)malloc(2*sizeof(int *));

    for (i=0;i<2;++i)

    v =(int *)malloc(M*sizeof(int));/* tabela 2XM para armazenar as casas das minas

    e garantir que nenhum seja repetido*/

      v[0][0]= rand()%l;// a primeira casa

      v[1][0]= rand()%c;

    for (i=1;i<M;++i)

     {

      do {

      linha =rand()%l;

      coluna = rand()%c;

      }while(conferirLocalMinas(v,linha,coluna, n)!=0);

     

      v[0]= linha;

      v[1]= coluna;

      n++; // incrementar o numero de coluna

     }

    for (i=0;i<M;++i)

    TAB[v[0]][v[1]]='M';

     

    terminar(v,2);

    //contar minhas ao redor

    for (i=0;i<l;++i)

    {for (j=0;j<c;++j)

         {if (TAB[j] == 'M')

       TAB[j] = 'M';

     else

    TAB[j] = (char)(((int)'0')+numMinas(TAB,i,j,l,c));

      }

    }

    return ;

    }

     

     

    void terminar (char **TAB, int l)

    {

    int i;

    for (i=0;i<l;++i)

    free (TAB);

    free (TAB);

    return ;

    }

     

    int numMinas(char **TAB, int jl, int jc, int l, int c)

    {

       int i,j, count = 0;

    for (i = (jl-1);i<=(jl+1);++i)

        {

             for (j = (jc-1);j<=(jc+1);++j)

             {

                 if ((i>=0) && (j>=0) && (i<l) && (j<c))

                  {

                            if (TAB[j] == 'M')

                          {count ++;}

                          }

             }

        }

    return count;

    }

     

    void inicializarTAB(char **TAB,int l, int c, int tipo)

    {int i,j;

    for (i=0;i<l;++i)

    {for (j=0;j<c;++j)

    {if (tipo == 0)

    TAB[j]= '*';

    else

    TAB[j]= '0';

    }

    }

    }

     

    void jogoValido(char **TAB, char **TAB_user,int jl, int jc, int l, int c)

    {

    int i,j;

    if (TAB_user[jl][jc] == '*')

    {

    if (TAB[jl][jc]=='0')

    {

      TAB_user[jl][jc]= ' ';

    for (i = (jl-1);i<=(jl+1);++i)

        {

             for (j = (jc-1);j<=(jc+1);++j)

             {

                 if ((i>=0) && (j>=0) && (i<l) && (j<c))

                  {

                           if (TAB_user[j] == '*' || TAB_user[j] == '?')

                           jogoValido(TAB, TAB_user,i,j,l,c);

                          }

             }

        }

    }

    else

    {

    TAB_user[jl][jc] = TAB[jl][jc];

    }

    }

    else

    {

         printf (" Casa ja aberta, tenta outra casa (x,y). ");

         }

    }

     

    void jogoDuvida (char **TAB_user, int jl,int jc)

    {

        if (TAB_user[jl][jc] == '*')

                             TAB_user[jl][jc] = '?';

        else

         printf (" Casa ja aberta, tenta outra casa (x,y). ");

    }

     

    int jogoMinas (char **TAB, char **TAB_user, int jl,int jc)

    {

     if (TAB_user[jl][jc] == '*')

        {

           TAB_user[jl][jc] = 'm';

           if ( TAB[jl][jc] == 'M' )

              return 1;// Marcou mina no lugar certo

           else

            return 0;

              

         }

    else

         {printf (" Casa ja aberta, tenta outra casa (x,y). "); return 0;}

     

    }

     

    int conferir(char **TAB_user, int l, int c, int M, int minaCerta)

    {

    int i,j, count=0, countFechado = 0;

    for (i=0;i<l;i++)

    {for (j=0;j<c;++j)

    {

    if(TAB_user[j] == 'M')

    {

    TAB_user[j] = 219;

    return 0;// Pisou na mina

    }

    }

        }

    for (i=0;i<l;i++)

    {for (j=0;j<c;++j)

    {

    if(TAB_user[j] == '*')

                countFechado++; // Conferir numero de casas ainda fechadas!!

               }

        }

     

    if (countFechado  == (M - minaCerta) )

    return 2;// casas fechadas = minas escondidas

     

    return 1; //nenhum dos casos anterior 

    }

     

    int conferirLocalMinas(int **v,int linha, int coluna, int n)// conferir se local já ocupado

    {

    int i, count=0 ;

    for (i=1;i<n;i++)

    {if (v[0] ==linha && v[1] ==coluna)

    count++;

    }

     

    if(count >0)

    return 1;

    else

    return 0; }

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!