Ir ao conteúdo
  • Cadastre-se

Jogo campo minado, atualizar matriz a cada rodada?


Berilo

Posts recomendados

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

Link para o comentário
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
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

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...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!