Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it L'avatar di Columb
    Registrato dal
    Dec 2005
    Messaggi
    35

    [C++] Semplice Gioco del 7 1/2, problema

    Ciao a tutti, attualmente frequento la 5a liceo scientifico tecnologico e come programma di informatica intesa come C++ hanno appena iniziato a spiegarci la "grafica", le librerie "allegro"...
    Come applicazione della grafica, ci è stato richiesto di creare una simulazione del gioco del 7 1/2...E qui ho già problemi. ovvero, premesso che...ci sono 2 modalità, una utente vs pc e l'altra utente vs utente....
    per la utente vs pc pensavo di creare diversi livelli di difficoltà...
    1 supersimply, pesca una carta
    2 finchè le carte del pc sn sotto il 6
    3 il computer tenta di battere il giocatore umano basandosi sul risultato delle carte del giocatore

    Il punto è che ho un problema...io "creo" il mazzo....lo "mischio".....faccio giocare l'utente, pesca le sue carte e dopo xò quando "pesca" ...il programma gli fa pescare la prima carta del mazzo, che teoricamente è già stata pescata.....inizialmente come "segna posizione della carta" usavo una variabile passata per indirizzo....
    codice:
    int &carta
    e quindi pensavo che per qualche strana ragione sbagliassi...ma nel programma listato qua sotto uso una funzione ("abc") che ricalcola l'ultima posizione libera...



    codice:
    /* Gioco del 7 1/2 */
    
    #include <cstdlib>
    #include <iostream>
    #include <time.h>
    using namespace std;
    
    /**Variabili**/
    float numeri[40];
    int digit;
    char semi[40];
    char seme[4]={'c','q','f','p'};
    /**In storico verranno memorizzate le carte pescate dall'utente, 
       utile per visualizzare le carte nel turno successivo**/
    struct memory{
           float valore[2];
           char seme[2];
           };
    memory storico[100]={0};
    /**Prototipi Procedure**/
    void crea();
    void mischia();
    void versuspc();
    void versusperson();
    void vincitore(float utente, float pc);
    float utente(int people=0);
    float pc1();
    float pc2();
    int abc();
    int main(int argc, char *argv[])
    {
        crea();
        mischia();
        cout<<"Digita :"<<endl;
        cout<<"1 - 7 1/2 contro il PC"<<endl<<"2 - 7 1/2 contro un tuo amico";
        cout<<endl;
        cin>>digit;
        if(digit==1){
                     versuspc();
                     }
        if(digit==2){
                     versusperson();
                     }
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    /***Procedure di preparazione***/
    //crea il mazzo, definisce valore e seme di ogni carta
    void crea(){
         int i=0,q=1,h=0;
         while(i<40){
                     numeri[i]=q;
                     semi[i]=seme[h];
                     q++;i++;
                     if(q==11){q=1;h++;}
                     }
         return;
         }
    //Mischia il mazzo in modo casuale
    void mischia(){
         srand((unsigned)time(NULL));
         int cas;
         float p;
         char ps;
         for(int n=0;n<40;n++){
               //Generazione posizione da scambiare (casuale)  
               cas=rand()%40;
               //scambio valore
               p=numeri[cas];
               numeri[cas]=numeri[n];
               numeri[n]=p;
               //scambio seme
               ps=semi[cas];
               semi[cas]=semi[n];
               semi[n]=ps;
               }
         return;
         }
    /***Procedure centrali***/
    void versuspc(){
         int livello;
         cout<<endl<<"Scegli il livello di difficoltà";
         cout<<endl<<"Digita:"<<endl<<"1 - Facile";
         cout<<endl<<"2 - Medio"<<endl<<"3 - Difficile"<<endl;
         cin>>livello;
         switch(livello){
                         case 1:
                              vincitore(utente(),pc1());
                              break;    
                         case 2:
                              vincitore(utente(),pc2());
                              break;                                           
                         }
         }
    void versusperson(){}
    /****Sottoprocedure****/
    void vincitore(float utente, float pc){
         cout<<"PIRLA"; //CONTROLLO COSO!!
         cout<<endl;
         cout<<utente<<endl;
         cout<<pc;
         if(utente>7.5 && pc>7.5)
         {cout<<"Sia tu che il pc avete fatto 7 1/2!"<<endl;
          cout<<"Quindi a parità di punteggio vince il Banco!"<<endl;
          cout<<"Il PC ha vinto!"<<endl;
         }
         if(utente>7.5){ cout<<"Il PC ha vinto con "<<pc<<endl;}
         if(pc>7.5){cout<<"Hai vinto tu! il PC ha fatto più di 7.5"<<endl;}
         if(pc<8 && utente<8 && pc<utente){ 
                    cout<<"Hai vinto tu! Il PC ha fatto "<<pc<<endl;
                    }
         if(pc<8 && utente<8 && utente<pc){
                    cout<<"Ha vinto il PC con "<<pc<<endl;
                    }
         }
    /****Sottofunzioni****/
    float utente(int people){
         float tot=0;
         bool finish=false;
         int continua, carta=0;
         if(people!=0){carta=abc();}
         while(finish==false){
                              cout<<endl<<"Ecco la tua carta:"<<endl;
                              if(numeri[carta]>7){
                                        if(numeri[carta]==10 && semi[carta]=='c'){
                                                   if((7-tot)==0){tot=7.5;}
                                                   else{tot=7;}
                                        }
                                        else{tot=tot+0.5;}
                              }           
                              else{ tot=tot+numeri[carta];}
                              storico[carta].valore[people]=numeri[carta];
                              storico[carta].seme[people]=semi[carta];
                              cout<<numeri[carta]<<semi[carta];
                              if(tot<7.5){
                                          cout<<endl<<"Ti fermi? 1 si - 0 no"<<endl;
                                          cin>>continua;
                                          if(continua==1){finish=true;}
                              }
                              else{finish=true;}
                              carta++;
                              }
                              
         return tot;
         }
    //In pc1, modalità facile, il PC estrae SOLO 1 carta
    float pc1(){
          float tot;
          int s=abc();
          if(numeri[s]>7){
                              if(numeri[s]==10 && semi[s]=='c'){tot=7;}
                              else{tot=0.5;}     
          }
          else{tot=numeri[s];}
          return tot;
          }
    //In pc2, modalità media, 
    //il PC estrae soltato se il valore complessivo non supera 6
    float pc2(){
          float tot=0;
          bool finish=false;
          int continua, s=abc();
          while(tot<=6){
                        if(numeri[s]>7){
                           if(numeri[s]==10 && semi[s]=='c'){
                              if((7-tot)==0){tot=7.5;}
                              else{tot=7;}
                           }
                           else{tot=tot+0.5;}
                        }           
                        else{ tot=tot+numeri[s];}
                        s++;
                        }
          return tot;
          }
    //ricerca carta
    int abc(){
        bool d=true;int y=0;
        while(d==true){
                       if(storico[y].valore[0]==0){d=false;}
                       else{ y++;}
                       }
        return y;
        }
    Insomma, chiedo a voi perchè mi sono esaurito dietro a un errore che non trovo....
    Qualcuno sa spiegarmi l'arcano? o aiutarmi in altro modo per eseguire sto benedetto sette e mezzo?....Grazie mille, scusate il tono ma sono davvero esausto.

  2. #2
    A prima vista... quando chiami:
    codice:
    vincitore(utente(),pc1())
    quale funzione vuoi che venga chiamata prima? la "utente" o "pc1"?
    Considera che in C/C++ l'ordine di chiamata (salvo strambe direttive di compilazione che non conosco) non è definito, ovvero potrebbe essere chiamata prima la "pc1" poi la "utente" o viceversa: quindi se le funzioni "utente" e "pc1" hanno effetti collaterali (modificano direttamente od indirettamente delle variabili globali, tra l'altro numerose nel tuo progetto), allora il comportamento del tuo programma non è definito.

  3. #3
    Utente di HTML.it L'avatar di Columb
    Registrato dal
    Dec 2005
    Messaggi
    35
    Originariamente inviato da MacApp
    A prima vista... quando chiami:
    codice:
    vincitore(utente(),pc1())
    quale funzione vuoi che venga chiamata prima? la "utente" o "pc1"?
    Considera che in C/C++ l'ordine di chiamata (salvo strambe direttive di compilazione che non conosco) non è definito, ovvero potrebbe essere chiamata prima la "pc1" poi la "utente" o viceversa: quindi se le funzioni "utente" e "pc1" hanno effetti collaterali (modificano direttamente od indirettamente delle variabili globali, tra l'altro numerose nel tuo progetto), allora il comportamento del tuo programma non è definito.
    Non ero a conoscenza di questa cosa...mhm, io credevo che scrivendo prima "utente()" e poi "pc1()"..le eseguisse in ordine...Grazie per l'informazione, C'è qualche modo "rapido" per ovviare a questo "problema"?...

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Beh ... ovviamente le puoi chiamare prima ...

    codice:
    float tmp1=utente();
    float tmp2=pc1();
    vincitore(tmp1, tmp2);

  5. #5
    Utente di HTML.it L'avatar di Columb
    Registrato dal
    Dec 2005
    Messaggi
    35
    Originariamente inviato da oregon
    Beh ... ovviamente le puoi chiamare prima ...

    codice:
    float tmp1=utente();
    float tmp2=pc1();
    vincitore(tmp1, tmp2);
    Certo che sono proprio scemo....Grazie mille, ora funziona....

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.