Precedente :: Successivo |
Autore |
Messaggio |
GG4Core Mortale devoto
Registrato: 02/07/15 16:11 Messaggi: 11
|
Inviato: 02 Lug 2015 16:22 Oggetto: [C] Car Speed Gioco ultime modifiche aiutatemi |
|
|
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 |
|
|
SverX Supervisor Macchinisti
Registrato: 25/03/02 11:16 Messaggi: 11575 Residenza: Tokelau
|
Inviato: 03 Lug 2015 09:53 Oggetto: |
|
|
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'
|
|
Top |
|
|
GG4Core Mortale devoto
Registrato: 02/07/15 16:11 Messaggi: 11
|
Inviato: 03 Lug 2015 16:29 Oggetto: |
|
|
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 |
|
|
SverX Supervisor Macchinisti
Registrato: 25/03/02 11:16 Messaggi: 11575 Residenza: Tokelau
|
Inviato: 06 Lug 2015 10:27 Oggetto: |
|
|
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
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 & :
in questo modo la funzione incrementerà il valore dell'intero 'i', ovvero farà quello che ti attendi che faccia...
|
|
Top |
|
|
GG4Core Mortale devoto
Registrato: 02/07/15 16:11 Messaggi: 11
|
Inviato: 06 Lug 2015 11:37 Oggetto: |
|
|
si avevo pensato.ho fatto ancora prima ho passato tutto ad una struct e ora sono felice come una pasqua |
|
Top |
|
|
|
|
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
|
|