|
| HOMEPAGE | INDICE FORUM | REGOLAMENTO | ::. | NEI PREFERITI | .:: | RSS Forum | RSS News | NEWS web | NEWS software | |
| PUBBLICITA' | | | ARTICOLI | WIN XP | VISTA | WIN 7 | REGISTRI | SOFTWARE | MANUALI | RECENSIONI | LINUX | HUMOR | HARDWARE | DOWNLOAD | | | CERCA nel FORUM » | |
20-09-2013, 18.39.32 | #1 |
Newbie
Registrato: 20-09-2013
Messaggi: 12
|
[c/c++] BATTAGLIA NAVALE
che non si devono toccare nemmeno con i spigoli, poi da questo dovrei fare un vero gioco dove viene costruito un campo casuale per la cpu, mio manualmente, e devo giocare contro la cpu, la difficoltà è che in 25% di mosse della cpu le mie navi devono essere distrutte. programma lo devo fare in c++ e ho il prof che non aiuta ne suggerisce per niente. Vi mando un codice che ho fatto per la visualizzazione delle navi ma non funziona tanto bene (non so il perché) inoltre ha problema della segmentazione (su matrice[i][j]=1), ecco il codice: Codice:
#include <conio.h> #include <stdio.h> #include <time.h> #include <stdlib.h> //battaglia navale #define max 10 int main(){ srand((unsigned)time(NULL)); int matrice[max][max]; int ma,a,i,j,q,t,d,c,h; q=1;t=2;d=3; char ch; do{ for(i=0;i<=max;i++){ for(j=0;j<=max;j++){ matrice[i][j]=0; } } for(a=0;a<6;a++){ if(q>0){ c=4; ma=max-c; i=rand() %ma; j=rand() %ma; //printf("4 %d %d\n\n",i,j); q--; } if((q<1)&&(t>0)){ c=3; ma=max-c; i=rand() %ma; j=rand() %ma; //printf("3 %d %d\n\n",i,j); int w=1; while(w!=0){ for(int q=0;q<(c+2);q++){ if((matrice[i-1+q][j+1]||matrice[i-1+q][j-1])==1){ i=rand() %ma; j=rand() %ma; //printf("3 for %d %d\n\n",i,j); w=1; } else w=0; i++; } } t--; } if((q<1)&&(t<1)&&(d>0)){ c=2; ma=max-c; i=rand() %ma; j=rand() %ma; //printf("2 %d %d\n\n",i,j); int w=1; while(w!=0){ for(int q=0;q<(c+2);q++){ if((matrice[i-1+q][j+1]||matrice[i-1+q][j-1])==1){ i=rand() %ma; j=rand() %ma; //printf("2 for %d %d\n\n",i,j); w=1; } else w=0; } } d--; } h=0; while(h<c){ matrice[i][j]=1; i++; h++; } } for(i=0;i<max;i++){ for(j=0;j<max;j++){ if(matrice[i][j]==0)printf("~~");//printf("%d",matrice[i][j]); else printf("||"); } printf("\n"); } printf("\n"); ch=getch(); } while(ch!=13); return 0; } P.S. uso dev c++ (4.9.9.2) |
20-09-2013, 18.55.39 | #2 |
Made in Japan
Top Poster
Registrato: 04-07-2001
Messaggi: 4.461
|
Rif: [c/c++] BATTAGLIA NAVALE
Prof. Quaglia?
|
20-09-2013, 18.58.49 | #3 |
Newbie
Registrato: 20-09-2013
Messaggi: 12
|
Rif: [c/c++] BATTAGLIA NAVALE
no raeli, è un **** me l'ha assegnato per domani senza spiegare niente figurati...
P.S. Sapresti aiutarmi? |
20-09-2013, 21.43.06 | #4 |
Forum supporter
Global Moderator
Registrato: 23-08-2007
Messaggi: 2.704
|
Rif: [c/c++] BATTAGLIA NAVALE
Non si capisce cosa sono e cosa fanno le variabili, non ci sono commenti a spiegare almeno le 20 righe successive, non fai vedere un semplice output e non dici dove sta il problema con esattezza.
Io ti darei 4 solo per questo |
20-09-2013, 21.45.55 | #5 |
Gold Member
WT Expert
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.505
|
Rif: [c/c++] BATTAGLIA NAVALE
Se non spiega un'accidenti ci sono tre possibilità:
La prima è che non sa nemmeno lui come si fa La seconda è che s'immagina che tu non lo sappia fare La terza è che in rete c'è quel che cerchi: http://www.jertix.org/it/blog/progra...vale-in-c.html ed a te basta compilare, vedere se risponde ai tuoi requisiti ed, eventualmente, metterci mano. Non perderti in un bicchier d'acqua. All'università puoi anche trovare dei banditi che insegnano, quindi non farti troppi scrupoli...l'importante è che tu capisca il codice e che tu sappia ripertergli la lezione come te l'ha insegnata. ps: All'università non sei alle superiori...Tante volte ti devi arrangiare, quindi rassegnati a studiare per conto tuo, soprattutto un linguaggio. Da quello che leggo nel codice che hai postato, le basi le hai, sempre che tu non abbia fatto copia/incolla di codice preso qua e la, magari facente parte della lezione. Un appunto: Quello è C, non C++. Quei printf si trasformano in cout, tanto per cominciare. xilo76, anche se il codice che hai proposto è decisamente semplice, ha ragione. Commenta anche se il codice è tuo.
___________________________________
Practice feeds Skill,Skill limits Failure,Failure enhances Security,Security needs Practice |
21-09-2013, 14.36.21 | #6 |
Newbie
Registrato: 20-09-2013
Messaggi: 12
|
Rif: [c/c++] BATTAGLIA NAVALE
Ciao a tutti, scusate che vi risp ora ma ieri non potevo connettermi più.
Per quanto riguarda il codice è interamente scritto da me, per quando riguarda i comandi cin cout dovrei utilizzaare la lib. iostream (se nn sbaglio) ma siccome usiamo a scuola printf e scanf (o gets, getch in caso di stringhe o caratteri) i commenti non li ho messi perchè pensavo fosserò inutili, comunque sono + funzioni in uno, c'è dichiarazione inizzializzazione della matrice e inizzializzazione dei variabili, il programma fatto, funziona ma si crash'a e in seguito blocca, ho provato di fare il debug come ho scritto nel primo post ma sempre il problema mi da nella matrice e il valore della i è maggiore del valore max (definito all'inizio ed è un numero massimo = campo), non so che informazioni darvi tra un pò vi ri-posto il codice con i commenti e per il fatto di linguaggio c, nel c semplice se non sbaglio non ci sono i cicli (while for e do-while), do - while l'ho usato solo per non riavviare ogni volte il programma per vedere la casualità e funzione del programma, ma nemmeno questo vuole funzionare... |
21-09-2013, 15.47.57 | #7 |
Newbie
Registrato: 20-09-2013
Messaggi: 12
|
Rif: [c/c++] BATTAGLIA NAVALE
Codice:
#include <conio.h> #include <stdio.h> #include <time.h> #include <stdlib.h> //le librerie //battaglia navale #define max 10 int main(){ srand((unsigned)time(NULL)); //funzione random int matrice[max][max]; //matrice int a,i,j,q,t,d,c,h; //definisco variabili //i sarebbe l'ordinata della matrice e j la'ascissa, q,t,d le spiego sotto //c lunghezza navi, h mi serve per il ciclo while in seguito e la a per for q=1;t=2;d=3; //quantità navi, q=nave da quattro poli, t= tre, d=due char ch; //carattere do{ //funzione do-while for(i=0;i<=max;i++){ for(j=0;j<=max;j++){ matrice[i][j]=0; } //inizializzazione matrice } for(a=0;a<6;a++){ //ciclo for per mettere le navi if(q>0){ //funzione if, che vede la quantità di navi rimaste e genera le coordinate dove metterle c=4; //in questo caso ha solo una nave da 4 int ma=max-c; //introduce il numero massimo per le coordinate che sono lungh. campo - lunghezza nave i=rand() %ma; j=rand() %ma; q--; //diminuisce la quantità navi (da 4) da mettere } if((q<1)&&(t>0)){ //la stessa funzione della precedente con un for in più, //ciclo for viene usato per controllare se le navi non si toccano ai bordi e/o spigoli c=3; int ma=max-c; i=rand() %ma; j=rand() %ma; int w=1; while(w!=0){ for(int q=0;q<(c+2);q++){ if((matrice[i-1+q][j+1]||matrice[i-1+q][j-1])==1){ i=rand() %ma; j=rand() %ma; w=1; } else w=0; } } t--; //in questo caso sono 2 navi da 3 } if((q<1)&&(t<1)&&(d>0)){ //funzione analoga a precedente per le navi da 2 c=2; int ma=max-c; i=rand() %ma; j=rand() %ma; int w=1; while(w!=0){ for(int q=0;q<(c+2);q++){ if((matrice[i-1+q][j+1]||matrice[i-1+q][j-1])==1){ i=rand() %ma; j=rand() %ma; w=1; } else w=0; } } d--; } h=0; while(h<c){ //ciclo che inserisce le navi nelle coordinate generate prima matrice[i][j]=1; //il problema che mi dà è la i=13 che non può diventarlo mai... chissà dove prende questo numero i++; //incrementa la i per continuare la lunghezza della nave h++; //incrementa h per fermarsi alla lungh. della nave voluta (dipende dalla c) } } for(i=0;i<max;i++){ //stampa la mappa con le navi for(j=0;j<max;j++){ if(matrice[i][j]==0)printf("~~"); //disegna testualmente l'acqua else printf("||"); //disegna testualmente le navi } printf("\n"); } printf("\n"); ch=getch(); //preleva il carattere del controllo per sapere se rifare la funzione o chiudere il programma } while(ch!=13); //ciclo do-while ripete la funzione fin quando carattere cliccato è diverso dall'invio (codice ASCII) //l'ho omesso il return perché in questo caso non faceva la differenza se c'era o meno } Le foto come link per non appesantire troppo la pagina. 1° Foto: programma in funzione 2° Foto: dopo click di qualsiasi tasto (anche invio) 3° Foto: debug 4° Foto: riga con errore Oltre la rimessa apposto di questo programma devo mettere altre funzioni per farlo diventare un gioco... P.S: non sono all'università ma al 5 superiore e per il fatto del prof e le sue spiegazioni, ecco una delle spiegazioni molto semplici: "lista continuata è la stessa della lista semplice solo che è continuata"... P.S. 2: il programma postato, ovvero il codice non va compilato con dev, che programma hai usato per compilarlo? (Risolto, si trattava di malloc che si assegna diversamente) |
21-09-2013, 20.16.52 | #8 |
Gold Member
WT Expert
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.505
|
Rif: [c/c++] BATTAGLIA NAVALE
"il problema che mi dà è la i=13 che non può diventarlo mai... chissà dove prende questo numero"
la variabile i continua ad incrementarsi all'interno del ciclo do...while. Il suo valore è 10 dopo che l'hai utilizzata nel primo for, poi viene incrementata nel ciclo while da te proposto, insieme alla variabile h che hai POSTO A ZERO, fino a che il suo valore risulta inferiore a quello di c. L'errore di segmentazione è piuttosto chiaro: Vai a scrivere su un elemento della matrice bidimensionale che esce fuori dai suoi limiti imposti dalla costante max.
___________________________________
Practice feeds Skill,Skill limits Failure,Failure enhances Security,Security needs Practice |
22-09-2013, 01.20.25 | #9 | |
Forum supporter
WT Expert
Registrato: 13-03-2005
Loc.: Ultima stella a destra
Messaggi: 2.809
|
Rif: [c/c++] BATTAGLIA NAVALE
Quota:
___________________________________
L'uomo ha attraversato un'evoluzione complessa, dal DOS a Windows 7. Poi ... tutto è vago. Ultima modifica di retalv : 22-09-2013 alle ore 01.25.50 |
|
22-09-2013, 11.31.10 | #10 |
Newbie
Registrato: 20-09-2013
Messaggi: 12
|
Rif: [c/c++] BATTAGLIA NAVALE
LoryOne ma perchè il suo valore è 10? se io la metto nel for poi deve eseguire una delle 3 funzioni if, dove genera un numero casuale da 0 a num massimo - lunghezza della nave, e lo salva nella i e j (2 num. casuali diversi), allora dove lo prende questo maledetto 10? dovrei azzerarla dopo ogni do while? non dovrebbe essere lo stesso visto che durante il percorso del programma le assegno io un valore accettabile? Comunque NON sono universitario..
retalvcosì me l'hanno spiegato a scuola, che c ha meno funzioni rispetto c++ e non ha i cicli... Poi che ho prof. preparatissimi si vede... UP oltre ho visto che i cicli while Codice:
while(w!=0){ for(int q=0;q<(c+2);q++){ if((matrice[i-1+q][j+1]||matrice[i-1+q][j-1])==1){ i=rand() %ma; j=rand() %ma; printf("2 for %d %d\n\n",i,j); w=1; q=0;//azzeramento della q } else w=0; } |
22-09-2013, 11.49.11 | #11 |
Gold Member
WT Expert
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.505
|
Rif: [c/c++] BATTAGLIA NAVALE
Le variabili sono locali all'interno della "porzione di codice" (funzione, procedura, corpo principale) che le contiene.
Hai definito i come intero all'interno del corpo principale main, ma fino a quando non ne definisci un valore, essa può avere un qualunque valore appartenente alla tipologia che hai specificato. Con il primo for iteri assegnandole un valore da 0 a max. Questo valore è mantenuto da i, poichè non la richiami da nessun'altra parte prima del ciclo while che hai postato. E' vero che i è all'interno del ciclo do...while, ma prima che esso completi la prima verifica (eseguo finchè ch diverso da 13), c'è il secondo while che incrementa il valore di i e che deve essere eseguito fino a che h<c. Infatti: Codice:
while(h<c) { matrice[i][j]=1; --> segmentation fault i++; h++; }
___________________________________
Practice feeds Skill,Skill limits Failure,Failure enhances Security,Security needs Practice |
22-09-2013, 11.54.08 | #12 |
Newbie
Registrato: 20-09-2013
Messaggi: 12
|
Rif: [c/c++] BATTAGLIA NAVALE
si, ma prima ci sono le if, e prima del ciclo while non dovrebbe eseguirle? perchè infatti lì richiamo la i, comunque ora metto un altra variabile, vediamo cosa succede, ah ho modificato il mio penultimo post
|
22-09-2013, 12.16.41 | #13 |
Newbie
Registrato: 20-09-2013
Messaggi: 12
|
Rif: [c/c++] BATTAGLIA NAVALE
ok, oltre al cambiamento delle variabili di coordinate i,j alle l,m nel do-while ho reinizializzato le variabili q,t,d. Sennò non rimetteva le navi. Ecco il codice attuale con dentro le istruzioni per stampare le coordinate delle navi tipo. nave da tre su coord. [3,6] sarebbe 3 3 6, se le coord. erano rifatte nel ciclo for perché si toccavano con altre navi il messaggio sarebbe
3 for 3 6 codice attuale: Codice:
#include <conio.h> #include <stdio.h> #include <time.h> #include <stdlib.h> //battaglia navale #define max 10 int main(){ srand((unsigned)time(NULL)); int matrice[max][max]; int ma,a,i,j,q,t,d,c,h,l,m; char ch; do{ l=m=0; q=1;t=2;d=3; for(i=0;i<=max;i++){ for(j=0;j<=max;j++){ matrice[i][j]=0; } } for(a=0;a<6;a++){ if(q>0){ c=4; ma=max-c; l=rand() %ma; m=rand() %ma; printf("4 %d %d\n\n",l,m); q--; } if((q<1)&&(t>0)){ c=3; ma=max-c; l=rand() %ma; m=rand() %ma; printf("3 %d %d\n\n",l,m); int w=1; while(w!=0){ for(int q=0;q<(c+2);q++){ if((matrice[l-1+q][m+1]||matrice[l-1+q][m-1])==1){ l=rand() %ma; m=rand() %ma; printf("3 for %d %d\n\n",l,m); w=1; q=0; } else w=0; i++; } } t--; } if((q<1)&&(t<1)&&(d>0)){ c=2; ma=max-c; l=rand() %ma; m=rand() %ma; printf("2 %d %d\n\n",l,m); int w=1; while(w!=0){ for(int q=0;q<(c+2);q++){ if((matrice[l-1+q][m+1]||matrice[l-1+q][m-1])==1){ l=rand() %ma; m=rand() %ma; printf("2 for %d %d\n\n",l,m); w=1; q=0; } else w=0; } } d--; } h=0; while(h<c){ matrice[l][m]=1; l++; h++; } } for(i=0;i<max;i++){ for(j=0;j<max;j++){ if(matrice[i][j]==0)printf("~~");//printf("%d",matrice[i][j]); else printf("||"); } printf("\n"); } printf("\n"); ch=getch(); } while(ch!=13); return 0; } qualche screen: foto foto 2 P.S. codice senza commenti perché uguale al precedente solo che ho spostato 2 cosette precise che ho dichiarato sopra |
22-09-2013, 13.03.14 | #14 |
Forum supporter
Global Moderator
Registrato: 23-08-2007
Messaggi: 2.704
|
Rif: [c/c++] BATTAGLIA NAVALE
Pensavo a qualcosa di questo tipo:
In codeblocks me lo compila, ma mi dà subito errore... forse non ho applicato qualche cambiamento che hai fatto nel frattempo? |
22-09-2013, 13.40.44 | #15 |
Forum supporter
Global Moderator
Registrato: 23-08-2007
Messaggi: 2.704
|
Rif: [c/c++] BATTAGLIA NAVALE
Le due righe l=rand() %ma; e m=rand() %ma; possono dare un risultato superiore a 9 (che dovrebbe essere il massimo per il tuo array/matrice), da cui parte poi l'errore.
O sbaglio? |
Utenti attualmente attivi che stanno leggendo questa discussione: 1 (0 utenti e 1 ospiti) | |
Strumenti discussione | |
|
|
Discussioni simili | ||||
Discussione | Autore discussione | Forum | Risposte | Ultimo messaggio |
Problemi Battaglia navale 3d Microforum | mimmo77 | Masterizzazione Giochi Games | 6 | 27-12-2012 04.03.03 |
La grande battaglia dei super eroi! | Sbavi | Chiacchiere in libertà | 83 | 27-02-2009 11.43.39 |
battaglia navale in c# | Joy&Lu | Programmazione | 3 | 01-09-2008 16.08.58 |
[C/C++] Battaglia Navale in C | Alhazred | Programmazione | 549 | 21-06-2007 14.51.14 |
[C] Battaglia Navale (versione client server) in Linux | Nanri | Programmazione | 11 | 06-08-2005 15.50.27 |