Indice del forum Olimpo Informatico
I Forum di Zeus News
Leggi la newsletter gratuita - Attiva il Menu compatto
 
 FAQFAQ   CercaCerca   Lista utentiLista utenti   GruppiGruppi   RegistratiRegistrati 
 ProfiloProfilo   Messaggi privatiMessaggi privati   Log inLog in 

    Newsletter RSS Facebook Twitter Contatti Ricerca
[C] Car Speed Gioco ultime modifiche aiutatemi
Nuovo argomento   Rispondi    Indice del forum -> Programmazione
Precedente :: Successivo  
Autore Messaggio
GG4Core
Mortale devoto
Mortale devoto


Registrato: 02/07/15 16:11
Messaggi: 11

MessaggioInviato: 02 Lug 2015 16:22    Oggetto: [C] Car Speed Gioco ultime modifiche aiutatemi Rispondi citando

Ciao ragazzi sono alla resa finale di questo gioco, ora date un occhiata al codice e ditemi cortesemente se è per colpa di un passaggio di parametri errato o altro che sia quando richiamo la funzione manuale o automatico , l' auto in creazione_campo che stampa la posizione attuale degli oggetti non subisce un cambiamento di locazione! datemi una mano, eccovi il codice
Main
Codice:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define LATOMIN 20
#define MAX_PASSI 100
#define MAX_SPAZIO 50

void creazione_campo(int,int);
void credits();
void rules();
int manuale(int ,int, int, register char);
int automatico(int, int, int);
int scelta();

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) e (max %d):\t",LATOMIN,MAX_SPAZIO);
        scanf("%d",&dim1);
        printf("Inserisci la larghezza del campo da gioco ( min %d) e (max %d):\t",LATOMIN,MAX_SPAZIO);
        scanf("%d",&dim2);
    }
    while(dim1 < LATOMIN && dim1 > MAX_SPAZIO && dim2 < LATOMIN && dim2 > MAX_SPAZIO );

   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');  // posizione casuale della macchina
   
    spazio[riga][colonna]='V';
    na_1=1+rand()%8;
    na_2=1+rand()%colonna-10;
    spazio[na_1][na_2]='X';
   
   int flag=scelta();
    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';
             
        creazione_campo(dim1,dim2); //richiamo la funzione crea_spazio
      if(flag==1)
      {
         passi=manuale(riga,colonna,passi,direzione); // richiamo la funzione manuale
      }
      else
      {
         passi=automatico(riga,colonna,passi); // richiamo la funzione demo
      }
     

        //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");
   }
}


Creazione campo

Codice:

void creazione_campo(int dim1, int dim2) // 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");
    }
}


Manuale

Codice:

int manuale(int riga,int colonna,int passi, register char direzione)
{
    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':
               
         return 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':
             
         return 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
               
            return passi+=1; 
               
    }   
}


Automatico
Codice:

int automatico(int riga, int colonna, int passi)
{
   int decisione=rand()%1;  // destra o sinistra
   int decisione2=1+rand()%2;  //  uno o due posizioni casuali
         
   if(spazio[riga-4][colonna]=='O' || spazio[riga-3][colonna]=='O' && spazio[riga][colonna]=='V') // riga-4 e riga -3 è la posizione con cui vado a confrontare la posizione dell' ostacolo
   {
      if(decisione==0 && decisione2==1) // sinistra 1 posizione
      {
         return passi+=1;
            spazio[riga][colonna]=E;
            colonna--;
            if (spazio[riga][colonna]==S)
            {
            colonna+2;
         }
         spazio[riga][colonna]='V';
      }
      if(decisione==0 && decisione2==2) // sinistra due posizioni
      {
         return passi+=1;
            spazio[riga][colonna]=E;
            colonna-2;
            if (spazio[riga][colonna]==S)
            {
            colonna+2;
         }
            spazio[riga][colonna]='V';
      }
      if(decisione==1 && decisione2==1)  // destra 1 posizione
      {
         return passi+=1;
            spazio[riga][colonna]=E;
            colonna++;
            if (spazio[riga][colonna]==S)
            {
            colonna-2;
         }
         spazio[riga][colonna]='V';
      }
      if(decisione==1 && decisione2==2) // destra due posizioni
      {
         return passi+=1;
            spazio[riga][colonna]=E;
            colonna+2;
            if (spazio[riga][colonna]==S)
            {
            colonna-2;
         }
         spazio[riga][colonna]='V';
      }           
   }
   else
   {
      if(decisione==0 && decisione2==1) // sinistra 1 posizione
      {
         return passi+=1;
            spazio[riga][colonna]=E;
            colonna--;
            if (spazio[riga][colonna]==S)
            {
            colonna+2;
         }
         spazio[riga][colonna]='V';
      }
      if(decisione==0 && decisione2==1) // sinistra due posizioni
      {
         return passi+=2;
            spazio[riga][colonna]=E;
           colonna-2;
            if (spazio[riga][colonna]==S)
            {
            colonna+2;
         }
         spazio[riga][colonna]='V';
      }
      if(decisione==1 && decisione2==1)  // destra 1 posizione
      {
         return passi+=1;
            spazio[riga][colonna]=E;
            colonna++;
            if (spazio[riga][colonna]==S)
            {
            colonna-2;
         }
         spazio[riga][colonna]='V';
      }
      if(decisione==1 && decisione2==1) // destra due posizioni
      {
         return passi+=2;
            spazio[riga][colonna]=E;
            colonna+2;
            if (spazio[riga][colonna]==S)
            {
            colonna-2;
         }
         spazio[riga][colonna]='V';
      }                 
      system("PAUSE");
   }
}


scelta
Codice:

int scelta()
{
   int flag;
   do
   {
   
      printf("CIAO UTENTE PREMI 1 PER GIOCARE MANUALMENTE\n\t    PREMI 2 PER AVVIARE LA DEMO:\t");
      scanf("%d",&flag);
      if(flag==1)
      {
         return 1;   // Manuale
      }
      if(flag == 2)
      {
         return 2;   // Demo
      }
   }
   while(flag!=1 || flag != 2);
}


credits e rules
Codice:

// Le funzioni che seguono sono delle semplici void per la stampa di informazioni sul gioco e su come si gioca
void credits()
{
   printf(" -------------------------------\n");
   printf("| BENVENUTO NEL GIOCO CAR SPEED |\n");
   printf(" -------------------------------\n\n");
}

void rules()
{
   printf("*******************\n");
   printf("* REGOLE DI GIOCO *\n");
   printf("*******************\n\n");
   printf("*       Il gioco consiste nel far muovere l'auto (indentificata da: V )\n");
   printf("*       e farla arrivare alla fine del percorso (ovvero dopo 100 passi)\n");
   printf("*    evitanto gli ostacoli presenti! Se invece l'auto colpisce un ostacolo\n");
   printf("*                            finisce la partita!\n\n");
   printf("                            *************\n");
   printf("                            * MOVIMENTI *\n");
   printf("                            *************\n\n");
   printf("E' possibile muovere l'auto manualmente solo nelle direzioni destra -> e sinistra <-: \n\n");
   printf("A per far muovere l'auto a sinistra\n\n");
   printf("D per far muovere l'auto a destra!\n\n");
   printf("Oppure e' possibile avviare una demo del gioco\n\n");
}
Top
Profilo Invia messaggio privato
SverX
Supervisor Macchinisti
Supervisor Macchinisti


Registrato: 25/03/02 11:16
Messaggi: 11559
Residenza: Tokelau

MessaggioInviato: 03 Lug 2015 09:53    Oggetto: Rispondi citando

da quel che vedo, all'interno delle funzioni 'manuale' e 'automatico' modifichi il valore della variabile 'colonna' (e a volte anche 'passi').
Quando in C chiami una funzione passi i parametri "per valore" e quindi in effetti stai facendo una copia del valore di una variabile in uno spazio apposta, spazio che esiste finché la funzione è in esecuzione e poi viene distrutto. Quello che invece vuoi fare tu è cambiare dentro la funzione il valore della variabile. Puoi fare in due modi:
1 - dichiari le variabili 'colonna' e 'passi' fuori dalla main() ... in questo modo quelle variabili sono globali, e le puoi vedere e modificare in qualunque funzione, non devi neanche passarle alla funzione (appunto perché qualunque funzione vede tutte le variabili globali)
2 - passi dei puntatori alle variabili invece che le variabili stesse. E' più complicato, ma se ti interessa approfondisci. Prova a cercare 'passaggio parametri per referenza (o per riferimento, o per indirizzo) in C'

Ciao
Top
Profilo Invia messaggio privato HomePage
GG4Core
Mortale devoto
Mortale devoto


Registrato: 02/07/15 16:11
Messaggi: 11

MessaggioInviato: 03 Lug 2015 16:29    Oggetto: Rispondi citando

Grazie mille, volevo gia provare con il passaggio di parametri per indirizzo, ma sbagliavo a farlo, ho seguito il tuo primo consiglio, e ho dovuto inserire fra le variabili globali anche vite, altrimenti come dicevi tu veniva distrutto il valore che assumeva, finalmente ho terminato il progetto grazie ancora, nel caso non ti arreccasse disturbo a te e agli altri mi faresti solo un esempio di come lo faresti tu?
Top
Profilo Invia messaggio privato
SverX
Supervisor Macchinisti
Supervisor Macchinisti


Registrato: 25/03/02 11:16
Messaggi: 11559
Residenza: Tokelau

MessaggioInviato: 06 Lug 2015 10:27    Oggetto: Rispondi citando

io avrei usato le variabili globali, in un piccolo progetto come questo probabilmente non avrei usato neanche le funzioni... però se si tratta di imparare fai bene ad usare le funzioni, e dovresti anche imparare come usare il passaggio di variabili per indirizzo...

per fare un esempio, immaginiamo una funzione che aggiunge 1 (incrementa) il valore dell'intero che gli passi. Se fai

Codice:
void incrementa (int i) {
 i++;
}


vedrai che non ti ritroverai incrementato un bel nulla.

Se invece usi
Codice:
void incrementa (int *i) {
 *i=*i+1;
}


vedrai che funziona. il parametro i non sarà però il valore dell'intero, ma il valore dell'indirizzo al quale l'intero è memorizzato. Quindi '*i' indicherà l'intero in sé. Occhio che *i++ non avrebbe funzionato nel modo corretto, data la precedenza dell'operatore ++ sull'operatore * (avresti incrementato i, quindi l'indirizzo, e non l'intero) --- vedi http://en.cppreference.com/w/c/language/operator_precedence

a questo punto per usare (chiamare) la funzione però non dovrai più usare
Codice:
incrementa (i);

perché la funzione richiede un indirizzo, un 'puntatore ad intero' come parametro, e non un 'intero'. Per ottenere l'indirizzo di una variabile devi usare l'operatore & :
Codice:
incrementa (&i);

in questo modo la funzione incrementerà il valore dell'intero 'i', ovvero farà quello che ti attendi che faccia...

Ciao
Top
Profilo Invia messaggio privato HomePage
GG4Core
Mortale devoto
Mortale devoto


Registrato: 02/07/15 16:11
Messaggi: 11

MessaggioInviato: 06 Lug 2015 11:37    Oggetto: Rispondi

si avevo pensato.ho fatto ancora prima ho passato tutto ad una struct e ora sono felice come una pasqua
Top
Profilo Invia messaggio privato
Mostra prima i messaggi di:   
Nuovo argomento   Rispondi    Indice del forum -> Programmazione Tutti i fusi orari sono GMT + 1 ora
Pagina 1 di 1

 
Vai a:  
Non puoi inserire nuovi argomenti
Non puoi rispondere a nessun argomento
Non puoi modificare i tuoi messaggi
Non puoi cancellare i tuoi messaggi
Non puoi votare nei sondaggi