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.