BATTAGLIA NAVALE

di il
7 risposte

BATTAGLIA NAVALE

Ciao, dovrei creare un programma, che con la funzione random pozizioni delle navi in una matrice[N][N]. le navi su tutti i lati devono essere distanziate almeno di uno spazio vuoto. il codice deve funzionare per ogni lungezza di nave, questo significa di una nave da 5 o da 3... la matrice deve essere di tipo bool, cosi le navi saranno 1 e il mare 0. max numero di navi (nave da 5-max 2,nave da 4-max 3,nave da 3-max 4, nave da 2-max 5, nave da 1-max 6).
grazie in avanti per l'aiuto.

7 Risposte

  • Re: BATTAGLIA NAVALE

    E quindi? mi devo fare il gioco,giocarci e farti la linguaccia perchè io ci riesco e tu no?
    Forse ti sei dimenticato che nei forum esistono dei regolamenti,forse sarebbe il caso che tu li leggessi.
  • Re: BATTAGLIA NAVALE

    Grazie mille per l'aiuto, comunque il programma funziona, però ognitanto perde qualche nave da due e da uno. mi arrangero e cerchero di non chidere mai più nulla a dei irrispettosi come qualcuno di voi.
  • Re: BATTAGLIA NAVALE

    Irrispettoso è chi non si attiene alle regole.
    e tu non ti sei attenuto al regolamento.
    grazie mille per l'aiuto, comunque il programma funziona, però ognitanto perde qualche nave da due e da uno
    se perde delle navi allora non funziona!
    o funziona oppure no!

    Dato che a quanto pare hai del codice,e il codice che hai scritto presenta dei problemi,perchè non fai come da regolamente e scrivi:
    Il mio codice di battaglia navale perde ste due navi in queste situazioni,questo è il mio codice....[ code] ... [ / code ]

    E vedrai che saremo tutti piu cordiali.
  • Re: BATTAGLIA NAVALE

    Ecco il codice del programma:
    
    #include <cstdlib>
    #include <iostream>
    #include <time.h>
    #define N 10
    using namespace std;
    bool matrice[N][N],vero;
    int vettore[5],i,j,x,y,direzione;
    /////////////////////////////////////////////////////////////////////////
    void pozbarche(int num/*5*/)
    {
            x=rand()%N;
            y=rand()%N;
            direzione=rand()%4+1
              if(matrice[x][y]==false)      
              {
                   switch (direzione)
                   {
                        ciao:
                        /*START CASE 1*/
                          case 1:
                               vero=true;
                               if(matrice[x-1][y]==false)
                               {
                                   for (j=2;j<num;j++)
                                   {
                                         if (matrice[x-j][y]==false)
                                         {}               
                                         else
                                         { 
                                             vero=false;  
                                             break;
                                         }    
                                   }
                                   for (j=0;j<num;j++)
                                   {
                                        if(matrice[x-j][y-1]==false and matrice[x-j][y+1]==false)
                                        {}
                                        else
                                        {
                                            vero=false;
                                        }
                                   }
                                   if (matrice[x+1][y]==false and matrice[x-num][y]==false)
                                   {}
                                   else
                                   {
                                        vero = false;
                                   }
                                   
                                   if (x-num+1>=0)
                                   {}
                                   else
                                   {
                                        vero=false;
                                   }
                                   
                                   if (vero==true)
                                   {
                                        for(j=0;j<num;j++)
                                        {
                                            matrice[x-j][y]=true;            
                                        }                
                                   }   
                               }
                               if(vero==true)
                               {
                                    break;
                               }
                               else
                               {
                                    if(direzione==2)
                                    {
                                        break;
                                    }
                               }
                               break;
                          /*END CASE 1*/
                          /*START CASE 2*/
                          case 2:
                               vero=true;
                               if(matrice[x][y+1]==false)
                               {
                                   for (j=2;j<num;j++)
                                   {
                                         if (matrice[x][y+j]==false)
                                         {}               
                                         else
                                         { 
                                             vero=false;  
                                             
                                             break;
                                         }    
                                   }
                                   for (j=0;j<num;j++)
                                   {
                                        if(matrice[x-1][y+j]==false and matrice[x+1][y+j]==false)
                                        {}
                                        else
                                        {
                                            vero=false;
                                            break;
                                        }
                                   }
                                   if (matrice[x][y-1]==false and matrice[x][y+num]==false)
                                   {}
                                   else
                                   {
                                        vero = false;
                                   }
                                   
                                   if (y+num-1<=N-1)
                                   {}
                                   else
                                   {
                                        vero=false;
                                   }
                                   
                                   if (vero==true)
                                   {
                                        for(j=0;j<num;j++)
                                        {
                                            matrice[x][y+j]=true;            
                                        }                
                                   }
                                   else
                                   {
                                   
                                   }
                                       
                               }
                               else
                               {
                                   
                                   
                               }
                               if(vero==true)
                               {break;}
                               else
                               {
                                    if(direzione==3)
                                    {
                                        break;
                                    }
                               }
                          break;
                     /*END CASE 2*/
                     /*START CASE 3*/
                          case 3:
                               vero=true;
                               if(matrice[x+1][y]==false)
                               {
                                   for (j=2;j<num;j++)
                                   {
                                         if (matrice[x+j][y]==false)
                                         {}               
                                         else
                                         { 
                                             vero=false;  
                                             
                                             break;
                                         }
                                    }                                   
                                   for (j=0;j<num;j++)
                                   {
                                        if(matrice[x+j][y-1]==false and matrice[x+j][y+1]==false)
                                        {}
                                        else
                                        {
                                            vero=false;
                                        }
                                   }
                                   if (matrice[x-1][y]==false and matrice[x+num][y]==false)
                                   {}
                                   else
                                   {
                                        vero = false;
                                   }
                                   
                                   if (x+num-1<=N-1)
                                   {}
                                   else
                                   {
                                        vero=false;
                                   }
                                   
                                   if (vero==true)
                                   {
                                        for(j=0;j<num;j++)
                                        {
                                            matrice[x+j][y]=true;            
                                        }                
                                   }
                                   else
                                   {
                                        
                                   }   
                               }
                               
                               else
                               {
                                  
                                   
                               }
                               if(vero==true)
                               {break;}
                               else
                               {
                                    if(direzione==4)
                                    {
                                        break;
                                    }
                               }
                               break;
                          /*END CASE 3*/
                          /*START CASE 4*/
                          case 4:
                               vero=true;
                               if(matrice[x][y-1]==false)
                               {
                                   for (j=2;j<num;j++)
                                   {
                                         if (matrice[x][y-j]==false)
                                         {}               
                                         else
                                         { 
                                             vero=false;  
                                             
                                             break;
                                         }    
                                   }
                                   for (j=0;j<num;j++)
                                   {
                                        if(matrice[x-1][y-j]==false and matrice[x+1][y-j]==false)
                                        {}
                                        else
                                        {
                                            vero=false;
                                            break;
                                        }
                                   }
                                   if (matrice[x][y+1]==false and matrice[x][y-num]==false)
                                   {}
                                   else
                                   {
                                        vero = false;
                                   }
                                   
                                   if (y-num+1>=0)
                                   {}
                                   else
                                   {
                                        vero=false;
                                   }
                                   
                                   if (vero==true)
                                   {
                                        for(j=0;j<num;j++)
                                        {
                                            matrice[x][y-j]=true;            
                                        }                
                                   }
                                   else
                                   {
                                   
                                   }
                                       
                               }
                               else
                               {
                                   
                                   
                               }
                               if(vero==true)
                               {break;}
                               else
                               {
                                    if(direzione==1)
                                    {
                                       break;
                                    }
                                    else
                                    {
                                       goto ciao; 
                                    }
                               }
                          break;
                     /*END CASE 4*/
                     vero=false;
                     break;
                   }
                   
              }
              else
              {
                    vero=false;
              }           
    }
    /////////////////////////////////////////////////////////////////////////
    
    int main()
    {
        srand (time(NULL));
        for(i=5;i>=1;i--)
        {
            cout<<"INSERISCI QUANTE NAVI DA "<<i<<" VUOI INSERIRE: ";
            cin>>vettore[i];
        }
        for(i=5;i>=1;i--)
        {
            j=1;
            do
            {
                pozbarche(i);
                j++;
            }
            while(j<=vettore[i]);
        } 
        for(i=0;i<N;i++)
        {
            for(j=0;j<N;j++)                           
            {            
                    cout<<matrice[i][j];
            }    
            cout<<endl;
        }
        system("pause");
        system("cls");
    }
    
  • Re: BATTAGLIA NAVALE

    Ecco qui, pozbarche ho visto che era un po' incasinato e l'ho rifatto, spero non ti offenda,

    un suggerimento:

    se un vettore è di lunghezza 5 --> vettore[5] non puoi fare un for così:
    
    for(int i = 5; i <= 1; i--)
    {
        ... bla bla bla ...
    }
    
    perchè vai fuori dalla sua lunghezza, la "i" inizia da 5, ma il vettore è così:
    
    ind 0   ind 1     ind 2   ind 3   ind 4
    [bla]   [blà]     [blù]   [blo]   [ble]
    
    quindi vai fuori, ricorda che gli indici iniziano da 0
    
    #include <cstdlib>
    #include <iostream>
    #include <time.h>
    
    using namespace std;
    
    #define N 10
    int matrice[N][N];
    int vettore[5];
    
    
    bool ControllaSeIlPostoBarcaVaBene(int num, int x, int y, bool dir)
    {
    	if(!dir)//verticale
    	{
    		if(y + num > N)
    			return 0;
    
    		for(int k = y; k < num + y; k++)
    			if(matrice[x][k] == 1)
    				return 0;
    
    		return 1;
    	}
    	else//orizzontale
    	{
    		if(x + num > N)
    			return 0;
    
    		for(int k = x; k < num + x; k++)
    			if(matrice[k][y] == 1)
    				return 0;
    
    		return 1;
    	}
    }
    
    void PosizionaInVerticale(int num)
    {
    	int x,y;
    
    	//continuo a cambiare (x,y) finchè non ho trovato un posto che vada bene ;)
    	do
    	{
    		x=rand()%N;
    		y=rand()%N;
    	}
    	while(!ControllaSeIlPostoBarcaVaBene(num, x,y, 0));
    
    	//Inserisco la barca nella posizione che ho trovato
    	for(int k = y; k < num + y; k++)
    		matrice[x][k] = num;
    }
    
    void PosizionaInOrizzontale(int num)
    {
    	int x,y;
    
    	//continuo a cambiare (x,y) finchè non ho trovato un posto che vada bene ;)
    	do
    	{
    		x=rand()%N;
    		y=rand()%N;
    	}
    	while(!ControllaSeIlPostoBarcaVaBene(num, x,y, 1));
    
    
    	//Inserisco la barca nella posizione che ho trovato
    	for(int k = x; k < num + x; k++)
    		matrice[k][y] = num;
    }
    
    void pozbarche(int num)
    {
    	
    	
    	//le direzioni sono due, non conta il verso, che si può ottenere cambiando la x o la y.
    	//rand()%2 restituisce 0 oppure 1
    	int direzione=rand()%2;
        
    
    	if(direzione == 0)
    	{
    		PosizionaInVerticale(num);
    	}
    	else
    	{
    		PosizionaInOrizzontale(num);
    	}
    }
    
    
    int main()
    {
        srand(time(0));
        
    	for(int i=4; i>=0; i--)
        {
            cout<<"INSERISCI QUANTE NAVI DA "<<i + 1<<" VUOI INSERIRE: ";
            cin>>vettore[i];
        }
    
    
        for(int i=4; i>=0; i--)
        {
    		for(int k = 0; k < vettore[i]; k++)
    		{
    			pozbarche(i + 1);
    		}
        }
        
    	for(int i=0;i<N;i++)
        {
            for(int j=0;j<N;j++)                           
            {           
                cout<<matrice[i][j];
            }   
            cout<<endl;
        }
    
        system("pause");
    }
    
  • Re: BATTAGLIA NAVALE

    Grazie mille. posso chiederti ancora un favore. appena adesso mi sono accorto che il tuo programma poziziona le navi una di fianco all'altra, invece il programma dovrebbe pozizionarle ad uno spazio di distanza (in ogni direzione la nave dovrebbe essere almeno di uno spazio di distanza l'una dall'altra), e nel tuo programma non saprei come modificarlo in modo che facesse questo, puoi aiutarmi per favore?
  • Re: BATTAGLIA NAVALE

    Non ho controllato ma dovrebbe funzionare :):) la dimensione del campo deve essere grande abbastanza per tutte le barche se no c'è il rischio che cerchi il posto per la barca all'infinito perchè tutti non gli vanno bene...

    l'unica modifica che devi fare è su questa funzione:
    bool ControllaSeIlPostoBarcaVaBene(int num, int x, int y, bool dir)
    {
    	if(!dir)//verticale
    	{
    		if(y + num > N)
    			return 0;
    
    		//controllo il posto barca
    		for(int k = y; k < num + y; k++)
    			if(matrice[x][k] == 1)
    				return 0;
    
    		//se posso controllo a sinistra della barca
    		if(x > 0)
    		{
    			for(int k = y; k < num + y; k++)
    				if(matrice[x-1][k] == 1)
    					return 0;
    		}
    
    		//se posso controllo a destra della barca
    		if(x < N-1)
    		{
    			for(int k = y; k < num + y; k++)
    				if(matrice[x+1][k] == 1)
    					return 0;
    		}
    
    		//adesso controllo sopra
    		if(y > 0)
    		{
    			if(matrice[x][y-1] == 1)
    						return 0;
    
    			//se posso controllo sopra a sinistra
    			if(x > 0)
    			{
    				if(matrice[x-1][y-1] == 1)
    						return 0;
    			}
    
    			//se posso controllo sopra a destra della barca
    			if(x < N-1)
    			{
    				if(matrice[x+1][y-1] == 1)
    						return 0;
    			}
    		}
    
    		//adesso controllo sotto
    		if(y + num < N)
    		{
    			if(matrice[x][y + num] == 1)
    					return 0;
    
    			//se posso controllo sopra a sinistra della barca
    			if(x > 0)
    			{
    				if(matrice[x-1][y + num] == 1)
    					return 0;
    			}
    
    			//se posso controllo sopra a destra della barca
    			if(x < N-1)
    			{
    				if(matrice[x+1][y + num] == 1)
    					return 0;
    			}
    		}
    
    		return 1;
    	}
    	else//orizzontale
    	{
    		if(x + num > N)
    			return 0;
    
    		//controllo il posto barca
    		for(int k = x; k < num + x; k++)
    			if(matrice[k][y] == 1)
    				return 0;
    
    
    		//se posso controllo sopra la barca
    		if(y > 0)
    		{
    			for(int k = x; k < num + x; k++)
    				if(matrice[k][y - 1] == 1)
    					return 0;
    		}
    
    		//se posso controllo sotto la barca
    		if(y < N-1)
    		{
    			for(int k = x; k < num + x; k++)
    				if(matrice[k][y + 1] == 1)
    					return 0;
    		}
    
    		//adesso controllo a sinistra
    		if(x > 0)
    		{
    			if(matrice[x-1][y] == 1)
    						return 0;
    
    			//se posso controllo sopra a sinistra
    			if(y > 0)
    			{
    				if(matrice[x-1][y-1] == 1)
    						return 0;
    			}
    
    			//se posso controllo sotto a sinistra
    			if(y < N-1)
    			{
    				if(matrice[x-1][y+1] == 1)
    						return 0;
    			}
    		}
    
    		//adesso controllo sotto
    		if(x + num < N)
    		{
    			if(matrice[x + num][y] == 1)
    					return 0;
    
    			//se posso controllo sopra a sinistra della barca
    			if(y > 0)
    			{
    				if(matrice[x + num][y -1] == 1)
    					return 0;
    			}
    
    			//se posso controllo sopra a destra della barca
    			if(y < N-1)
    			{
    				if(matrice[x + num][y + +] == 1)
    					return 0;
    			}
    		}
    
    
    		return 1;
    	}
    }

    Dato che questo è un forum spero che questo aiuto ti abbia fatto imparare ancoa di più,
    mi raccomando che chiedere va bene se poi capisci le cose e le fai tue, non
    serve a niente chiedere ad altri se ti fanno un esercizio magari come compito a casa,
    se poi non impari ;D è quello che cercava di dirti "vbextreme" penso

    ciaoo spero non sia troppo tardi per la risposta :):)
Devi accedere o registrarti per scrivere nel forum
7 risposte