Ir para conteúdo
Fórum Script Brasil
  • 0

sorteio de minas para campo minado


ovatsug

Pergunta

Olá pessoal, eu tenho q construir em C, um jogo de campo minado e já fiz o esboço inicial e segue os códigos que já fiz (não está acabado, por enquanto só deveria estar sorteando as minas e lendo a matri e associando os valores às minas. O exercício está no link [url=http://www.ime.usp.br/~yw/2008/mac115/eps/ep3/ep3.pdf], por ser meio grande não precisem necessariamente ler, acho q basta saber jogar o campo minado, mas se alguém disponibilizar de mais tempo, serei grato!

O código já feito é o seguinte:

#include <stdio.h>
#include <stdlib.h>
#define MINA -1  /*indica que a posição analisada está com mina*/
#define VAZIA 0  /*indica que a posição analisada está sem mina*/
#define MAX 10 

/*inicialização da matriz sem as bombas, a princípio*/
void le_matriz (int a[][MAX], int p, int q){
     int l,c;
     
     for(l=1; l<=p; l++){
              for(c=1; c<=q; c++)
                       a[l][c]=VAZIA;
     }
}

/*inserção de borda para observação de casas vizinhas*/
void borda(int a[][MAX], int b, int d){
  int l, c;

  for (l=0; l<=b+1; l++){
      a[l][0]=a[l][d+1]=VAZIA;
  } 
  for (c=0; c<=d+1; c++){
      a[0][c]=a[b+1][c]=VAZIA;
  }
}

/*impressão da matriz com o uso de marcadores*/
void imprime_matriz (int a[][MAX], int p, int q){
     int l, c;
     
     for(c=0; c<=q; c++)
              if(c!=0)printf("%d ", c);               /*inseri-se números nas bordas horizontalmente para a observação das colunas*/ 
              else printf("   ");
     printf("\n");
     for(l=1; l<=p; l++){
              for(c=1; c<=q; c++){
                       if(c==1) printf("%2d * ", l);   /*inseri-se números nas bordas verticalmente para a observação das linhas*/
                       else printf("* ");
                       }
              printf("\n");
     }
}

/*leitura do número k de vizinhos com minas para cada posição da matriz*/
void k_minas (int a[][MAX], int p, int q){
     int l, c, k;
        
     for(l=1; l<=p; l++){
              for(c=1; c<=q; c++){
                       k=0;
                       if(a[l-1][c]==MINA) k++;
                       if(a[l+1][c]==MINA) k++;
                       if(a[l][c-1]==MINA) k++;
                       if(a[l][c+1]==MINA) k++;
                       if(a[l-1][c-1]==MINA) k++;
                       if(a[l-1][c+1]==MINA) k++;
                       if(a[l+1][c-1]==MINA) k++;
                       if(a[l+1][c+1]==MINA) k++;
                       a[l][c]=k;
              }
     }
}

           
             
int main(){
        
    int m, n, z, i, a, b, aux1, aux2, v1[MAX], v2[MAX], A[MAX][MAX];
    
    /* inicializações por parte do usuário*/
    printf("\t\t\tCampo Minado\n");
    printf("\nEntre com o numero de linhas da matriz do jogo (maximo 10):");
    scanf("%d", &m);
    printf("Entre com o numero e colunas da matriz do jogo (maximo 10):");
    scanf("%d", &n);
    printf("Entre com o numero de minas (maximo %d):", m*n);
    scanf("%d", &z);
    
    /*auxiliares no sorteio da mina definidas pelo usuário, para garantir maior aleatorieadade*/
    printf("\nEntre com um valor auxiliar para o sorteio das linhas das minas:");
    scanf("%d", &a);
    printf("Entre com um valor auxiliar para o sorteio das colunas das minas:");
    scanf("%d", &b);
    
    /*sorteio da linha da mina*/
    srand(a);         
    for(i=0; i<z; i++)
             v1[i] = rand()%m;
             
    le_matriz(A, m, n);                 
    
    /*sorteio da coluna da mina e determinação de coordenadas não-repetidas*/
    for(i=0; i<z; i++){
             v2[i] = rand()%n;
             if (A[v1[i]][v2[i]]==VAZIA) A[v1[i]][v2[i]]=MINA;
    }
    
    /*impressões do jogo e chamada das funções que garantem jogabilidade*/
    printf("\n\t\tJogo inicialiado!\n");
    printf("\nSituacao inicial da matriz (existem %d posicoes livres de minas):\n\n", (m*n)-z);  
    
    imprime_matriz(A, m, n);
    k_minas(A, m, n);
    
    printf("\n");
    
    system("pause");
    return 0;
}

Porém, os métodos que utilizei para o sorteio da matriz estão dando erro na medida que duas bombas acabam caindo na mesma posição e algo de errado ocorre que o programa quando executado, pára e não finaliza com o enter. É um exercício um pouquinho longo, mas quem se disponibilizar a me ajudar, obrigado! Ah, e caso possam avaliar o que eu já fiz do programa também, além do sorteio, seria um auxílio para não ocorrerem erros na continuação do mesmo.

Agradeço!

Editado por ovatsug
Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0
Guest --RAFAEL --
Olá pessoal, eu tenho q construir em C, um jogo de campo minado e já fiz o esboço inicial e segue os códigos que já fiz (não está acabado, por enquanto só deveria estar sorteando as minas e lendo a matri e associando os valores às minas. O exercício está no link [url=http://www.ime.usp.br/~yw/2008/mac115/eps/ep3/ep3.pdf], por ser meio grande não precisem necessariamente ler, acho q basta saber jogar o campo minado, mas se alguém disponibilizar de mais tempo, serei grato!

O código já feito é o seguinte:

#include <stdio.h>
#include <stdlib.h>
#define MINA -1  /*indica que a posição analisada está com mina*/
#define VAZIA 0  /*indica que a posição analisada está sem mina*/
#define MAX 10 

/*inicialização da matriz sem as bombas, a princípio*/
void le_matriz (int a[][MAX], int p, int q){
     int l,c;
     
     for(l=1; l<=p; l++){
              for(c=1; c<=q; c++)
                       a[l][c]=VAZIA;
     }
}

/*inserção de borda para observação de casas vizinhas*/
void borda(int a[][MAX], int b, int d){
  int l, c;

  for (l=0; l<=b+1; l++){
      a[l][0]=a[l][d+1]=VAZIA;
  } 
  for (c=0; c<=d+1; c++){
      a[0][c]=a[b+1][c]=VAZIA;
  }
}

/*impressão da matriz com o uso de marcadores*/
void imprime_matriz (int a[][MAX], int p, int q){
     int l, c;
     
     for(c=0; c<=q; c++)
              if(c!=0)printf("%d ", c);               /*inseri-se números nas bordas horizontalmente para a observação das colunas*/ 
              else printf("   ");
     printf("\n");
     for(l=1; l<=p; l++){
              for(c=1; c<=q; c++){
                       if(c==1) printf("%2d * ", l);   /*inseri-se números nas bordas verticalmente para a observação das linhas*/
                       else printf("* ");
                       }
              printf("\n");
     }
}

/*leitura do número k de vizinhos com minas para cada posição da matriz*/
void k_minas (int a[][MAX], int p, int q){
     int l, c, k;
        
     for(l=1; l<=p; l++){
              for(c=1; c<=q; c++){
                       k=0;
                       if(a[l-1][c]==MINA) k++;
                       if(a[l+1][c]==MINA) k++;
                       if(a[l][c-1]==MINA) k++;
                       if(a[l][c+1]==MINA) k++;
                       if(a[l-1][c-1]==MINA) k++;
                       if(a[l-1][c+1]==MINA) k++;
                       if(a[l+1][c-1]==MINA) k++;
                       if(a[l+1][c+1]==MINA) k++;
                       a[l][c]=k;
              }
     }
}

           
             
int main(){
        
    int m, n, z, i, a, b, aux1, aux2, v1[MAX], v2[MAX], A[MAX][MAX];
    
    /* inicializações por parte do usuário*/
    printf("\t\t\tCampo Minado\n");
    printf("\nEntre com o numero de linhas da matriz do jogo (maximo 10):");
    scanf("%d", &m);
    printf("Entre com o numero e colunas da matriz do jogo (maximo 10):");
    scanf("%d", &n);
    printf("Entre com o numero de minas (maximo %d):", m*n);
    scanf("%d", &z);
    
    /*auxiliares no sorteio da mina definidas pelo usuário, para garantir maior aleatorieadade*/
    printf("\nEntre com um valor auxiliar para o sorteio das linhas das minas:");
    scanf("%d", &a);
    printf("Entre com um valor auxiliar para o sorteio das colunas das minas:");
    scanf("%d", &b);
    
    /*sorteio da linha da mina*/
    srand(a);         
    for(i=0; i<z; i++)
             v1[i] = rand()%m;
             
    le_matriz(A, m, n);                 
    
    /*sorteio da coluna da mina e determinação de coordenadas não-repetidas*/
    for(i=0; i<z; i++){
             v2[i] = rand()%n;
             if (A[v1[i]][v2[i]]==VAZIA) A[v1[i]][v2[i]]=MINA;
    }
    
    /*impressões do jogo e chamada das funções que garantem jogabilidade*/
    printf("\n\t\tJogo inicialiado!\n");
    printf("\nSituacao inicial da matriz (existem %d posicoes livres de minas):\n\n", (m*n)-z);  
    
    imprime_matriz(A, m, n);
    k_minas(A, m, n);
    
    printf("\n");
    
    system("pause");
    return 0;
}

Porém, os métodos que utilizei para o sorteio da matriz estão dando erro na medida que duas bombas acabam caindo na mesma posição e algo de errado ocorre que o programa quando executado, pára e não finaliza com o enter. É um exercício um pouquinho longo, mas quem se disponibilizar a me ajudar, obrigado! Ah, e caso possam avaliar o que eu já fiz do programa também, além do sorteio, seria um auxílio para não ocorrerem erros na continuação do mesmo.

Agradeço!

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...