Car Speed Gioco in C mi aiutate per un particolare?

di Anonimizzato16454 il
44 risposte

44 Risposte - Pagina 3

  • Devo riguardarlo meglio, ma l'errore potrebbe essere qui:
    if(i==0 || i==dim1-1)
               spazio[i][j]=A;
               else
                 spazio[i][j]=B;
             if(j==0 || j==dim2-1)
               spazio[i][j]=A;
             else
               spazio[i][j]=B;
    Perché quei due blocchi if-else si possono sovrascrivere l'un l'altro (in particolare il 2° può sovrascrivere quello che ha scritto il primo).

    Prova a sostituire quella parte con un if-else if-else, oppure meglio ancora con un'unico if-else.

    ciao
  • 
    for(i=0; i <dim1; i++)
    {
          for(j=0; j<dim2; j++)
          {
               if(i==0 || i==dim1-1)
    	   {
                   spazio[i][j]=A;
               }
               else
               {
                   spazio[i][j]=B;
               }
               if(j==0 || j==dim2-1)
    	   {
                    spazio[i][j]=A;
               }
               else
               {
                    spazio[i][j]=B; 
               }
        }
        printf("\n");
    }
    
    ANCHE COSI MI STAMPA SOLO UNA COLONNA
  • Ma dove sta la visualizzazione nel codice che hai proposto?

    p.s. non scrivere in maiuscolo ...
  • Nella funzione creazione_campo
  • In quella funzione questa riga

    printf("%c ",&spazio[j]);

    ti sembra corretta?
  • No perdona non l' ho corretta nel treed, ma comunque è printf("%c ",spazio[j])
  • Finché non mostri codice corretto come si fa a rispondere?

    Come ti avevo suggerito, fai una sola domanda per thread (non treed ...) e chiudi con quella domanda mostrando sempre il codice aggiornato.

    Se si chiacchera per pagine e pagine con codice modificato, alterato, rimodificato, con mille problemi, non arrivi da nessuna parte.
  • 
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #define LATOMAX 20
    #define MAX_PASSI 100
    
    void creazione_campo(int,int,int);
    void credits();
    void rules();
    
    char spazio[100][100];
    int main()
    {
        int riga,colonna,vite=1,na_1,na_2,passi=0,logical=1,i,j;
        register char direzione;
        int dim1,dim2;
        
        // definisco la matrice di gioco
    	char A='*';
    	char B=' ';
    	do
        {
     
            printf("Inserisci la lunghezza del campo di gioco (min %d):\t",LATOMAX);
            scanf("%d",&dim1);
            printf("Inserisci la larghezza del campo da gioco ( min %d):\t",LATOMAX);
            scanf("%d",&dim2);
        }
        while(dim1 < LATOMAX && dim2 < LATOMAX);
    
    	for(i=0; i <dim1; i++)
      	{
         	for(j=0; j<dim2; j++)
       		{
          		if(i==0 || i==dim1-1)
    			{
    			   spazio[i][j]=A;
         		}
    			else
    			{
         		  spazio[i][j]=B;
    			}
    			if(j==0 || j==dim2-1)
    			{
    			  spazio[i][j]=A;
    			}
    			else
    			{
    			  spazio[i][j]=B; 
    			}
       		}
       		printf("\n");
    	}
        system("cls");
        credits();
        system("pause");
        system("cls");
        rules();
        printf("\n");
        system("pause");
        system("cls");
    Start:
        srand(time(NULL));
        riga=37;
        
    	do
        {
            colonna=2+rand()%37;
        }
    
        while (spazio[riga][colonna]=='V');
        
        spazio[riga][colonna]='V';
        na_1=1+rand()%8;
        na_2=1+rand()%28;
        spazio[na_1][na_2]='X';
        while (logical==1)
        {
            
    		if((passi == MAX_PASSI)&&(vite == 1)) // Controllo se i passi sono ugalu a quelli programmati da fare prima di superare il gioco tenedo conto dello stato della vita
    	    {
         	    printf("\a\n\t----------------------------------------------------\n");
    		    printf(" 			!!! PLAYER WIN THE GAME !!!	\n");
    		    printf("\n\t----------------------------------------------------\n");
    		    logical = 0;
    		    system("PAUSE");
       		}
         	//Controllo sul numero delle vite e dei passi. Se pari a zero e i passi sono minori di quelli programmati la partita termina
         	if((passi <= MAX_PASSI)&&(vite==0))
         	{
          	    printf("La tua auto e' distrutta!\n\n");
              	logical=0;
       		}//Controllo sul numero delle vite. Se pari a zero la partita termina
            
            system("cls");
            
    		j=1+rand()%28;
            spazio[1][j]='O';
            
            creazione_campo(dim1,dim2,vite); //richiamo la funzione crea_spazio
            fflush(stdin);
            direzione=getchar();
            //Switch-case che determina il movimento della navicella nel campo dei meteoriti. All'interno di ogni case ci sono dei controlli
           
    		    switch (direzione)
            	{
                case 'a':
                case 'A':
    	            
    				passi+=1;
                    spazio[riga][colonna]=' ';
                    colonna--;
                    if (spazio[riga][colonna]=='*')
                    {
                        printf("Non puoi spostarti in questa direzione!\n");
                        system("pause");
                        colonna++;
                    }
                    if (spazio[riga][colonna]=='O')
                    {
                        printf("Hai colpito un ostacolo! Hai perso!\n");
                        vite--;
                        system("pause");
                    }
                    spazio[riga][colonna]='V';
                    
    				break;
                case 'd':
                case 'D':
    			    
    			    passi+=1;
                    spazio[riga][colonna]=' ';
                    colonna++;
                    if (spazio[riga][colonna]=='*')
                    {
                        printf("Non puoi spostarti in questa direzione!\n");
                        colonna--;
                        system("pause");
                    }
                    if (spazio[riga][colonna]=='O')
                    {
                        printf("Hai colpito un ostacolo! Hai perso!\n");
                        vite--;
                        system("pause");
                    }
                    spazio[riga][colonna]='V';
                    break;
               }
            //Questa porzione di codice ha il compito di generare degli ostacoli che si sposteranno lungo il percorso ad ogni iterazione
            for(i=38; i>=0; i--)
            {
                for(j=28; j>=0; j--)
                {
                    if(spazio[i][j]=='O')
                    {
                        if(i!=38 && spazio[i+1][j]!='X')
                        {
                            spazio[i][j]=' ';
                            if (spazio[i+1][j]=='V' && vite!=0)
                            {
                                printf("BOOM!! Hai colpito un ostacolo che ha danneggiato l'auto! Hai perso!\n");
                                printf("--------------------------------------------------------------------\n\n\n");
                                vite--;
                                system("pause");
                            }
                            else
                            {
                                spazio[i+1][j]='O';
                            }
                        }
                        else
                        {
                            spazio[i][j]=' ';
                        }
                    }
                }
            }
        }
        system("cls");
    }
    void creazione_campo(int vite, int dim1, int dim2)
    {
        register int i,j;
        printf("\n");
        for (i=0; i<dim1; i++)
        {
            for (j=0; j<dim2; j++)
            {
                if (spazio[i][j]=='*' || spazio[i][j]=='O' || spazio[i][j]=='X' || spazio[i][j]=='V')
                {
                    printf("%c ",spazio[i][j]);
                }
                else
                {
                    printf("  ");
                }
            }
            printf("\n");
        }
    }
    
    Il mio problema sta nel fatto che non viene creata la matrice bordata dagli asterischi, in stampa infatti viene creata una sola colonna
  • La funzione creazione_campo ha questa intestazione

    void creazione_campo(int vite, int dim1, int dim2)

    e quando la chiami nel codice lo fai così

    creazione_campo(dim1,dim2,vite);


    Ti sembra corretto? Ma perché non ricontrolli con attenzione i punti in cui incontri problemi?
    Sembra che tu non faccia alcun controllo e continui a scrivere nel forum alla ricerca di una soluzione da parte degli altri ... eppure, almeno questo problema, è così evidente ...
  • Non funziona perché non hai modificato niente (mi riferisco a questa parte:
    
    if(i==0 || i==dim1-1)
             {
                spazio[i][j]=A;
               }
             else
             {
                 spazio[i][j]=B;
             }
             if(j==0 || j==dim2-1)
             {
               spazio[i][j]=A;
             }
             else
             {
               spazio[i][j]=B;
             }
    Come ho scritto stamattina non devi fare 2 if-else uno di seguito all'altro, altrimenti col secondo sovrascrivi il primo (in particolare non riesci a stampare le due righe di * orizzontali, perché il secondo if ti crea i bordi verticali ma cancella tutto quello che c'è in mezzo, quindi anche i bordi orizzontali ad eccezione degli estremi).
    Rileggi quel messaggio e correggi il codice. Fatto ciò vediamo se ci sono altri errori.
  • Ciao ragazzi scusatemi ancora per il disturbo, ho cambiato leggermente il codice e ora non mi viene visualizzata la navicella designata da V e le colonne vengono visualizzate a tratti cioè
    *


    *


    *

    eccovi il codice, fatemi sapere le vostre osservaazioni:
    MAIN
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #define LATOMAX 20
    #include "Gioco.h"
    
    int main()
    {
        int riga,colonna,vite=1,na_1,na_2,passi=0,logical=1,i,j;
        register char direzione;
        int dim1,dim2;
        
        // definisco la matrice di gioco
    	char E='*';
    	do
        {
     
            printf("Inserisci la lunghezza del campo di gioco (min %d):\t",LATOMAX);
            scanf("%d",&dim1);
            printf("Inserisci la larghezza del campo da gioco ( min %d):\t",LATOMAX);
            scanf("%d",&dim2);
        }
        while(dim1 < LATOMAX && dim2 < LATOMAX);
      	
      	char spazio[MAX_PASSI][MAX_PASSI];
      	
    	spazio[dim1][dim2];
      	
    	for(i=0; i <dim1; i++)
      	{
         	for(j=0; j<dim2; j++)
       		{
          		if(i==0 || i==dim1-1) spazio[i][j]=E;
         		if(j==0 || j==dim2-1 ) spazio[i][j]=E;
       		}
    	}
        system("cls");
        credits();
        system("pause");
        system("cls");
        rules();
        printf("\n");
        system("pause");
        system("cls");
    Start:
        srand(time(NULL));
        riga=37;
        
    	do
        {
            colonna=2+rand()%(dim2-3);
        }
    
        while (spazio[riga][colonna]=='V');
        
        spazio[riga][colonna]='V';
        na_1=1+rand()%8;
        na_2=1+rand()%(dim2-12);
        spazio[na_1][na_2]='X';
        while (logical==1)
        {
            
    		if((passi == MAX_PASSI)&&(vite == 1)) // Controllo se i passi sono ugalu a quelli programmati da fare prima di superare il gioco tenedo conto dello stato della vita
    	    {
         	    printf("\a\n\t----------------------------------------------------\n");
    		    printf(" 			!!! PLAYER WIN THE GAME !!!	\n");
    		    printf("\n\t----------------------------------------------------\n");
    		    logical = 0;
    		    system("PAUSE");
       		}
         	//Controllo sul numero delle vite e dei passi. Se pari a zero e i passi sono minori di quelli programmati la partita termina
         	if((passi <= MAX_PASSI)&&(vite==0))
         	{
          	    printf("La tua auto e' distrutta!\n\n");
              	logical=0;
       		}//Controllo sul numero delle vite. Se pari a zero la partita termina
            
            system("cls");
            
    		j=1+rand()%(dim2-3);
            spazio[1][j]='O';
            
            char *pa=&spazio[0][0];
            creazione_campo(pa,dim1,dim2,vite); //richiamo la funzione crea_spazio
            fflush(stdin);
            direzione=getchar();
            //Switch-case che determina il movimento della navicella nel campo dei meteoriti. All'interno di ogni case ci sono dei controlli
           
    		    switch (direzione)
            	{
                case 'a':
                case 'A':
    	            
    				passi+=1;
                    spazio[riga][colonna]=' ';
                    colonna--;
                    if (spazio[riga][colonna]=='*')
                    {
                        printf("Non puoi spostarti in questa direzione!\n");
                        system("pause");
                        colonna++;
                    }
                    if (spazio[riga][colonna]=='O')
                    {
                        printf("Hai colpito un ostacolo! Hai perso!\n");
                        vite--;
                        system("pause");
                    }
                    spazio[riga][colonna]='V';
                    
    				break;
                case 'd':
                case 'D':
    			    
    			    passi+=1;
                    spazio[riga][colonna]=' ';
                    colonna++;
                    if (spazio[riga][colonna]=='*')
                    {
                        printf("Non puoi spostarti in questa direzione!\n");
                        colonna--;
                        system("pause");
                    }
                    if (spazio[riga][colonna]=='O')
                    {
                        printf("Hai colpito un ostacolo! Hai perso!\n");
                        vite--;
                        system("pause");
                    }
                    spazio[riga][colonna]='V';
                    break;
               }
            //Questa porzione di codice ha il compito di generare degli ostacoli che si sposteranno lungo il percorso ad ogni iterazione
            for(i=38; i>=0; i--)
            {
                for(j=28; j>=0; j--)
                {
                    if(spazio[i][j]=='O')
                    {
                        if(i!=38 && spazio[i+1][j]!='X')
                        {
                            spazio[i][j]=' ';
                            if (spazio[i+1][j]=='V' && vite!=0)
                            {
                                printf("BOOM!! Hai colpito un ostacolo che ha danneggiato l'auto! Hai perso!\n");
                                printf("--------------------------------------------------------------------\n\n\n");
                                vite--;
                                system("pause");
                            }
                            else
                            {
                                spazio[i+1][j]='O';
                            }
                        }
                        else
                        {
                            spazio[i][j]=' ';
                        }
                    }
                }
            }
        }
        system("cls");
    }
     
    
    Function
    
    #include "Gioco.h"
    
    //Semplice function per la stampa di una matrice che rappresenta "lo spazio" dove l'astronave si muove
    void creazione_campo(char *pa, int dim1, int dim2, int vite)
    {
        register int i,j;
        printf("\n");
        for (i=0; i<dim1; i++)
        {
            for (j=0; j<dim2; j++)
            {
                if (*(pa+dim2*i+j)=='*' || *(pa+dim2*i+j)=='O' || *(pa+dim2*i+j)=='X' || *(pa+dim2*i+j)=='V')
                {
                    printf("%c ",*(pa+dim2*i+j));
                }
                else
                {
                    printf("  ");
                }    
            }
            printf("\n");
        }
        printf("\n");
    }
    
    gioco.h
    
    
    #define MAX_PASSI 100
    
    void creazione_campo(char *,int,int,int);
    void credits();
    void rules();
    
  • Ciao ragazzi ho risolto da solo il problem, ora però qui sono proprio imbambolato perchè non so come risolvere la situazione, allora siccome il testo del problema recita: L’oggetto ( la navicella penso ) si muove di una o due posizioni casuali. Ad ogni turno l’auto viene spostata automaticamente a destra o a sinistra nel caso un ostacolo si trovi nel suo intorno vi propongo come sto cercando di risolvere questa parte
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #define LATOMIN 20
    #define MAX_PASSI 10
    #define MAX_SPAZIO 50
    
    void creazione_campo(int,int,int);
    void credits();
    void rules();
    
    char S='*';
    char E=' ';
    char spazio[MAX_SPAZIO][MAX_SPAZIO];
    int main()
    {
        int riga,colonna,vite=1,na_1,na_2,passi=0,logical=1,i,j;
        register char direzione;
        int dim1,dim2;
        
        // definisco la matrice di gioco
    
    	do
        {
     
            printf("Inserisci la lunghezza del campo di gioco (min %d):\t",LATOMIN);
            scanf("%d",&dim1);
            printf("Inserisci la larghezza del campo da gioco ( min %d):\t",LATOMIN);
            scanf("%d",&dim2);
        }
        while(dim1 < LATOMIN && dim2 < LATOMIN);
    
    	for(i=0; i <dim1; i++)
      	{
         	for(j=0; j<dim2; j++)
       		{
          		if(i==0 || i==dim1-1)
    			{
    			   spazio[i][j]=S;
         		}
    			else
    			{
         		  spazio[i][j]=E;
    			}
    			if(j==0 || j==dim2-1)
    			{
    			  spazio[i][j]=S;
    			}
    			else
    			{
    			  spazio[i][j]=E; 
    			}
       		}
       		printf("\n");
    	}
        system("cls");
        credits();
        system("pause");
        system("cls");
        rules();
        printf("\n");
        system("pause");
        system("cls");
    Start:
        srand(time(NULL));
        riga=dim1-2;
        
    	do
        {
            colonna=2+rand()%dim2-2;
        }
    
        while (spazio[riga][colonna]=='V');
        
        spazio[riga][colonna]='V';
        na_1=1+rand()%8;
        na_2=1+rand()%colonna-10;
        spazio[na_1][na_2]='X';
        while (logical==1)
        {
            
    		if((passi == MAX_PASSI)&&(vite == 1)) // Controllo se i passi sono ugalu a quelli programmati da fare prima di superare il gioco tenedo conto dello stato della vita
    	    {
         	    printf("\a\n\t----------------------------------------------------\n");
    		    printf(" 			!!! PLAYER WIN THE GAME !!!	\n");
    		    printf("\n\t----------------------------------------------------\n");
    		    logical = 0;
    		    system("PAUSE");
       		}
         	//Controllo sul numero delle vite e dei passi. Se pari a zero e i passi sono minori di quelli programmati la partita termina
         	if((passi <= MAX_PASSI)&&(vite==0))
         	{
          	    printf("La tua auto e' distrutta!\n\n");
              	logical=0;
       		}//Controllo sul numero delle vite. Se pari a zero la partita termina
            
            system("cls");
            
    		j=1+rand()%dim2;
            spazio[1][j]='O';
                  
    			int decisione=0+rand()%1;
            	creazione_campo(dim1,dim2,vite); //richiamo la funzione crea_spazio
    			if(spazio[riga-4][colonna]=='O' && spazio[riga][colonna]=='V') // riga-4 è la posizione con cui vado a confrontare la posizione dell' ostacolo
    			{
    				if(decisione==0) // sinistra
    				{
    					passi+=1;
                    	spazio[riga][colonna]=E;
                    	colonna--;
                    	if (spazio[riga][colonna]==S)
                    	{
    						colonna++;
    					}
    					spazio[riga][colonna]='V';
    				}
    				if(decisione==1)  // destra
    				{
    					passi+=1;
                    	spazio[riga][colonna]=E;
                    	colonna++;
                    	if (spazio[riga][colonna]==S)
                    	{
    						colonna--;
    					}
    					spazio[riga][colonna]='V';
    				}				
    			}
    			else
    			{
    				passi+=1;
    				spazio[riga][colonna]='V';
    			}
    			system("PAUSE");
    		}
    //        direzione=getchar();
    //        //Switch-case che determina il movimento della navicella nel campo dei meteoriti. All'interno di ogni case ci sono dei controlli
    //		fflush(stdin);
    //       
    //		    switch (direzione)
    //        	{
    //            case 'a':
    //            case 'A':
    //	            
    //				passi+=1;
    //                spazio[riga][colonna]=E;
    //                colonna--;
    //                if (spazio[riga][colonna]==S)
    //                {
    //                    printf("Non puoi spostarti in questa direzione!\n");
    //                    system("pause");
    //                    colonna++;
    //                spazio[riga][colonna]='V';
    //                }
    //                
    //				break;
    //            case 'd':
    //            case 'D':
    //			    
    //			    passi+=1;
    //                spazio[riga][colonna]=E;
    //                colonna++;
    //                if (spazio[riga][colonna]==S)
    //                {
    //                    printf("Non puoi spostarti in questa direzione!\n");
    //                    colonna--;
    //                    system("pause");
    //                }
    //	            spazio[riga][colonna]='V';
    //                break;
    //                
    //                default:  // qualsiasi altro tasto ASCII viene considerato come un passo
    //                	passi+=1;  
    //                
    //           }
            //Questa porzione di codice ha il compito di generare degli ostacoli che si sposteranno lungo il percorso ad ogni iterazione
            for(i=dim1-2; i>=0; i--)
            {
                for(j=dim2-2; j>=0; j--)
                {
                    if(spazio[i][j]=='O')
                    {
                        if(i!=dim1-2 && spazio[i+1][j]!='X')
                        {
                            spazio[i][j]=E;
                            if (spazio[i+1][j]=='V' && vite!=0)
                            {
                                printf("BOOM!! Hai colpito un ostacolo che ha danneggiato l'auto! Hai perso!\n");
                                printf("--------------------------------------------------------------------\n\n\n");
                                vite--;
                                system("pause");
                            }
                            else
                            {
                                spazio[i+1][j]='O';
                            }
                        }
                        else
                        {
                            spazio[i][j]=E;
                        }
                    }
                }
            }
        system("cls");
    }
    void creazione_campo(int dim1, int dim2,int vite) // stampa della posizione attuale degli elementi nella matrice
    {
        register int i,j;
        printf("\n");
        for (i=0; i<dim1; i++)
        {
            for (j=0; j<dim2; j++)
            {
                if (spazio[i][j]==S || spazio[i][j]=='O' || spazio[i][j]=='X' || spazio[i][j]=='V')
                {
                    printf("%c ",spazio[i][j]);
                }
                else
                {
                    printf("  ");
                }
            }
            printf("\n");
        }
    }
    
    

    ora come potrete vedere dal codice ce una parte tutta commentata, la quale funziona a dovere,
    
    //        direzione=getchar();
    //        //Switch-case che determina il movimento della navicella nel campo dei meteoriti. All'interno di ogni case ci sono dei controlli
    //		fflush(stdin);
    //       
    //		    switch (direzione)
    //        	{
    //            case 'a':
    //            case 'A':
    //	            
    //				passi+=1;
    //                spazio[riga][colonna]=E;
    //                colonna--;
    //                if (spazio[riga][colonna]==S)
    //                {
    //                    printf("Non puoi spostarti in questa direzione!\n");
    //                    system("pause");
    //                    colonna++;
    //                spazio[riga][colonna]='V';
    //                }
    //                
    //				break;
    //            case 'd':
    //            case 'D':
    //			    
    //			    passi+=1;
    //                spazio[riga][colonna]=E;
    //                colonna++;
    //                if (spazio[riga][colonna]==S)
    //                {
    //                    printf("Non puoi spostarti in questa direzione!\n");
    //                    colonna--;
    //                    system("pause");
    //                }
    //	            spazio[riga][colonna]='V';
    //                break;
    //                
    //                default:  // qualsiasi altro tasto ASCII viene considerato come un passo
    //                	passi+=1;  
    //                
    //           }
    
    
    ma per attenermi al testo specificato ho fatto:
    
    int decisione=0+rand()%1;
            	creazione_campo(dim1,dim2,vite); //richiamo la funzione crea_spazio
    			if(spazio[riga-4][colonna]=='O' && spazio[riga][colonna]=='V') // riga-4 è la posizione con cui vado a confrontare la posizione dell' ostacolo
    			{
    				if(decisione==0) // sinistra
    				{
    					passi+=1;
                    	spazio[riga][colonna]=E;
                    	colonna--;
                    	if (spazio[riga][colonna]==S)
                    	{
    						colonna++;
    					}
    					spazio[riga][colonna]='V';
    				}
    				if(decisione==1)  // destra
    				{
    					passi+=1;
                    	spazio[riga][colonna]=E;
                    	colonna++;
                    	if (spazio[riga][colonna]==S)
                    	{
    						colonna--;
    					}
    					spazio[riga][colonna]='V';
    				}				
    			}
    			else
    			{
    				passi+=1;
    				spazio[riga][colonna]='V';
    			}
    			system("PAUSE");
    		}
    
    
    ma mi crea gli oggeti ed eccetera, ma gli ostacoli non scendono verso il basso ovvero rimangono fissi sulla prima riga, mi aiutereste cortesemente anche con idee??
  • Ho modificato il problema perchè una parte l' ho risolta
  • Non si può continuare a seguire un thread così lungo... Il regolamento impone la creazione di un altro thread per un problema diverso proprio perché così si fa solo una gran confusione!
  • Ciao Giacomo,
    sono d'accordo con Oregon, così si fa confusione.
    Identifica bene il singolo argomento / problema e postalo come nuova discussione.
Devi accedere o registrarti per scrivere nel forum
44 risposte