PDA

Visualizza la versione completa : [C++] Simulazione del gioco del "7 e 1/2"


Columb
05-11-2007, 23:02
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....
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...




/* 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.

MacApp
06-11-2007, 11:28
A prima vista... quando chiami:


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.

Columb
06-11-2007, 14:08
Originariamente inviato da MacApp
A prima vista... quando chiami:


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"?...

oregon
06-11-2007, 14:20
Beh ... ovviamente le puoi chiamare prima ...



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

Columb
06-11-2007, 16:44
Originariamente inviato da oregon
Beh ... ovviamente le puoi chiamare prima ...



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


Certo che sono proprio scemo....Grazie mille, ora funziona.... :D

Loading