Jump to content

Ajuda Programa Do Campo Minado (Jogo Das Minas)


linofcp007
 Share

Recommended Posts

Bom Dia eu tenho estado a fazer um código em C e está-me a dar alguns erros e eu não consigo arranja-lo, por-favor, se alguém ajudasse agradecia. 😁

🙂

:wallbash:

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

void preenche_pos (int mat[10][10]);
int escolhe_posicao (int pos);
int conta_minas (int pos[10][10],int minas);
void mostra (int mat[10][10],int pos[10][10]);
void mostra_aberto (int mat[10][10]);
void abre_vazios (int cm[10][10],int pos[10][10],int i, int j);
void posicao (int cm[10][10], int minas);
void calcula (int mat[10][10]);
void gerador (int mat[10][10],int minas);
void preenche (int mat[10][10]);

int main (){
   int cm[10][10], minas;

   do{
      printf("Escolha a quantidade de minas (1 ate' 60): ");
      scanf("%d",&minas);
      fflush(stdin);
      if (minas<1 || minas>60){
         system("CLS");
         printf("Valor inva'lido!\n\n");
      }
      system("CLS");
   }while(minas<1 || minas>60);
   
   preenche(cm);
   gerador(cm,minas);
   calcula(cm);
   posicao(cm,minas);

   getchar();
   return 0;
}


void preenche_pos (int mat[10][10]){
   int i=0,j=0;

   for(i=0;i<10;i++)
      for(j=0;j<10;j++)
         mat[i][j]=5;
}

int escolhe_posicao (int pos){
   do{
      printf("Escolha uma posicao a abrir (1 a 8): ");
      scanf("%d",&pos);
      fflush(stdin);
      if (pos<0 || pos>8){
         system("CLS");
         printf ("\nValor inva'lido!\n");
      }
      system("CLS");
   }while(pos<0 || pos>8);
   
   return pos;
}

int conta_minas (int pos[10][10],int minas){
   int espacos=0, i=0,j=0;

   for(i=1; i<9; i++)
      for(j=1; j<9; j++)
         if (pos[i][j] != 1)
            espacos++;
   return (espacos-minas);
}

void mostra (int mat[10][10],int pos[10][10]){
   int i=0,j=0;

   printf ("\n    1 2 3 4 5 6 7 8");
   for(i=0; i<10; i++){
      if (i>0 && i<9)
         printf ("\n%d ",i);
      else
         printf ("  \n");
      for(j=0;j<10;j++){
         if((i==0 && j==0) || (i==9 && j==0))
            printf("  | ");
         else if(i==0 || i==9 || j==0 || j==9)
            printf("| ");
         else if(pos[i][j]==0 || pos[i][j]==1)
            printf("%d ",mat[i][j]);
         else
            printf("%c ",220);
      }
   }
   printf ("\n");
}

void mostra_aberto (int mat[10][10]){
   int i=0,j=0;

   printf ("\n    1 2 3 4 5 6 7 8");
   for(i=0; i<10; i++){
      if (i > 0 && i < 9)
         printf ("\n%d ",i);
      else
         printf ("  \n");
      for(j=0; j<10; j++){
         if((i==0 && j==0) || (i==9 && j==0))
            printf("  | ");
         else if(i==0 || i==9 || j==0 || j==9)
            printf("| ");
         else if(mat[i][j]==9)
            printf("* ");
         else if(mat[i][j]==0)
            printf("  ");
         else
            printf("%d ",mat[i][j]);
      }
   }
   
   printf ("\n");
}

void abre_vazios (int cm[10][10],int pos[10][10],int i, int j){
   int x,y;
   int continua;

   do{
      for (x = i - 1; x <= i + 1; x++)
         for (y = j - 1; y <= j + 1; y++){
            continua = 1;
            if (pos[x][y] != 1){
               continua = 0;
               pos[x][y] = 1;
               if (cm[x][y] == 0)
                  abre_vazios(cm,pos,x,y);
            }
         }
   }while(continua);
}

void posicao (int cm[10][10], int minas){
   int pos[10][10],sem_minas=64-minas;
   int i=0,j=0;

   preenche_pos(pos);

   do{
      printf ("\nUse a posicao 0,0 para sair do jogo.\n");
      printf ("\nLinha e coluna: ");
      i = escolhe_posicao(i);
      printf ("\nColuna: ");
      j = escolhe_posicao(j);
         
      if (i == 0 && j == 0){
         break;
      }
      else if (pos[i][j] == 1 || (pos[i][j] == 0 && i != 0 && j != 0)){
         printf ("\nEssa posicao ja' abriste!\n");
      }
      else if (cm[i][j] == 9){
         pos[i][j] = 0;
         printf ("\nAtingiste uma bomba!\nPerdeste!\n");
         mostra_aberto(cm);
         break;
      }
      else if (cm[i][j] == 0){
         pos[i][j] = 1;
         abre_vazios(cm,pos,i,j);
         mostra(cm,pos);
         sem_minas = conta_minas(pos,minas);
         printf ("\nRestam %d espacos sem bomba.\n",sem_minas);
      }
      else {
         pos[i][j] = 1;
         mostra(cm,pos);
         sem_minas = conta_minas(pos,minas);
         printf ("\nRestam %d espacos sem bomba.\n",sem_minas);
      }
   }while(sem_minas!=0);
   if (sem_minas==0)
      printf ("\nParabens! Ganhas-te!\n");
}

void calcula (int mat[10][10]){
   int i=0,j=0,x=0,y=0;

   for(i=0;i<10;i++)
      for(j=0;j<10;j++)
         if (mat[i][j]==9)
            for (x=i-1;x<=i+1;x++)
               for (y=j-1;y<=j+1;y++)
                  if (mat[x][y]!=9)
                     mat[x][y]+=1;
}

void gerador (int mat[10][10],int minas){
   int gerador,i,j,cont=0;
   srand(time(NULL));

   do{      
      gerador=rand()%8+1;
      i=gerador;
      gerador=rand()%8+1;
      j=gerador;
      if (mat[i][j]!=9){
         mat[i][j]=9;
         cont++;
      }
   }while(cont<minas);
}

void preenche (int mat[10][10]){
   int i,j;

   for(i=0; i<10; i++)
      for(j=0; j<10; j++)
         if(i==0 || i==9 || j==0 || j==9)
            mat[i][j]=1;
         else
            mat[i][j]=0;
}
Link to comment
Share on other sites

o programa corre, depois aparece para escolher quantas bombas queremos, qual a linha e coluna que queremos jogar, e de vês enquando ele breca quando vai mostrar a jogada, fica com o _ a piscar e não faz mais nada a não ser que feixe a janela e volte a abrir.

Link to comment
Share on other sites

Essa função que pede as coordenadas parece-me estar exagerada.

Para verificar basta pedires ao coordenadas e mete no mapa um indicador de que já jogaste ali, se nessas coordenadas não existir uma mina aquela variável sem_minas decrementa uma unidade. É obvio que se jogares fora dos limites do mapa o programa vai rebentar, por isso tens de verificar isso.

here since 2009

Link to comment
Share on other sites

Por vezes, quando já estamos cansados de pensar numa solução é bom apagar tudo o que temos (neste caso o conteúdo da tua função) e recomeçar.

Vou-te dar uma lista estruturada do que deves fazer:

- Pedir as coordenadas;

- Decrementar uma unidade a ambas, visto que a indexação começa em 0;

- Verificar se nessa posição existe uma mina;

  - Se existir, então perde.

  - Noutro caso, decrementas uma variável que no principio está inicializada com o número de posições livres existentes.

Nota: Dentro do pedido das coordenadas tens de verificar se se encontra dentro dos limites do mapa.

here since 2009

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.