Telefonino.net network
 
| 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 » |

Torna indietro   WinTricks Forum > Software > Programmazione

Notices

Rispondi
 
Strumenti discussione
Vecchio 20-09-2013, 18.39.32   #1
marek196c
Newbie
 
Registrato: 20-09-2013
Messaggi: 12
marek196c promette bene
[c/c++] BATTAGLIA NAVALE

Innanzitutto ciao a tutti, sono nuovo al forum e ho visto parecchi post riguardanti il mio problema ma non ho trovato niente in particolare, comunque il problema è che devo costruire innanzitutto una rappresentazione testuale di un campo di battaglia navale con 6 navi a random (1 da 4, 2 da 3 e 3 da 2),
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;
}
In anticipo grazie per aiuto e scusatemi mio italiano
P.S. uso dev c++ (4.9.9.2)
marek196c non è collegato   Rispondi citando
Vecchio 20-09-2013, 18.55.39   #2
Alhazred
Made in Japan
Top Poster
 
L'avatar di Alhazred
 
Registrato: 04-07-2001
Messaggi: 4.461
Alhazred promette bene
Rif: [c/c++] BATTAGLIA NAVALE

Prof. Quaglia?
Alhazred non è collegato   Rispondi citando
Vecchio 20-09-2013, 18.58.49   #3
marek196c
Newbie
 
Registrato: 20-09-2013
Messaggi: 12
marek196c promette bene
Rif: [c/c++] BATTAGLIA NAVALE

no raeli, è un **** me l'ha assegnato per domani senza spiegare niente figurati...
P.S. Sapresti aiutarmi?
marek196c non è collegato   Rispondi citando
Vecchio 20-09-2013, 21.43.06   #4
xilo76
Forum supporter
Global Moderator
 
Registrato: 23-08-2007
Messaggi: 2.704
xilo76 è conosciuto da tuttixilo76 è conosciuto da tuttixilo76 è conosciuto da tuttixilo76 è conosciuto da tutti
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
xilo76 non è collegato   Rispondi citando
Vecchio 20-09-2013, 21.45.55   #5
LoryOne
Gold Member
WT Expert
 
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.505
LoryOne è un gioiello raroLoryOne è un gioiello raroLoryOne è un gioiello raro
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
LoryOne non è collegato   Rispondi citando
Vecchio 21-09-2013, 14.36.21   #6
marek196c
Newbie
 
Registrato: 20-09-2013
Messaggi: 12
marek196c promette bene
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...
marek196c non è collegato   Rispondi citando
Vecchio 21-09-2013, 15.47.57   #7
marek196c
Newbie
 
Registrato: 20-09-2013
Messaggi: 12
marek196c promette bene
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
}
Ecco il codice con i commenti, penso abbastanza chiari.

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)
marek196c non è collegato   Rispondi citando
Vecchio 21-09-2013, 20.16.52   #8
LoryOne
Gold Member
WT Expert
 
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.505
LoryOne è un gioiello raroLoryOne è un gioiello raroLoryOne è un gioiello raro
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
LoryOne non è collegato   Rispondi citando
Vecchio 22-09-2013, 01.20.25   #9
retalv
Forum supporter
WT Expert
 
L'avatar di retalv
 
Registrato: 13-03-2005
Loc.: Ultima stella a destra
Messaggi: 2.809
retalv è un gioiello raroretalv è un gioiello raroretalv è un gioiello raroretalv è un gioiello raro
Rif: [c/c++] BATTAGLIA NAVALE

Quota:
Inviato da marek196c Visualizza messaggio
... e per il fatto di linguaggio c, nel c semplice se non sbaglio non ci sono i cicli (while for e do-while) ...
... e se xilo76 ti dava 4 io. visto che sei universitario, ti darei 10 ... trentesimi però... smetti di , un po' meno e comincia a , altrimenti ...


___________________________________

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
retalv non è collegato   Rispondi citando
Vecchio 22-09-2013, 11.31.10   #10
marek196c
Newbie
 
Registrato: 20-09-2013
Messaggi: 12
marek196c promette bene
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;
}
non avevano senso senza azzeramento della q perché il ciclo non rivedeva tutta la nave ma solo il pezzo rimasto della prima e quando generava altre coordinate per la nave perché ''toccava'' altra rivedeva solo il pezzo rimasto e non tutta. LoryOne comunque grazie per il codice postato dell'altro programma, ma preferirei farlo da me perché capirlo è un conto, farlo e saperlo è un'altro...
marek196c non è collegato   Rispondi citando
Vecchio 22-09-2013, 11.49.11   #11
LoryOne
Gold Member
WT Expert
 
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.505
LoryOne è un gioiello raroLoryOne è un gioiello raroLoryOne è un gioiello raro
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
LoryOne non è collegato   Rispondi citando
Vecchio 22-09-2013, 11.54.08   #12
marek196c
Newbie
 
Registrato: 20-09-2013
Messaggi: 12
marek196c promette bene
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
marek196c non è collegato   Rispondi citando
Vecchio 22-09-2013, 12.16.41   #13
marek196c
Newbie
 
Registrato: 20-09-2013
Messaggi: 12
marek196c promette bene
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;
}
il problema do-while eliminato, ma rimane sempre l'attacamento delle navi.
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
marek196c non è collegato   Rispondi citando
Vecchio 22-09-2013, 13.03.14   #14
xilo76
Forum supporter
Global Moderator
 
Registrato: 23-08-2007
Messaggi: 2.704
xilo76 è conosciuto da tuttixilo76 è conosciuto da tuttixilo76 è conosciuto da tuttixilo76 è conosciuto da tutti
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?
xilo76 non è collegato   Rispondi citando
Vecchio 22-09-2013, 13.40.44   #15
xilo76
Forum supporter
Global Moderator
 
Registrato: 23-08-2007
Messaggi: 2.704
xilo76 è conosciuto da tuttixilo76 è conosciuto da tuttixilo76 è conosciuto da tuttixilo76 è conosciuto da tutti
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?
xilo76 non è collegato   Rispondi citando
Rispondi


Utenti attualmente attivi che stanno leggendo questa discussione: 1 (0 utenti e 1 ospiti)
 
Strumenti discussione

Regole di scrittura
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is ON
Gli smilies sono ON
[IMG] è ON
Il codice HTML è OFF

Vai al forum

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

Orario GMT +2. Ora sono le: 13.11.19.


E' vietata la riproduzione, anche solo in parte, di contenuti e grafica.
Copyright © 1999-2017 Edizioni Master S.p.A. p.iva: 02105820787 • Tutti i diritti sono riservati
L'editore NON si assume nessuna responsabilità dei contenuti pubblicati sul forum in quanto redatti direttamente dagli utenti.
Questi ultimi sono responsabili dei contenuti da loro riportati nelle discussioni del forum
Powered by vBulletin - 2010 Copyright © Jelsoft Enterprises Limited.