[C++] And logico e array multidimensionali
Ciao a tutti.
Vi sottopongo dei pezzi di un programma che vuole simulare il gioco della battaglia navale.
Premesso che il caricamento del campo da battaglia avviene tramite questa funzione:
quando vado a scrivere :
il programma entra nell'if, anche nel caso in cui in input venga dato:
11000
00000
11100
00000
00000
L'if qui sopra si riferisce a un controllo di navi disposte verticalmente. (1= pezzo di nave, 0= mare)
Poichè le navi non possono confinae tra loro ho pensato di impostare così il mio if. Qualcuno sa dirmi dove sbaglio?
Vi sottopongo dei pezzi di un programma che vuole simulare il gioco della battaglia navale.
Premesso che il caricamento del campo da battaglia avviene tramite questa funzione:
int inizBattaglia (int array [][N]){ int i,j; printf("\nNave = 1\nMare=0\n"); for(i=0; i<N; i++) for(j=0; j<N; j++){ printf("Riga %d,colonna %d\n", i, j); scanf ("%d", &array[i][j]); } return 0; }
quando vado a scrivere :
if(array[i][j]==1 && j<N-1 && array[i][j+1]==0)
il programma entra nell'if, anche nel caso in cui in input venga dato:
11000
00000
11100
00000
00000
L'if qui sopra si riferisce a un controllo di navi disposte verticalmente. (1= pezzo di nave, 0= mare)
Poichè le navi non possono confinae tra loro ho pensato di impostare così il mio if. Qualcuno sa dirmi dove sbaglio?
Risposte
Dove hai inserito la tua selezione? Non c'è alcuna condizione all'interno del codice precedente da te postato. Sei sicuro che array[j+1] sia stato effettivamente già settato quando il codice entra nell'if? Se il codice fosse ad esempio:
allora array[j+1] non avrebbe ancora il valore definitivo e probabilmente è settato a 0. Se questo è il caso allora il test lo devi fare successivamente:
for(i=0; i<N; i++) { for(j=0; j<N; j++){ printf("Riga %d,colonna %d\n", i, j); scanf ("%d", &array[i][j]); if(array[i][j]==1 && j<N-1 && array[i][j+1]==0) { /* fai qualcosa... */ } } }
allora array[j+1] non avrebbe ancora il valore definitivo e probabilmente è settato a 0. Se questo è il caso allora il test lo devi fare successivamente:
if (array[i][j] == 1 && j > 0 && array[i][j-1] == 1) { /* ci sono due 1 consecutivi... */ }
L'if è inserito in questa parte
Anche nella situazione che ho postato sopra mi ritorna 1 perchè conta una nave verticale da una celletta.
Ma nell'IF io sto chiedendo,almeno così credo, di entrare in quel blocco solo se nella cella a fianco orizzontalmente non c'è un pezzetto di nave!
Dove sbaglio?
#define minima 2 ..... for(i=0; i<N; i++) for(j=0; j<N; j++){ if(array[i][j]==1 && j<N-1 && array[i][j+1]==0){ nave=0; while(i<N && array[i][j]!=0){ i++; nave++; } if(nave < minima) return 1;
Anche nella situazione che ho postato sopra mi ritorna 1 perchè conta una nave verticale da una celletta.
Ma nell'IF io sto chiedendo,almeno così credo, di entrare in quel blocco solo se nella cella a fianco orizzontalmente non c'è un pezzetto di nave!
Dove sbaglio?
"joya89":
Dove sbaglio?
Un po tutto.... non saprei manco da dove iniziare.
Secondo me, l'errore piu' grosso che commenti è quello di voler scrivere del codice, senza manco aver analizzato un pochino il problema.
La scrittura del codice deve essere la parte finale di un ragionamento, cerca di definire prima le variabili in gioco:
- quanto è grande il campo di battaglia ?
- quante navi ci sono ?
- quanto sono lunghe le navi ?
- possono essere disposte orizzontalmente e anche verticalmente?
- possono o meno essere attigue tra loro ?
Prova a disegnare una situazione del gioco, e poi ci ragioni su...
Beh questo che ho scritto è soltanto una parte ovviamente.
Il campo di battaglia è NxN. Devono esserci almeno una nave da 2 celle e una da 3 celle.
Attorno alle navi può esserci solo mare o bordo campo.
Ho riportato solo questo pezzo perchè il mio problema sta nel fatto che anche quando una nave è orizzontale (la cella 1 ha alla destra un'altra cella 1) subisce il controllo fatto per le navi verticali ovvero entra nell'IF che ho postato.
Il campo di battaglia è NxN. Devono esserci almeno una nave da 2 celle e una da 3 celle.
Attorno alle navi può esserci solo mare o bordo campo.
Ho riportato solo questo pezzo perchè il mio problema sta nel fatto che anche quando una nave è orizzontale (la cella 1 ha alla destra un'altra cella 1) subisce il controllo fatto per le navi verticali ovvero entra nell'IF che ho postato.
"joya89":
Ho riportato solo questo pezzo perchè il mio problema sta nel fatto che anche quando una nave è orizzontale (la cella 1 ha alla destra un'altra cella 1) subisce il controllo fatto per le navi verticali ovvero entra nell'IF che ho postato.
Il problema è carino da risolvere, e non è stupido.
Lo suddividerei in tanti microsezioni, ognuna delle quali si occupa di una cosa specifica.
Partirei con una tabella delle stesse dimensioni dove, man mano che le navi vengono trovate, vengono settate le relative celle, e controllate tutte le celle adiacenti che siano vuote, facendo attenzione che procedendo da sinistra verso destra e dall'alto in basso, trovata una cella "occupata", la nave può svilupparsi verso destra (orrizzontale), o verso il giu' (verticale).
Per ogni nave trovata potresti contarle in un secondo array di una dimensione (ad esempio, grande 5 ), dove conti quanti navi ci sono di 2 elementi, quante da 3, da 4 e da 5.
A fine elaborazione, puoi controllare questo array per verificare se il numero delle navi è corretto, e relativa tipologia.
Non è difficile, ma bisogna scrivere un po di codice
