Ir ao conteúdo
  • Cadastre-se
Berilo

Jogo campo minado, atualizar matriz a cada rodada?

Recommended Posts

Fala galera, estou trabalhando nesse projeto de Campo Minado, bem simples. A ideia aqui é pra ficar pedindo coordenadas do usuário a cada rodada, atualizando a matriz do campo minado na tela e assim vai até o fim. Percebi que ao pedir a coordenada de "linha" na primeira chamada, tenho que informar 2 números, mas não sei porque isso ocorre. Mesmo assim, a primeira chamada funciona normalmente e então a partir da segunda chamada, os valores para "linha" e "coluna" estão sendo invertidos. Tentei mudar algumas coisas mas não tive muita sorte, então resolvi buscar ajuda aqui, o código está assim no momento:

 

#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <stdlib.h>

#define M 100
#define N 100


void gera_campoMinado(int a[M][N], int linha, int coluna, int bomba ){ //recebe uma matriz, dimensões da matriz e a quantidade de bombas, as bombas então são geradas em posiçoes aleatórias. 1 = bomba

    
    int x = 0;
    int cont = 0;
    
              
              
              
      while( cont < bomba ){
             int i = rand() % linha ;
             int j = rand() % coluna;
            if (a[i][j] == 0){
            a[i][j] = 1;
            cont++;}
                 
                 
                 }
             
                       
                       
                       
                        
                       }
                       
                       
void imprimir_campoMinado(int a[M][N], int linha, int coluna){ // imprime o campo minado, X = bomba
     int soma = 0;
     for(int i = 0; i  < linha; i++){
             for(int j = 0; j < coluna; j++){
                     if (a[i][j] == 1){
                        printf(" | X | ");
                        soma = soma +1;}
                     else printf(" | O | ");
                     }
                   printf("\n");
                   }
                   
                   printf("\n\n total de bombas = %d\n", soma);
                   }               
  
  
void imprimir_campoVizinhas(int a[M][N], int linha, int coluna){ // imprime a quantidade de bombas ao redor de cada posiçao.
     for (int i = 0; i < linha; i++){
         for(int j = 0; j < coluna; j++){
                 printf ("| %d | ", a[i][j]);
                 }
                 printf("\n");  
}
}
                    
void checa_vizinhas(int a[M][N], int b[M][N], int linha, int coluna){// verifica quantas bombas existem ao redor de cada posição.
     int soma = 0;
      for( int i = 0; i < linha; i++)
           for (int j = 0; j < coluna; j++){
               if ( j > 0 && a[i][j-1] == 1) soma++;
               if ( j < coluna && a[i][j+1] == 1)soma++;
               if ( i < linha && a[i+1][j] == 1) soma++;
               if ( i > 0 && a[i-1][j] == 1) soma++;
               if ( i < linha && j>0 && a[i+1][j-1] == 1) soma++;
               if ( i < linha && j < coluna && a[i+1][j+1] == 1 )soma++;
               if ( i > 0 && j > 0 && a[i-1][j-1] == 1) soma++;
               if ( i > 0 && j < linha && a[i-1][j+1] == 1) soma++;
               b[i][j] = soma;
               soma = 0;
               }
}              
 
 // não está funcionando como queria, então deixei pra mexer depois, a ideia era chamar essa função recursivamente caso uma posição tenha 0 bombas ao redor.
/*void imprimir_vizinhas( int Vizinhas[M][N], int linha, int coluna ,int CordA, int CordB){
	
	if(Vizinhas[CordA][CordB] != 0)
	printf ("| %d |", Vizinhas[CordA][CordB]);
	else {
	printf(" 0 ");
	if(CordB -1 > 0 ) imprimir_vizinhas(Vizinhas, linha, coluna, CordA, CordB-1);
	if(CordB +1 < coluna) imprimir_vizinhas(Vizinhas, linha, coluna, CordA, CordB+1);
	if(CordA +1 < linha) imprimir_vizinhas(Vizinhas,linha, coluna, CordA+1, CordB);
	if(CordA -1 > 0)imprimir_vizinhas(Vizinhas,linha, coluna, CordA-1, CordB);
	if(CordA +1 <linha && CordB - 1 > 0)imprimir_vizinhas(Vizinhas,linha,coluna,CordA+1,CordB-1);
	if(CordA +1 <linha && CordB +1 < coluna)imprimir_vizinhas(Vizinhas,linha,coluna,CordA+1,CordB+1);
	if(CordA -1> 0 && CordB-1 > 0)imprimir_vizinhas(Vizinhas, linha, coluna, CordA-1,CordB-1);
	if(CordA -1>0 && CordB+1< coluna)imprimir_vizinhas(Vizinhas,linha, coluna, CordA-1, CordB+1);
	
	}
	
	
	
	
} */
 
void imprimir_jogo(int CampoMinado[M][N],int Vizinhas[M][N], int linha, int coluna, int CordA, int CordB ){// imprime o estado atual do jogo
	
	int i,j;
	for(i=0; i<linha;i++){
		for(j=0; j< coluna; j++){
			
			
			if(CampoMinado[i][j] <= (linha*coluna) )
				printf("| ? |");
			else if (CampoMinado[i][j] == ((linha*coluna) +1)){			
				printf("| X |");
				}
			else if (CampoMinado[i][j] == ((linha*coluna)+2)){
				printf("| %d |",Vizinhas[i][j]);
				
					
				
			}
				
			
		
			
		}
		
		printf("\n");
	}
	
	
}


void jogo(int CampoMinado[M][N], int Vizinhas[M][N],  int linha, int coluna){// inicia o jogo, recebendo as coordenadas e imprimindo o estado do jogo em cada passo
	
	int CordA; 
	int CordB;
	int gameover= 0;
	printf("inicio de jogo!");
	printf("\n\n");
	imprimir_jogo(CampoMinado, Vizinhas, linha, coluna,CordA, CordB);
	printf("\n");
	
	while(gameover != 1){
		printf("informe uma coordenada:\n ");
		
		printf("linha(menor que %d): ", linha);
		scanf(" %d\n", &CordA);	
				while(CordA < 0 || CordA >= linha){		
					printf("linha(menor que %d): ", linha);
					scanf(" %d\n", &CordA);
		}
		
		printf("coluna(menor que %d): ",coluna);
		scanf(" %d\n", &CordB);
				while(CordB < 0 && CordB >= coluna){		
					printf("coluna(menor que %d): ",coluna);
					scanf(" %d\n", &CordB);
		}
			if(CampoMinado[CordA][CordB] == 1){
				CampoMinado[CordA][CordB] = (linha*coluna) +1;
				printf("Bomba! Gameover!\n");
				imprimir_jogo(CampoMinado,Vizinhas, linha, coluna, CordA, CordB);
				gameover=1;
	}
			else if (CampoMinado[CordA][CordB] == 0){
				CampoMinado[CordA][CordB] = (linha*coluna) +2;
				imprimir_jogo(CampoMinado,Vizinhas,linha,coluna, CordA, CordB);
		
	}
	
}
	
	
}

 

     



int main() {
    
    int campoMinado[M][N],campoVizinhas[M][N], linha, coluna, bomba;
    
    printf("informe a quantidade de linhas: ");
    scanf("%d", &linha);

    printf("informe a quantidade de colunas: ");
    scanf("%d", &coluna);
    
    
    printf("informe a quantidade maxima de bombas: ");
    scanf("%d",&bomba);
    
    
    for(int i = 0; i < linha; i++){
            for( int j = 0; j< coluna; j++){
            campoMinado[i][j] = 0;}
            }
            
     for(int i = 0; i < linha; i++){
            for( int j = 0; j< coluna; j++){
            campoVizinhas[i][j] = 0;}
            }
            
    
    
    printf("\n\n Campo Minado completo:\n");
    srand( (unsigned)time(NULL) );
    
     gera_campoMinado(campoMinado,linha, coluna, bomba);
    imprimir_campoMinado(campoMinado, linha, coluna);
    checa_vizinhas(campoMinado, campoVizinhas, linha, coluna);
    printf("\n\n\n");
    imprimir_campoVizinhas(campoVizinhas, linha, coluna);
    printf("\n\n\n\n\n\n\n");
    jogo(campoMinado,campoVizinhas,linha,coluna);
    
    
    

    
    
    
    
    
    
    
    
    
	system ("pause");
	return 0;
    
}
    
    
   

 

 

 

Alguém consegue enxergar o que estou fazendo de errado? Alguma dica de como poderia melhorar esse código?

 

Obrigado amigos

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Berilo Não coloque \n dentro dos scanfs, o scanf automaticamente já pula uma linha depois de toda leitura, e mesmo que não pulasse, coloque '\n' apenas dentro das funções printf();

 

Tinha um erro na crítica da coluna que aceitava valores maiores ou iguais ao tamanho da matriz.


void jogo(int CampoMinado[M][N], int Vizinhas[M][N],  int linha, int coluna) { // inicia o jogo, recebendo as coordenadas e imprimindo o estado do jogo em cada passo

  int CordA;
  int CordB;
  int gameover = 0;
  printf("inicio de jogo!");
  printf("\n\n");
  imprimir_jogo(CampoMinado, Vizinhas, linha, coluna, CordA, CordB);
  printf("\n");

  while(gameover != 1) {
    printf("informe uma coordenada:\n ");

    do {
      printf("linha(menor que %d): ", linha);
      scanf("%d", &CordA);
    } while(CordA < 0 || CordA >= linha);

    do {
      printf("coluna(menor que %d): ", coluna);
      scanf("%d", &CordB);
    } while(CordB < 0 || CordB >= coluna);

    if(CampoMinado[CordA][CordB] == 1) {
      CampoMinado[CordA][CordB] = (linha * coluna) + 1;
      printf("Bomba! Gameover!\n");
      imprimir_jogo(CampoMinado, Vizinhas, linha, coluna, CordA, CordB);
      gameover = 1;
    } else if (CampoMinado[CordA][CordB] == 0) {
      CampoMinado[CordA][CordB] = (linha * coluna) + 2;
      imprimir_jogo(CampoMinado, Vizinhas, linha, coluna, CordA, CordB);
    }
  }

}

 

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@CiroboyBR

Nossa, muito obrigado Ciroboy, devo ter colocado esses \n por reflexo depois de mexer com os printf, nem tinha me tocado nisso hahaha

 

Tentarei melhorar o código um pouco, muito obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×