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