Salve a tutti, sto cercando di realizzare una versione ascii di prato fiorito ma sto avendo difficoltà nella generazione della matrice che poi verrà visualizzata dall'utente (ovvero quella in cui le celle contengono il numero di mine adiacenti).
Inizialmente randomizzo, con la funzione 'randomize', una matrice booleana (in questo caso, per comodità, fatta di 9 e 0) per posizionare le mine sul campo da gioco (ogni cella ha il 15% di probabilità di contenerne una).
A questo punto vorrei creare una seconda matrice in cui al posto degli 0 (ovvero celle vuote) ci sia il numero di mine adiacenti.
Ovviamente per fare ciò devo prendere in considerazione i casi limite delle celle agli angoli e ai bordi.
Il codice compila, il problema è che la gestione dei bordi, nonostante l'abbia tenuta a mente, non funziona come dovrebbe e i numeri che ottengo sembrano casuali.
Riporto qui il codice nella speranza che qualcuno sappia dirmi dove sbaglio. Grazie in anticipo.
#include <stdio.h>
#include <stdlib.h>
/*Legenda:
matbool
9=mina
0=nessuna mina adiacente
matvis:
9=mina (quando stampo a video per prove uso il carattere #)
0-8=numero mine adiacenti
*/
/*Funzione per ottenere casualmente valori 9 e 0 con il 15% di probabilità di avere un 9*/
int randomize(a,b){
int f,r;
r=rand()%100;
if (r<=14){f=9;}
else {f=0;}
return f;
}
int main()
{ /*INPUT DEL NUMERO DI RIGHE E COLONNE*/
int row,col;
printf("Inserire il numero di righe e colonne:\n ");
printf("Righe: ");
scanf("%d",&row);
printf("\nColonne: ");
scanf("%d",&col);
/*GENERAZIONE MATRICE BOOLEANA: matrice con solo 9(a video #) e 0 per posizionare le mine */
int matbool[row][col];
int i,j;
for(i=0;i<row;i++){
for(j=0;j<col;j++){
matbool[i][j]=randomize(row,col);
}
}
/*STAMPA DI PROVA*/
for(i=0;i<row;i++){ /*DA TOGLIERE QUANDO FINITO*/
for(j=0;j<col;j++){ /*DA TOGLIERE QUANDO FINITO*/
if(matbool[i][j]==9) {printf(" #");}/*DA TOGLIERE QUANDO FINITO*/
else {printf("%3d",matbool[i][j]);} /*DA TOGLIERE QUANDO FINITO*/
} /*DA TOGLIERE QUANDO FINITO*/
printf("\n"); /*DA TOGLIERE QUANDO FINITO*/
} /*DA TOGLIERE QUANDO FINITO*/
/*GENERAZIONE MATVIS: matrice che si vedrà effettivamente con il numero di mine adiacenti*/
int matvis[row][col];
for(i=0;i<row;i++){
for(j=0;j<col;j++){
matvis[i][j]=0; /*Inizializzo a 0 e incremento ogni volta che trovo una mina adiacente*/
if(matbool[i][j]!=9){ /*Analizzo solo nelle celle in cui non c'è già una mina*/
/*CASO ANGOLO N/O(NORD/OVEST)*/
if((i==0)&&(j==0)){
if (matbool[i+1][j]==9){matvis[i][j]++;}
if (matbool[i][j+1]==9){matvis[i][j]++;}
if (matbool[i+1][j+1]==9){matvis[i][j]++;}
}
/*CASO ANGOLO N/E */
if((i==0)&&(j==(col-1))){
if (matbool[i+1][j]==9){matvis[i][j]++;}
if (matbool[i][j-1]==9){matvis[i][j]++;}
if (matbool[i+1][j-1]==9){matvis[i][j]++;}
}
/*CASO ANGOLO S/O*/
if((i==(row-1))&&(j==0)){
if (matbool[i-1][j]==9){matvis[i][j]++;}
if (matbool[i][j+1]==9){matvis[i][j]++;}
if (matbool[i-1][j+1]==9){matvis[i][j]++;}
}
/*CASO ANGOLO S/E*/
if((i==0)&&(j==(col-1))){
if (matbool[i-1][j]==9){matvis[i][j]++;}
if (matbool[i][j-1]==9){matvis[i][j]++;}
if (matbool[i-1][j-1]==9){matvis[i][j]++;}
}
/*CASO LATO N*/
if((i==0)&&(j!=0)&&(j!=(col-1))){
if(matbool[i+1][j]==9){matvis[i][j]++;}
if(matbool[i][j+1]==9){matvis[i][j]++;}
if(matbool[i][j-1]==9){matvis[i][j]++;}
if(matbool[i+1][j+1]==9){matvis[i][j]++;}
if(matbool[i+1][j-1]==9){matvis[i][j]++;}
}
/*CASO LATO S*/
if((i==(row-1))&&(j!=0)&&(j!=(col-1))){
if(matbool[i-1][j]==9){matvis[i][j]++;}
if(matbool[i][j+1]==9){matvis[i][j]++;}
if(matbool[i][j-1]==9){matvis[i][j]++;}
if(matbool[i-1][j-1]==9){matvis[i][j]++;}
if(matbool[i-1][j+1]==9){matvis[i][j]++;}
}
/*CASO LATO O*/
if((j==0)&&(i!=0)&&(i!=(row-1))){
if(matbool[i-1][j]==9){matvis[i][j]++;}
if(matbool[i+1][j]==9){matvis[i][j]++;}
if(matbool[i][j+1]==9){matvis[i][j]++;}
if(matbool[i+1][j+1]==9){matvis[i][j]++;}
if(matbool[i-1][j+1]==9){matvis[i][j]++;}
}
/*CASO LATO E*/
if((j==(col-1))&&(i!=0)&&(i!=(row-1))){
if(matbool[i-1][j]==9){matvis[i][j]++;}
if(matbool[i+1][j]==9){matvis[i][j]++;}
if(matbool[i][j-1]==9){matvis[i][j]++;}
if(matbool[i+1][j-1]==9){matvis[i][j]++;}
if(matbool[i-1][j-1]==9){matvis[i][j]++;}
}
/*CASO GENERICO (IN MEZZO)*/
else {
if(matbool[i+1][j]==9){matvis[i][j]++;}
if(matbool[i][j+1]==9){matvis[i][j]++;}
if(matbool[i-1][j]==9){matvis[i][j]++;}
if(matbool[i][j-1]==9){matvis[i][j]++;}
if(matbool[i+1][j+1]==9){matvis[i][j]++;}
if(matbool[i-1][j-1]==9){matvis[i][j]++;}
if(matbool[i-1][j+1]==9){matvis[i][j]++;}
if(matbool[i+1][j-1]==9){matvis[i][j]++;}
}
}
else {matvis[i][j]=9;} /*Nelle celle in cui ho già una mina impongo il valore 9(che stamperò come #)*/
}
}
/*STAMPA DI PROVA DELLA MATRICE MATVIS*/
printf("\n\n\n"); /*DA TOGLIERE QUANDO FINITO*/
for(i=0;i<row;i++){ /*DA TOGLIERE QUANDO FINITO*/
for(j=0;j<col;j++){ /*DA TOGLIERE QUANDO FINITO*/
if(matvis[i][j]==9) {printf(" #");}/*DA TOGLIERE QUANDO FINITO*/
else {printf("%3d",matvis[i][j]);} /*DA TOGLIERE QUANDO FINITO*/
} /*DA TOGLIERE QUANDO FINITO*/
printf("\n"); /*DA TOGLIERE QUANDO FINITO*/
} /*DA TOGLIERE QUANDO FINITO*/
}