Elenet.net
+3 voti
Come va modificato il programma per permettere l'inserimento di più navi, anche di dimensioni diverse?
correlata alla risposta per: Battaglia navale in linguaggio C
chiuso con la nota: ho risolto il mio problema
quesito posto 7 Marzo 2013 in Classe terza da Emanuele Rizzo Esperto (238 punti)
chiuso 13 Marzo 2013 da Emanuele Rizzo
  

1 Risposta

+1 voto
Risposta migliore

Ho modificato il programma affinchè il giocatore può inserire una nave da tre caselle, una nave da due caselle e una nave da una casella.

inoltre il programma adesso una volta inserite le navi cancella dallo schermo di gioco le coordinate delle navi inserite precedentemente.

#include <stdio.h>
#include <stdlib.h>

void stampaPosizione (int, int);
int stampaAffondata (char);
void inseriscinave(int,int,int);
void inseriscinavedue(int,int,int);
void inseriscinaveuno(int,int);
char campo [6] [6];
 
int a,b,verso,colpi;
int i;
int controlla;
int main ()
{
colpi=0;
int i,j;
controlla=0;
for(i=0;i<6;i++)
for(j=0;j<6;j++)
campo [i][j]='0';
 
int riga,col;
int pos[4];//pos 0: = alto ok   pos 1 := basso ok   pos 2 := destra ok   pos 3 :=  sinistra ok
 
 printf("inserisci riga per la nave da tre caselle");
 scanf("%d", &riga);
 printf("inserisci colonna per la nave da tre caselle");
 scanf("%d", &col);
 
 for(i = 0; i < 4; i++)
 pos[i]=0;
 
 if((riga-2)>=0)
  {
  pos[0]=1;
  printf("0: inserisci verso l'alto\n");}
 
  if((riga+2)<=5)
 { pos[1]=1;
   printf("1: inserisci verso il basso\n");
}
 
 if((col-2)>=0)
{
  pos[2]=1;
   printf("2: inserisci verso sinistra\n");
}
 
 if((col+2)<=5)
 {
  pos[3]=1;
   printf("3: inserisci verso destra\n");
  }
  scanf("%d",&verso);
  inseriscinave(riga,col,verso) ;
   printf("inserisci riga per la nave da due caselle");
 scanf("%d", &riga);
 printf("inserisci colonna per la nave da due caselle");
 scanf("%d", &col);
 for(i = 0; i < 4; i++)
 pos[i]=0;
 
 if((riga-1)>=0)
  {
  pos[0]=1;
  printf("0: inserisci verso l'alto\n");}
 
  if((riga+1)<=5)
 { pos[1]=1;
   printf("1: inserisci verso il basso\n");
}
 
 if((col-1)>=0)
{
  pos[2]=1;
   printf("2: inserisci verso sinistra\n");
}
 
 if((col+1)<=5)
 {
  pos[3]=1;
   printf("3: inserisci verso destra\n");
  }
  scanf("%d",&verso);
  inseriscinavedue(riga,col,verso) ;
 
 printf("inserisci riga per la nave da una casella");
 scanf("%d", &riga);
 printf("inserisci colonna per la nave da una casella");
 scanf("%d", &col);
 inseriscinaveuno(riga,col) ;
  //inserisci le navi
  //inseriscinave(riga,col,verso) ;
 system("cls");
  printf("nave inserita\n chiama il tuo amico per fargliela indovinare\n");
  while(1)
  { if(controlla==1)
  break;
 printf("inserisci riga");
 scanf("%d", &riga);
 
 printf("inserisci colonna");
 scanf("%d", &col);
 colpi=colpi+1;
 printf("hai sparato il tuo %d colpo\n\n", colpi);
 stampaPosizione(riga,col);
 //stampaAffondata('a');
 }
                                       
 system("PAUSE");         }
 
void inseriscinave(int riga,int colonna,int verso)
{ campo[riga][colonna]='a';
switch(verso)
{
case 0:
     campo[riga-1][colonna] ='a';
     campo[riga-2][colonna] ='a';
     break;
     case 1:
     campo[riga+1][colonna] ='a';
     campo[riga+2][colonna] ='a';
     break;
     case 2:
     campo[riga][colonna-1] ='a';
     campo[riga][colonna-2] ='a';
     break;
     case 3:
     campo[riga][colonna+1] ='a';
     campo[riga][colonna+2] ='a';
     break;
}
}
 
void stampaPosizione (int riga, int colonna)
{
int posizione;
char nave;
 
if (riga < 0 || riga > 5 ||
        colonna < 0 || colonna > 5)
{
printf ("le coordinate (%d, %d) non sono valide\n",
riga, colonna);
return;
}
 
if (campo [riga][colonna] == '0')
printf ("in (%d, %d) c'e' acqua\n", riga, colonna);
else if (campo [riga][colonna] == '*')
printf ("in (%d, %d) c'e' una nave gia' colpita\n",
riga, colonna);
else
{
nave = campo [riga][colonna];
printf ("in (%d, %d) c'e' la nave %c : COLPITA!!\n",
riga, colonna, nave);
campo [riga][colonna] = '*';
controlla=stampaAffondata (nave);
}
}
 
int stampaAffondata (char nave)
{
int a,b;
for (a = 0; a < 6; a ++)
       for (b = 0; b < 6; b ++)
if (campo [a][b] == nave)
{
printf ("nave %c non affondata\n", nave);
return 0;
}
 
            printf ("nave %c AFFONDATA !!!\n", nave);
        
for (a = 0; a < 6; a ++)
for (b = 0; b < 6; b ++)
 
if (campo [a][b]!= '0' && campo [a][b] != '*')
{
printf ("ci sono ancora altre navi\n");
return 0;
}
            printf ("PARTITA TERMINATA !!!\n");
            
  system("PAUSE");
  return 1;
                 }
 void inseriscinavedue(int riga,int colonna,int verso)
{ campo[riga][colonna]='b';
switch(verso)
{
case 0:
     campo[riga-1][colonna] ='b';
     
     break;
     case 1:
     campo[riga+1][colonna] ='b';
    
     break;
     case 2:
     campo[riga][colonna-1] ='b';
     
     break;
     case 3:
     campo[riga][colonna+1] ='b';
    
     break;
}
}                
   void inseriscinaveuno(int riga,int colonna)
{ campo[riga][colonna]='c';
}

risposta inviata 7 Marzo 2013 da Emanuele Rizzo Esperto (238 punti)
modificato 7 Marzo 2013 da Emanuele Rizzo
Il listato pur permettendo l'inserimento di più navi, non controlla eventuali collisioni con le navi già posizionate.
Si può fare di meglio!
Provvederò al più presto =)

Domande correlate

+2 voti
1 risposta
quesito posto 6 Marzo 2013 in Classe terza da Emanuele Rizzo Esperto (238 punti) | 9,919 visite
0 voti
11 risposte
+2 voti
3 risposte
777 domande
1,565 risposte
639 commenti
1,445 utenti