PROBLEMA [C] Variabili globali

Pubblicità

marcococ

Nuovo Utente
Messaggi
29
Reazioni
1
Punteggio
21
Salve ragazzi ....non riesco a capire bene una cosa..(ling C)... le variabili globali in questione : riga 25/26(mosse_a_disposizioneNinja/Ciccio), richiamate nella funzione alla riga 240 ,void gioca(), e modificate, poi richiamate ancora nelle funzioni alle righe 265 o 300(turno Ciccio(),turnoNinja() )....

quando le richiamo nelle righe 265/300 ritornano entrambe al valore 1 (come dichiarate inizialmente) ...per quale motivo ?
un'altra cosa .....se in una funzione dovessi decidere di ritornare al main (che non è in questo file) come dovrei fare?

qui vi lascio il pezzo di codice....
C:
#include "gamelib.h"

static struct Cella *scacchiera = NULL ;

static struct Giocatore Ciccio;
static struct Giocatore Ninja ;
int lato ;

void alien();
void trap();

void crea_scacchiera();
void stampa_scacchiera();
void termina_creazione();

void muovi();
void usa_oggetto();

void turno_ninja();
void turno_ciccio();
void zaino();

static short int vittoriaNinja=0,vittoriaCiccio=0;
static unsigned int turni_passati=0;
static short int mosse_a_disposizione_Ninja=1;
static short int mosse_a_disposizione_Ciccio=1;

static int vita_ciccio=100;
static int scudo_ciccio=100;
static int vita_ninja=100;
static int scudo_ninja=100;

///la funzione termina_creazione permette di ritonrare al menu iniziale del gioco
void termina_creazione() {
}

void termina_gioco(){
printf("Ecco le statistiche delle partite:\n" );
printf("Vittorie di Ninja : %d\n Vittorie di Ciccio: %d \n ",vittoriaNinja,vittoriaCiccio );
   exit(1);
}


void crea_mappa(){

int opzione;

do {
printf("\t Premi '1' per CREARE LA SCACCHIERA \n" );
printf("\t \n" );
printf("\t Premi '2' per STAMPARE LA SCACCHIERA \n" );
printf("\t \n" );
printf("\t Premi '3' per TORNARE INDIETRO \n" );
scanf("%d", &opzione );


switch (opzione) {
case 1:
crea_scacchiera();
break;


case 2:
stampa_scacchiera();
break;


case 3:
termina_creazione();
return ;


default:
printf("Opzione non valida..\n" );
break;
}
} while(opzione!=3);


}


void crea_scacchiera () {

printf("Immettere la lunghezza n di un lato della scacchiera: " );
scanf("%d", &lato );

mappa=lato*lato ;
righe=lato;
colonne=lato;
scacchiera=malloc(righe*colonne*sizeof(struct Cella));
printf("Grandezza Mappa => %d (%dX%d)\n\n",mappa,lato,lato);


printf("Ai fini della difficoltà del gioco dovrai inserire 3 probabilità la cui somma dovrà fare 100..... \n\n" );
do {
printf("\t Probabilità di trovare in una data cella una'TRAPPOLA':" );
scanf("%d", &trapp);
printf("\t Probabilità di trovare in una data cella un 'ALIENO' :" );
scanf("%d", &alie );
printf("\t Probabilità di trovare in una data cella 'NESSUN PERICOLO':");
scanf("%d", &ness_per );


if (ness_per +trapp+alie !=100) {
printf(" \n Ricorda la somma delle probabilità deve essere 100 \n " );
}
}
while( ness_per +trapp+alie !=100);

printf("\t \n Ora dovrai inserire 5 probabilità legate al ritrovamento o meno degli oggetti....." );
do {
printf("\n\n\t Probabilità di trovare in una data cella 'POZIONE':" );
scanf("%d", &pozio);
printf("\t Probabilità di trovare in una data cella un 'MEDIKIT' :" );
scanf("%d", &medik );
printf("\t Probabilità di trovare in una data cella 'MATERIALE':" );
scanf("%d", &mater);
printf("\t Probabilità di trovare in una data cella un 'COLPI LANCIARAZZI' :" );
scanf("%d", &colpilancia );
printf("\t Probabilità di trovare in una data cella 'NESSUN OGGETTO':" );
scanf("%d", &no_obj );


if (no_obj+pozio+medik+colpilancia+mater !=100) {
printf("Ricorda la somma delle probabilità deve essere 100" );
}


} while(no_obj+pozio+medik+colpilancia+mater !=100);


//inizializzo Tipo_pericolo


for ( i = 0; i < lato; i++) {
for ( j= 0; j <lato; j++) {

int  prob1= rand()%100;
if (prob1<ness_per) {
scacchiera[i*lato+j].pericolo=nessun_pericolo;
} else if (ness_per<=prob1&&prob1<=ness_per+trapp) {
scacchiera[i*lato+j].pericolo=trappola;
} else if(prob1>=ness_per+trapp){
scacchiera[i*lato+j].pericolo=alieno;
}
}}

//inizializzo Tipo_oggetto


for ( i = 0; i < lato; i++) {
for ( j= 0; j <lato; j++) {
int prob2 =rand()%100;
if (prob2<no_obj) {
scacchiera[i*lato+j].oggetto=nessun_oggetto;
} else if (no_obj<=prob2&&prob2<no_obj+medik) {
scacchiera[i*lato+j].oggetto=medikit;
} else if (no_obj+medik<=prob2&&prob2<no_obj+medik +pozio)
scacchiera[i*lato+j].oggetto=pozione;
else if (no_obj+medik+pozio<=prob2&&prob2<no_obj +medik+pozio+mater)
scacchiera[i*lato+j].oggetto=materiale;
else if (no_obj+medik+pozio+mater<=prob2)
scacchiera[i*lato+j].oggetto=colpi_lanciarazzi;
}
}


Ciccio.x=rand()%lato;
Ciccio.y=rand()%lato;
Ninja.x=rand()%lato;
Ninja.y=rand()%lato;

printf("Ciccio.x=%d\n", Ciccio.x );
printf("Ciccio.y=%d\n", Ciccio.y );
printf("Ninja.x=%d\n", Ninja.x );
printf("Ninja.y=%d\n", Ninja.y);



Ninja.zaino[nessun_oggetto]=0;
Ciccio.zaino[nessun_oggetto]=0;
Ninja.zaino[medikit]=0;
Ciccio.zaino[medikit]=0;
Ninja.zaino[pozione]=0;
Ciccio.zaino[pozione]=0;
Ninja.zaino[materiale]=0;
Ciccio.zaino[materiale]=0;
Ninja.zaino[colpi_lanciarazzi]=0;
Ciccio.zaino[colpi_lanciarazzi]=0;
Ninja.stato=solo_vita;
Ciccio.stato=solo_vita;


printf("\n\n\nOk......la mappa è stata creata\n\n\n");
}


  void stampa_scacchiera(){
    if(scacchiera == NULL){

    printf("Devi ancora creare la scacchiera!...\n ");
    printf("\n ");}


      printf("\n\n\n\n" );
      int l, p ;
      for ( l = 0; l < lato ; l++) {
      for (p=0; p<lato ; p++) {
      if ((scacchiera+l*p)->pericolo==nessun_pericolo) {
      printf(" [1" );
      } else if ((scacchiera+l*p)->pericolo==alieno) {
      printf(" [2" );
      } else if((scacchiera+l*p)->pericolo==trappola) {
      printf(" [3" );
      }///////////////////////////////////////////////////
      if((scacchiera+l*p)->oggetto==nessun_oggetto) {
      printf(",4]" );
      } else if ((scacchiera+l*p)->oggetto==medikit) {
      printf(",5]" );
      } else if((scacchiera+l*p)->oggetto==pozione) {
      printf(",6]" );
      }
      else if ((scacchiera+l*p)->oggetto==materiale) {
      printf(",7]" );
      } else if((scacchiera+l*p)->oggetto==colpi_lanciarazzi) {
      printf(",8]" );
      }
      }
      printf("\n" );
      }


printf("\t\t\t \n\nLegenda :\n\n");
printf("\nNessun pericolo=1\nAlieno=2\nTrappola=3\nNessun Oggetto=4\nMedikit=5\nPozione=6\nMateriale=7\nColpi lanciarazzi=8\n\n\n\n"  );
}



void gioca(){
  if(scacchiera == NULL){
    printf("Devi creare prima la mappa...\n\n\n ");
    return ;
  }
    if (turni_passati==0) {
     if (rand()%2==0) {
       turno_ninja();
      --mosse_a_disposizione_Ciccio;
     } else {
       turno_ciccio();
       --mosse_a_disposizione_Ninja;
     }


   } else if (mosse_a_disposizione_Ninja==1) {
      turno_ninja();

    } else if(mosse_a_disposizione_Ciccio==1) {
      turno_ciccio();

    }
}


void turno_ciccio(){
  printf("%d\n",mosse_a_disposizione_Ninja );
  printf("%d\n",mosse_a_disposizione_Ciccio );
  if (mosse_a_disposizione_Ciccio==0) {
    turni_passati=turni_passati+0.5;
    ++mosse_a_disposizione_Ninja;
    gioca();
  }
  int scl;

printf("\n\n\nCiccio è il tuo turno ! \n Scegli cosa fare!\n\n\n\n");
do{
  printf("\t Premi '1' per MUOVERTI \n" );
  printf("\t \n" );
  printf("\t Premi '2' per USARE UN OGGETTO \n" );
  printf("\t \n" );

scanf("%d" ,&scl);
if(scl < 0 || scl > 2){
printf("Errore hai inserito un valore non valido\n");
}
switch(scl)
{
case 1: muovi();
break;
case 2: usa_oggetto();
break;
}

}while( scl != 0);

}



void turno_ninja(){
  printf("%d\n",mosse_a_disposizione_Ninja );
  printf("%d\n",mosse_a_disposizione_Ciccio );

  if (mosse_a_disposizione_Ninja==0) {
    turni_passati=turni_passati+0.5;
    ++mosse_a_disposizione_Ciccio;
  gioca();
  }
int scl;
  printf("\n\n\nNinja è il tuo turno ! \n Scegli cosa fare!\n\n\n\n");

  do{
    printf("\t Premi '1' per MUOVERTI \n" );
    printf("\t \n" );
    printf("\t Premi '2' per USARE UN OGGETTO \n" );
    printf("\t \n" );

   scanf("%d" ,&scl);
   if(scl < 0 || scl > 2){
   printf("Errore hai inserito un valore non valido\n");
  }
  switch(scl)
  {
  case 1: muovi();
  break;
  case 2: usa_oggetto();
  break;
  }
 
Ultima modifica:
Tornare alla main() é sconsigliato, in quanto tutto il codice é presente nella main(), quindi potresti generare un loop
Codice:
void main()
{
A();
}
void A()
{
B();
}
void B()
{
C();
}
.....
void Z()
{
//richiama la main
}
Esempio di loop
Comunque come faresti a richiamare una funzione di tipo void senza parametri di ingresso di nome "tizio"? E se il nome fosse " main"?
 
nel caso in cui un giocatore morisse , devo ritornare al menù iniziale del gioco che sta nel main....come dovrei fare secondo te quindi ?
i parametri di ingresso li devo aggiustare.....
 
Mi scusi, ma adesso che ho capito a cosa le serve non so rispondere. Si potrebbe chiamare la main, come ogni altra funzione si chiama, oppure saltare alla prima riga del programma, ma le cose non risolverebbero il problema, servirebbe (e non so come ottenere) un modo per cancellare la memoria che ricorda le funzioni non finite (quella che contiene la funzione a cui la return spedisce, non so come si chiami), perché se non si cancellasse quella dopo un numero limitato di morti il controllore non avrebbe più spazio per segnarsi le funzioni chiamate.
Chiedo scusa per il mio linguaggio da neofita, quale sempre più riconosco di essere
 
Il main non va chiamato; se ne hai la necessità vale quanto detto nell'altro topic: stai sbagliando qualcosa nel modo in cui strutturi il tuo programma.

Hai provato ad analizzare con un debugger lo stato di quelle variabili? Oltretutto sono dichiarate static, non sono solo globali.

La prima stampa che vedrai (sia in ciccio che in ninja) mostrerà lo stato iniziale in quanto il loro valore non è ancora stato modificato.

Fai attenzione poichè quelle 3 funzioni che si richiamano a vicenda dubito ti diano i risultati attesi... quando la funzione ritorna, il controllo è passato di nuovo alla chiamante.
Inoltre la variabile turni_passati sarà sempre a 0 anche in caso gli venga sommato + 0.5 in quanto è di tipo int, e la parte decimale viene troncata.
 
Occhio che non ha senso che gioca() chiami turno_ciccio/ninja e questo chiami gioca().
Il main non va chiamato; se ne hai la necessità vale quanto detto nell'altro topic: stai sbagliando qualcosa nel modo in cui strutturi il tuo programma.

Hai provato ad analizzare con un debugger lo stato di quelle variabili? Oltretutto sono dichiarate static, non sono solo globali.

La prima stampa che vedrai (sia in ciccio che in ninja) mostrerà lo stato iniziale in quanto il loro valore non è ancora stato modificato.

Fai attenzione poichè quelle 3 funzioni che si richiamano a vicenda dubito ti diano i risultati attesi... quando la funzione ritorna, il controllo è passato di nuovo alla chiamante.
Inoltre la variabile turni_passati sarà sempre a 0 anche in caso gli venga sommato + 0.5 in quanto è di tipo int, e la parte decimale viene troncata.
Mi hai fregato sul tempo :asd:
 
Pubblicità
Pubblicità
Indietro
Top