Problema salvataggio file[RISOLTO]

di il
25 risposte

Problema salvataggio file[RISOLTO]

Ciao a tutti, sono nuovo del forum. Avrei un grosso problema con il salvataggio di una lista di struct su un file ad accesso casuale. Il problema sorge quando cerco di salvare la lista giocatori. Se qualcuno prova a compilarlo può notare che durante il salvataggio vengono salvati due elementi della lista(numero di giocatori fissato a 2). Ma quando si va a riprendere il file e si cerca di stampare a video il numero di elementi presenti stampa un numero astronomico. Questo è solo il primo errore della fase di caricamento, ma intanto vediamo se riusciamo a risolvere questo. Posto il codice:

//COSTRUZIONE CODICE BASE->		FATTO
//GESTIONE ERRORI INSERIMENTO->	FATTO
//GESTIONE FINE PARTITA->		FATTO 
//GESTIONE SALVATAGGIO->		NON FATTO
//GESTIONE CARICAMENTO->		NON FATTO

#include <stdio.h>
#include <tchar.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>

//DEFINIZIONE DI TUTTE LE COSTANTI
#define NO 0
#define SI 1
#define UMANO 0
#define PC 1
#define BANCO 0
#define GIOCATORE 1
#define NON_TURNO 0
#define SI_TURNO 1
#define NON_FINITA 0
#define FINITA 1
#define MAX_STR 30
#define MAX_CARD 52
#define MIN_PLAYER 2
#define MAX_PLAYER 12
#define MIN_MONEY 1
#define MAX_MONEY 100
#define MAX_BET 5
#define CUORI 0
#define QUADRI 1
#define FIORI 2
#define PICCHE 3
#define MAX_SHUFFLE 200
#define NON_MOSTRA 0
#define MOSTRA 1
#define FILENAME "save.dat"

//Struttura della carta
//nome: nome della carta
//seme: intero che indica il seme
//val: valore della carta
typedef struct carta{
	char nome[MAX_STR+1];
	int seme;
	int val;
}Carta;

//Struttura per il mazzo
//carte_mazzo: vettore di carte
//num_carte: numero di carte effettive nel mazzo
typedef struct mazzo
{
	Carta carte_mazzo[MAX_CARD]; //array di 52 carte_mazzo di tipo Carta
	int num_carte; //numero di carte del mazzo
}Mazzo;

//Struttura per il giocatore
//ruolo: valore che indica se l'utente è banco o giocatore
//soldi: valore che indica il patrimonio dell'utente
//puntata: intero che indica la puntata
//turno: valore che indica se l'utente è di turno
//tipo: valore che indica se l'utente è umano o pc
//mazzo: mazzo di carte che il mazziere ha fornito all'utente
typedef struct utente
{
	char nome[MAX_STR+1];
	int ruolo; // BANCO, GIOCATORE
	int soldi;
	int puntata;
	int turno; // NON_TURNO, SI_TURNO
	int tipo; // UMANO, PC
	Mazzo mazzo;
}Utente;

//Struttura per l'elemento della lista di utenti
//el: utente
//next: puntatore al prossimo elemento della lista
typedef struct el_list_utente
{
	Utente el;
	struct el_list_utente *next;
}El_list_utente;

//Struttura per la lista di giocatori
//inizio: elemento di partenza della lista
//numel: numero di giocatori
typedef struct list_utente
{
	El_list_utente *inizio;
	int numel;
}List_utente;

void Pausa(void);

//Funzioni per il menù
int menu(); // menù di gioco iniziale
int SetMenuSoldi(); // menù per l'impostazione della somma di denaro posseduta inizialmente
void MenuGiocoBanco(List_utente *, Utente *,Mazzo *,Mazzo *); // menù di gioco se l'umano è banco
void MenuGiocoBancoPC(List_utente *, Utente *,Mazzo *,Mazzo *);	// menù di gioco se il PC è banco
void PlayMenu(Utente *,Mazzo *,Mazzo *); // menù di gioco se l'umano è giocatore
void PlayPC(Utente *,Mazzo *,Mazzo *); // menù di gioco se l'umano è giocatore
int menuContinua(); // menù di fine mano
void Save(List_utente *,Mazzo *,Mazzo *);
void Load(List_utente *,Mazzo *,Mazzo *);

//Funzioni per la lista utenti
void InitListUtente(List_utente *list); // inizializza lista utenti
void AggiungiGiocatoreInTesta(List_utente *,Utente *); // inserisce un elemento in testa alla lista tramite la funzione Push
void AggiungiGiocatoreInCoda(List_utente *,Utente *);
void Push(List_utente *,Utente *);
int NumElList(List_utente *); //Conta elemento della lista
void NextTurn(List_utente *); //Imposta il turno successivo
int ContaSoldi(Utente *); // Ritorna la somma di denaro posseduta dall'utente
void RemoveLoser(List_utente *);
int IsLoser(Utente *); 
void filtra(List_utente *);

//Funzioni per i giocatori
void ImpostaNomeGiocatore(char *nome); // acquisisce il nome del giocatore umano
void SettaNome(Utente *,char *); // imposta il nome del giocatore umano acquisito
void PreparaPC(List_utente *, int, int); // prepara il giocatore PC
void PreparaUmano(List_utente *,char *,int); // prepara il giocatore UMANO
void StampaStatoTutti(List_utente *,int); // stampa lo stato di tutti i giocatori
void StampaStato(Utente *, int); // stampa lo stato di un utente
int SeUmano(Utente *); // dice se l'utente è umano
void PrendiUtenteTurno(List_utente *,Utente *); // restituisce i parametri del giocatore corrente
int Ebanco(Utente *);//verifica se l'utente è banco
int Punteggio(Mazzo *,int);//punteggio giocatore
void SetUserTurn(List_utente *,Utente *); // restituisce i parametri del giocatore corrente(aggiornati)
void Valute(List_utente *); // confronta i punteggi dei giocatori, valuta chi vince e lo paga

//Funzioni per il mazzo
void InitMazzo(Mazzo *); // inizializza il mazzo
void PreparaMazzo(Mazzo *); //prepara il mazzo
void ImpostaCarta(Carta *,char *,int,int); //imposta la carta
void AggiungiCarta(Mazzo *,Carta); //aggiunge una carta al mazzo
void Mischia(Mazzo *); //mischia il mazzo
void DaiCarta(List_utente *,Mazzo *,int);
int NumCarte(Mazzo *); //indica il numero di carte nel mazzo
void PrendiCarta(Mazzo *,Carta *);//Preleva una carta da un mazzo
void StampaMazzo(Mazzo *,int); //stampa il mazzo desiderato
void GetCard(Utente *,Mazzo *);
void AddCard(Mazzo *,Carta);

//Funzioni per la partita
void DaiLePrimeCarte(List_utente *, Mazzo *mazzo);//distribuzione prima mano
void TakeCards(List_utente *,Mazzo *);// ritira carte usate
int EndGame(List_utente *); // verifica se la partita è finita
void BetMenu(Utente *); // menù per la puntata
int Bet(Utente *,int); // imposta il valore della puntata
int GetDealer(List_utente *); // cerca il banco
void SetFirstTurn(List_utente *); // imposta l'utente del primo turno

int main(){
	Mazzo mazzo;
	Mazzo mazzo_old;
	int Menu, MenuContinua;
	int num_giocatori;
	int soldi;
	int fine_partita=0;
	int turn = 2;
	int sc = 1;
	int i;
	char c;
	List_utente list;
	char nome[MAX_STR+1];
	Utente utente;

	do
	{
		Menu = menu();		
		InitListUtente(&list);
		switch(Menu)
		{
		case 1:
			ImpostaNomeGiocatore(nome);//OK
			num_giocatori=1; //OK; imposta il numero di pc
			soldi = SetMenuSoldi(); //OK;
			PreparaPC(&list,num_giocatori,soldi);//OK
			PreparaUmano(&list,nome,soldi);//OK
			InitMazzo(&mazzo);//OK
			InitMazzo(&mazzo_old);//OK
			printf("Preparo il mazzo...\n");
			PreparaMazzo(&mazzo);//OK
			printf("Mischio il mazzo...\n");
			Mischia(&mazzo);//OK
			num_giocatori++; //imposto in numero giocatori a 2
			printf("Numero giocatori: %d\n", num_giocatori);
			while((c = getchar()) != '\n' && c != EOF);//Pulizia scanf
			Pausa();
			break;
		case 2:
			Load(&list,&mazzo,&mazzo_old);
			num_giocatori = NumElList(&list);
			break;
		case 3:
			break;
		}
			if(Menu!=3)
			{
				printf("Distribuisco la prima mano...\n");
				DaiLePrimeCarte(&list,&mazzo);//OK
				fine_partita=EndGame(&list);
				while(fine_partita!=FINITA)
				{
					printf("\nSituazione giocatori:\n");
					StampaStatoTutti(&list,NON_MOSTRA);//OK
					PrendiUtenteTurno(&list,&utente);//OK
					printf("\nTurno di %s",utente.nome);
					if(Ebanco(&utente)==BANCO)
					{
						printf(": il banco.\n\n");
						SetUserTurn(&list,&utente);
						if(SeUmano(&utente)==UMANO)
								MenuGiocoBanco(&list, &utente,&mazzo,&mazzo_old);
							else
								MenuGiocoBancoPC(&list, &utente,&mazzo,&mazzo_old);
							/*if(Punteggio(&utente.mazzo,0)==8 || Punteggio(&utente.mazzo,0)==9)
							{
								for(i=0;i<50;i++){
									printf("O");
								}
								printf("\n");
								printf("%s ha fatto un naturale, deve aprire le carte...\n", utente.nome);
								for(i=0;i<50;i++){
									printf("O");
								}
								printf("\n");
								StampaStato(&utente, MOSTRA);
							}*/
							SetUserTurn(&list,&utente);
							//Confronto carte
							Valute(&list); 
							//Mostra tutte le carte e i punteggi
							printf("\n\nRiepilogo fine mano.\n\n");
							StampaStatoTutti(&list,MOSTRA);
							//Riprendo le carte da tutti i giocatori e le metto nel mazzo usato
							printf("Ritiro le carte usate dai giocatori...\n\n");
							TakeCards(&list,&mazzo_old);
							//printf("Rimozione giocatore al verde...\n\n");
							//RemoveLoser(&list);
							filtra(&list);
							//printf("Numero elementi nella lista: %d\n\n", NumElList(&list));
							fine_partita=EndGame(&list);

							if(fine_partita==NON_FINITA)
							{
								printf("\n\nMANO CONCLUSA.\n\n");
								Pausa();
								printf("Vuoi salvare i dati della partita?\n1)SI\n2)NO\n");
								scanf("%d",&sc);
								if(sc==1)
									Save(&list,&mazzo,&mazzo_old);
								MenuContinua = menuContinua();		
								switch(MenuContinua)
								{
								case 1:
									goto continua;
									break;
								case 2:
									goto fine;
									break;
								}
								continua:
								printf("\nProssima  mano...\n");
								printf("\n\nDistribuzione della prima carta.\n\n");
								if(NumCarte(&mazzo)<(num_giocatori*2))
								{
									mazzo = mazzo_old;
									InitMazzo(&mazzo_old);
									Mischia(&mazzo);
								}
								DaiLePrimeCarte(&list,&mazzo);
								SetFirstTurn(&list);
							}
							else
							{
								printf("E' rimasto un solo giocatore...\n\n");
							}
					}
					else
					{
							printf(":\n\n");
							SetUserTurn(&list,&utente);
							if(SeUmano(&utente)==UMANO)
							{
								PlayMenu(&utente,&mazzo,&mazzo_old);
							}
							else
							{
								PlayPC(&utente,&mazzo,&mazzo_old);					
							}
							SetUserTurn(&list,&utente);
							if(Punteggio(&utente.mazzo,0)==8 || Punteggio(&utente.mazzo,0)==9)
							{
								printf("\n\n%s ha fatto un naturale, deve aprire le carte...\n\n", utente.nome);
								StampaStato(&utente, MOSTRA);
							}
							printf("\nMano al banco...\n\n");

							Pausa();
							NextTurn(&list);
					}
					fine_partita=EndGame(&list);
				}
			}
				//Fine partita
			fine:
			printf("\n\nPARTITA FINITA\n\n");
	}while(Menu!=3);
	while((c = getchar()) != '\n' && c != EOF);
	Pausa();
	return 0;
}

//PushEnd
/*
Inserisce alla fine della lista un nuovo elemento di tipo User
INGRESSO:
list: lista nella quale inserire un elemento
utente: elemento da inserire nella lista

USCITA:
list: lista dei giocatori aggiornata (con il giocatore inserito)
*/
void PushEnd(List_utente *list,Utente *utente)
{
	El_list_utente *tmp;
	El_list_utente *ptr = list->inizio;

	tmp = (El_list_utente *)malloc(sizeof(El_list_utente));
	if(tmp == NULL)
		printf("Impossibile inserire utente\n");
	else
	{
		tmp->el = *utente;
		tmp->next = NULL;

		if(list->numel == 0)
		{
			list->inizio = tmp;
			list->numel++;
			printf("Utente inserito in coda...\n");
		}
		Pausa();
		while(ptr->next != NULL)
			ptr = ptr->next;
		ptr->next = tmp;
		list->numel++;
	}
}

//AggiungiGiocatoreInCoda
/*
Funzione che aggiunge un giocatore nella lista dei giocatori (inserisce alla fine) tramite la funzione PushEnd.
INGRESSO:
list: lista dei giocatori
el: elemento da aggiungere alla lista (utente)

USCITA:
list: lista dei giocatori con i dati aggiornati
*/
void AggiungiGiocatoreInCoda(List_utente *list,Utente *el)
{
	PushEnd(list,el);
}

//Load
/*
Funzione che carica la partita salvata.
USCITA:
list: lista dei giocatori
deck: mazzo corrente
deck_old: mazzo già usato
*/
void Load(List_utente *list,Mazzo *mazzo,Mazzo *mazzo_old)
{
	FILE *f;
	El_list_utente *tmp = list->inizio;
	Utente utente;
	int i,n;
	char c;

	f = fopen(FILENAME,"rb");
	if(f == NULL)
		printf("Impossibile aprire il file...\n");

	if(fread(&n,sizeof(int),1,f) == 0)
		printf("Numero di elementi uguale a 0...\n");
	else
	{
		fread(&n,sizeof(int),1,f);
		printf("Elementi caricati: %d", &n);
		Pausa();
		for(i=0;i<n;i++)
		{
			if(fread(&utente,sizeof(Utente),1,f) == 0) 
				printf("Impossibile leggere i dati del giocatore...\n");
			else{
				fread(&utente,sizeof(Utente),1,f);
				printf("Giocatore letto...\n");
				/*while (!feof(f)){ 
					printf("%s%d",utente.nome,utente.soldi);
					fread(&utente,sizeof(Utente),1,f);
					while((c = getchar()) != '\n' && c != EOF);
					Pausa();
				}*/
				while((c = getchar()) != '\n' && c != EOF);
				Pausa();
				AggiungiGiocatoreInCoda(list,&utente);
				printf("Giocatore caricato in lista...\n");
			}
		}
	
		/*if(fread(mazzo,sizeof(Mazzo),1,f) == 0) 
			printf("Impossibile leggere il mazzo...\n");
		else fread(mazzo,sizeof(Mazzo),1,f);

		if(fread(mazzo_old,sizeof(Mazzo),1,f) == 0) 
			printf("Impossibile leggere il mazzo usato...\n");
		else fread(mazzo_old,sizeof(Mazzo),1,f);*/

		fclose(f);

		printf("File caricato correttamente...\n");
	}
}


//Save
/*
Funzione che salva la partita corrente.
INGRESSO:
list: lista dei giocatori
deck: mazzo corrente
deck_old: mazzo già usato

VALORE DI RITORNO:
Ritorna vero se va tutto a buon fine.
*/
void Save(List_utente *list,Mazzo *mazzo,Mazzo *mazzo_old)
{
	FILE *f;
	El_list_utente *tmp = list->inizio;

	f = fopen(FILENAME,"wb");

	if(f == NULL)
		printf("Impossibile salvare il file...\n");
	else{
		//Salvo il numero di giocatori
		fwrite(&list->numel,sizeof(int),1,f);

		//Salvo i giocatori
		while(tmp!=NULL)
		{
			fwrite(&tmp->el,sizeof(Utente),1,f);
			tmp = tmp->next;
		}

	
		//fwrite(mazzo,sizeof(Mazzo),1,f);

		//fwrite(mazzo_old,sizeof(Mazzo),1,f);

		fclose(f);

		printf("Partita salvata correttamente...\n");
	}
}

//filtra
/*
Funzione che filtra la lista eliminando i giocatori senza denaro
INGRESSO:
list: lista dei giocatori

USCITA:
list: lista dei giocatori aggiornata
*/
void filtra(List_utente *list){
	El_list_utente *prev_ptr, *curr_ptr, *kill_ptr;
	El_list_utente *tmp = list->inizio;
  
	if ((list->inizio) == NULL)
    
	return;
  
	while(list->inizio->el.soldi ==0){
      
		kill_ptr = list->inizio;
      
		list->inizio = list->inizio->next;
		
		printf("%s ha finito il denaro, sara' eliminato...\n\n", kill_ptr->el.nome);
      
		free(kill_ptr);

		list->numel--;
      
		if (list->inizio == NULL)
        
		return;
  
	}
  
	prev_ptr = list->inizio;
  
	curr_ptr = list->inizio->next;
  
	while(curr_ptr != NULL){
      
		if(curr_ptr->el.soldi>0){
          
			prev_ptr = curr_ptr;
          
			curr_ptr = curr_ptr->next;
      
		}
      
		else{
          
			kill_ptr = curr_ptr;
          
			prev_ptr->next = curr_ptr->next;
          
			curr_ptr = curr_ptr->next;

			printf("%s ha finito il denaro, sara' eliminato...\n\n", kill_ptr->el.nome);
          
			free(kill_ptr);

			list->numel--;
      
		}
  
	}


}
//IsLoser
/*
Funzione che dice se il giocatore in ingresso è perdente.
INGRESSO:
utente: giocatore

VALORE DI RITORNO:
Ritorna 0 se il giocatore non possiede più denaro, altrimenti ritorna 1.
*/
int IsLoser(Utente *utente)
{
	if(utente->soldi == 0)
		return 0;
	else
		return 1;
}

//RemoveLoser
/*
Funzione che elimina i giocatori che hanno perso.
INGRESSO:
list: lista di giocatori

USCITA:
list: lista di giocatori aggiornata
*/
void RemoveLoser(List_utente *list)
{
	int perdente=IsLoser(&list->inizio->el);
	El_list_utente *tmp = list->inizio;
	El_list_utente *next;
	Pausa();
	while(perdente==0) //qui c'è il problema
	{
		next = list->inizio->next;
		list->numel--;
		list->inizio = next;
	}
	Pausa();
	while(tmp->next!=NULL)
	{
		perdente=IsLoser(&tmp->next->el);
		if(perdente==0)
		{
			next = tmp->next->next;
			list->numel--;
			free(tmp->next);
			tmp->next = next;
		}
		else
			tmp = tmp->next;
	}
}

//Pausa
/*
Funzione che interrompe l'esecuzione del programma fino alla digitazione del tasto INVIO
*/
void Pausa(void)
{
int invio;
printf("\n - Premi INVIO per continuare - \n");
invio = getchar();
}

//GetDealer
/*
Funzione che mi dice quale giocatore è il mazziere
INGRESSO:
list: lista dei giocatori

VALORE DI RITORNO:
ritorna un intero che va da 1 al numero di giocatori.
ritorna 0 se non trova il mazziere
*/
int GetDealer(List_utente *list)
{
	El_list_utente *tmp;
	int cont = 1;
	
	tmp = list->inizio;

	while(tmp->next != NULL && tmp->el.ruolo==GIOCATORE)
	{
		tmp = tmp->next;
		cont++;
	}
	if(tmp->el.ruolo==BANCO)		
		return cont;

	return 0;
}

//SetFirstTurn
/*
Funzione che setta il giocatore del primo turno.
INGRESSO:
list: lista di giocatori

USCITA:
list: lista di giocatori aggiornata
*/
void SetFirstTurn(List_utente *list)
{
	El_list_utente *tmp = list->inizio;
	int dealer = GetDealer(list)-1;
	int i = 0;
	while(tmp!=NULL)
	{
		tmp->el.turno = NON_TURNO;
		tmp = tmp->next;
	}
	tmp = list->inizio;
	while(tmp!=NULL && i<dealer)
	{
		tmp = tmp->next;
		i++;
	}
	
	if(tmp->next == NULL)
		list->inizio->el.turno = SI_TURNO;
	else
		tmp->next->el.turno = SI_TURNO;
}

//TakeCards
/*
Funzione che ritira le carte da tutti i giocatori e le mette nel mazzo delle carte già usate.
INGRESSO:
list: lista dei giocatori
mazzo_old: mazzo già usato

USCITA:
mazzo_old: mazzo già usato con le nuove carte in aggiunta
*/
void TakeCards(List_utente *list,Mazzo *mazzo_old)
{
	El_list_utente *tmp = list->inizio;
	int i,n;
	Carta carta;

	while(tmp!=NULL)
	{
		n = NumCarte(&tmp->el.mazzo);
		for(i=0;i<n;i++)
		{
			PrendiCarta(&tmp->el.mazzo,&carta);
			AddCard(mazzo_old,carta);
		}
		tmp = tmp->next;
	}
}


//ContaSoldi
/*
Funzione che dice quanto patrimonio ha il giocatore in ingresso.
INGRESSO:
user: giocatore

VALORE DI RITORNO:
Ritorna il patrimonio del giocatore.
*/
int ContaSoldi(Utente *utente)
{
	return utente->soldi;
}

//Valute
/*
Funzione che valuta lo stato della partita e paga i vari giocatori.
INGRESSO / USCITA:
list: lista di tutti i giocatori
*/
void Valute(List_utente *list)
{	
	//char c;
	El_list_utente *tmp = list->inizio,*banco;
	int i = 0, x=0, soldi_banco, dealer=GIOCATORE;
	
	//Cerco il dealer
	while(tmp!=NULL && dealer!=BANCO)
	{
		dealer=Ebanco(&tmp->el);
		if(dealer==BANCO)
			banco = tmp; //tmp è banco
		else
			tmp = tmp->next;
	}
	tmp = list->inizio;
	
	soldi_banco=ContaSoldi(&banco->el);

	while(tmp!=NULL && soldi_banco!=0)
	{
		if(Ebanco(&tmp->el)!=BANCO)
		{
			if(Punteggio(&banco->el.mazzo,0)>=Punteggio(&tmp->el.mazzo,0))
			{
				//Il giocatore paga il banco
				printf("\nVINCE IL BANCO, IL GIOCATORE PAGA\n");
				banco->el.soldi += tmp->el.puntata;
				tmp->el.soldi -= tmp->el.puntata;
				tmp->el.puntata = 0;
				
				Pausa();
			}
			else
			{
				//Il banco paga il giocatore
				if(Punteggio(&banco->el.mazzo,0)<Punteggio(&tmp->el.mazzo,0))
				{
					printf("\nVINCE IL GIOCATORE, IL BANCO PAGA\n");
			
					Pausa();
					if(banco->el.soldi>=tmp->el.puntata) //se ha un patrimonio maggiore della puntata paga il valore della puntata
					{
						banco->el.soldi -= tmp->el.puntata;
						tmp->el.soldi += tmp->el.puntata;
						tmp->el.puntata = 0;
					}
					else
					{
						tmp->el.soldi += banco->el.soldi; // se ha un patrimonio minore della puntata da tutti i suoi soldi al giocatore
						banco->el.soldi = 0;
						tmp->el.puntata= 0;
					}
				}
			}
		}
		tmp = tmp->next;

	}
}

//MenuGiocoBancoPC
/*
Funzione che fa giocare il pc come mazziere.
INGRESSO:
utente: giocatore
mazzo: mazzo attuale
mazzo_old: mazzo già usate

USCITA:
utente: giocatore
mazzo: mazzo attuale
mazzo_old: mazzo già usate
*/
void MenuGiocoBancoPC(List_utente *list, Utente *utente,Mazzo *mazzo,Mazzo *mazzo_old)
{
	char c;
	int score, x=0;
	El_list_utente *tmp = list->inizio, *umano;
	score=Punteggio(&utente->mazzo,0);
	
	if(SeUmano(utente)==UMANO)
		return;

	//Cerco UMANO per fare confronto punteggi
	while(tmp!=NULL && x!=1)
	{
		if(SeUmano(&tmp->el))
		{
			umano = tmp;
			x=1;
		}
		else
			tmp = tmp->next;
	}
	tmp = list->inizio;

	StampaMazzo(&utente->mazzo,0);
	//PrintStatus(user,DEBUG_MODE);
	printf("Il tuo punteggio attuale e': %d\n\n",Punteggio(&utente->mazzo,0));
	Pausa();
	if(score==8 || score==9)
	{
		printf("%s ha un naturale, apre le carte...\n", &utente->nome);
		StampaMazzo(&utente->mazzo,0);
		
		Pausa();
	}
		else 
			if(score==7)
			{
				printf("Devi stare...\n");
				StampaMazzo(&utente->mazzo,0);
				
				Pausa();
			}
			else
				if(score==6)
				{
					if(Punteggio(&umano->el.mazzo,2)==6 || Punteggio(&umano->el.mazzo,2)==7)
					{
					GetCard(utente,mazzo);
					StampaMazzo(&utente->mazzo,0);
					
					Pausa();
					}
					else printf("Devi stare...\n");
				}
				else
					if(score==5)
					{
						if(Punteggio(&umano->el.mazzo,2)>=4 && Punteggio(&umano->el.mazzo,2)<=7)
						{
						GetCard(utente,mazzo);	
						StampaMazzo(&utente->mazzo,0);
					
						Pausa();
						}
						else printf("Devi stare...\n");
					}
					else
						if(score==4)
						{
							if(Punteggio(&umano->el.mazzo,2)>=2 && Punteggio(&umano->el.mazzo,2)<=7)
							{
							GetCard(utente,mazzo);
							StampaMazzo(&utente->mazzo,0);
		
							Pausa();
							}
							else printf("Devi stare...\n");
						}
						else
							if(score==3)
							{
								if(Punteggio(&umano->el.mazzo,2)>=1 && Punteggio(&umano->el.mazzo,2)<=7)
								{
								GetCard(utente,mazzo);	
								StampaMazzo(&utente->mazzo,0);
							
								Pausa();
								}
								else printf("Devi stare...\n");
							}
							else
							{
								GetCard(utente,mazzo);	
								StampaMazzo(&utente->mazzo,0);
								
								Pausa();
							}
	//PrintStatus(user,DEBUG_MODE);
	printf("Il tuo punteggio attuale e': %d\n\n",Punteggio(&utente->mazzo,0));
}

//EndGame
/*
Funzione che dice se la partita è finita.
INGRESSO:
list: lista dei giocatori

VALORE DI RITORNO:
Ritorna vero se la partita è finita.
*/
int EndGame(List_utente *list)
{
	El_list_utente *tmp = list->inizio;

	if(NumElList(list) == 1 && SeUmano(&list->inizio->el)==UMANO)
		return FINITA;

	while(tmp!=NULL)
	{
		if(SeUmano(&tmp->el)==UMANO)
			return NON_FINITA;
		tmp = tmp->next;
	}
	return FINITA;
}

//NextTurn
/*
Funzione che cambia il turno.
INGRESSO:
list: lista di giocatori

USCITA:
list: lista di giocatori aggiornata
*/
void NextTurn(List_utente *list)
{
	El_list_utente *tmp = list->inizio;
	while(tmp!=NULL)
	{
		if(tmp->el.turno=SI_TURNO && tmp->next!=NULL)
		{
			tmp->next->el.turno = SI_TURNO;
			tmp->el.turno = NON_TURNO;
			return;
		}
		else if(tmp->el.turno==SI_TURNO && tmp->next==NULL)
		{
			list->inizio->el.turno = SI_TURNO;
			tmp->el.turno = NON_TURNO;
			return;
		}

		tmp = tmp->next;
	}
}

//PlayPc
/*
Funzione che fa giocare il computer (non quando è mazziere)
INGRESSO:
user: giocatore in ingresso
deck: mazzo corrente
deck_old: mazzo delle carte già uscite. Se deck è vuoto, deck_old viene rimesso in deck e rimescolato

USCITA:
user: giocatore aggiornato (con la carta pescata)
deck: mazzo del giocatore aggiornato
deck_old: mazzo delle carte già uscite aggiornato
*/
void PlayPC(Utente *utente,Mazzo *mazzo,Mazzo *mazzo_old)
{
	if(SeUmano(utente))
		return;

	//BetPC(user);
	//printf("\n\nIl giocatore %s ha puntato: %d\n\n",user->name,user->bet);
	while(Punteggio(&utente->mazzo,0) < 6)
	{
		GetCard(utente,mazzo);	
	}
	StampaMazzo(&utente->mazzo,0);
	printf("Il punteggio delle carte scoperte e': %d\n\n",Punteggio(&utente->mazzo,2));
}

//PlayMenu
/*
Funzione che fa giocare il giocatore umano (non quando è mazziere)
INGRESSO:
utente: giocatore
mazzo: mazzo attuale
mazzo_old: mazzo già usate

USCITA:
utente: giocatore
mazzo: mazzo attuale
mazzo_old: mazzo delle carte già uscite.
*/
void PlayMenu(Utente *utente,Mazzo *mazzo,Mazzo *mazzo_old)
{
	char c;
	//int op; 
	int x=0, score;
	//Card card;
	score=Punteggio(&utente->mazzo,0);
	BetMenu(utente);
	if(score==8 || score==9)
	{
		StampaMazzo(&utente->mazzo,0);
		printf("\nHai fatto un naturale: %d, devi stare e aprire le carte.\n\n",Punteggio(&utente->mazzo,0));
	}
	else
			if(score==6 || score==7)//se punteggio uguale a 6 o 7 si ferma, se minore di 6 riceve un altra carta
			{
				StampaMazzo(&utente->mazzo,0);
				printf("\nHai: %d, devi stare.\n\n",Punteggio(&utente->mazzo,0));
			}
			else{
		do
		{		
			StampaMazzo(&utente->mazzo,0);
			printf("Hai meno di 6...\n");
			printf("Ricevi la terza carta...\n");
			while((c = getchar()) != '\n' && c != EOF);
			Pausa();
			GetCard(utente,mazzo);
			StampaMazzo(&utente->mazzo,0);
			printf("Il tuo punteggio dopo la terza carta e': %d, non puoi avere altre carte.\n\n",Punteggio(&utente->mazzo,0));
			x++;
	
		}while((Punteggio(&utente->mazzo,0) < 6) && x<1);
	}
		/* PlayMenu vecchio
		printf("Scegli\n");
		printf("1) Chiedi carta\n2) Stai\n");
		scanf("%d",&op);

		if(op<1 || op>2)
			printf("\n\nATTENZIONE: inserisci un valore tra 1 e 2.\n\n");

		switch(op)
		{
		case 1:
				
				//*deck = *deck_old;
				//ShuffleDeck(deck);
				//InitDeck(deck_old);
			
				GetCard(utente,mazzo);		
				x++;
			break;
		case 2:
			break;
		}
		StampaMazzo(&utente->mazzo,0);
		printf("Il tuo punteggio attuale e': %d, non puoi chiedere altre carte.\n\n",Punteggio(&utente->mazzo,0));
	}while((op<1 || op>2) || (op!=2 && Punteggio(&utente->mazzo,0) < 6) && x<1);
	*/
}

//BetMenu
/*
Menu per il giocatore umano per scommettere
INGRESSO:
utente: giocatore in ingresso

USCITA:
utente: giocatore con la puntata impostata
*/
void BetMenu(Utente *utente)
{
	int bet, x=0;
	do
	{
		printf("\nInserisci la tua puntata: ");
		while(scanf("%d",&bet) != 1){ //controllo inserimento numero e non stringa
			printf("Errore, inserisci un numero intero:\n");
			/* rimuovo eventuali caratteri rimasti nel buffer fino al newline */
			while (getchar() != '\n');
		}
		if(bet>utente->soldi || bet<=0)
			printf("\n\nATTENZIONE: il tuo patrimonio e' %d, non puoi scommettere %d.\n\n",utente->soldi,bet);
		x=Bet(utente,bet);	
		
	}while(x!=1);
	printf("\n");
}

//Bet
/*
Funzione per scommettere.
INGRESSO:
user: giocatore
bet: valore della scommessa

USCITA:
user: giocatore con la scommessa effettuata

VALORE DI RITORNO:
Ritorna 1 se la scommessa va a buon fine.
*/
int Bet(Utente *utente,int bet)
{
	if(bet>utente->soldi || bet<=0)
		return NO;

	utente->puntata = bet;
	return SI;
}

//SetUserTurn
/*
Funzione che imposta(aggiorna) i nuovi parametri del giocatore corrente.
INGRESSO:
list: lista di giocatori
utente: giocatore contenente i nuovi parametri

USCITA:
list: lista di giocatori aggiornata
*/
void SetUserTurn(List_utente *list,Utente *utente)
{
	El_list_utente *tmp = list->inizio;
	while(tmp!=NULL && !tmp->el.turno)
		tmp=tmp->next;

	tmp->el = *utente;
}

//MenuGiocoBanco
/*
Funzione che fa giocare il giocatore umano come mazziere.
INGRESSO:
utente: giocatore
mazzo: mazzo attuale
mazzo_old: mazzo già usate

USCITA:
utente: giocatore
mazzo: mazzo attuale
mazzo_old: mazzo già usate
*/
void MenuGiocoBanco(List_utente *list, Utente *utente,Mazzo *mazzo,Mazzo *mazzo_old)
{
	int op;
	//Card card;
	
	StampaMazzo(&utente->mazzo,0);
	printf("\n\nIl tuo punteggio attuale e': %d\n\n",Punteggio(&utente->mazzo,0));

	do
	{		

		printf("Menu' Umano se Banco. Scegli\n");
		printf("1) Chiedi carta\n2) Stai\n");
		scanf("%d",&op);

		if(op<1 || op>2)
			printf("\n\nATTENZIONE: inserisci un valore tra 1 e 2.\n\n");

		switch(op)
		{
		case 1:
				/*
				*deck = *deck_old;
				ShuffleDeck(deck);
				InitDeck(deck_old);
				*/
				GetCard(utente,mazzo);		
			break;
		case 2:
			break;
		}
		StampaMazzo(&utente->mazzo,0);		
		printf("Il tuo punteggio attuale e': %d\n\n",Punteggio(&utente->mazzo,0));
	}while((op<1 || op>2) || (op!=2 && Punteggio(&utente->mazzo,0) < 6));
}

//AddCard
/*
Inserisce una carta in un mazzo
INGRESSO:
mazzo: mazzo in cui inserire una carta
carta: carta da inserire nel mazzo

USCITA:
mazzo: mazzo aggiornato (con la carta inserita)

*/
void AddCard(Mazzo *mazzo,Carta carta)
{
	if(mazzo->num_carte<MAX_CARD)
	{
		mazzo->carte_mazzo[mazzo->num_carte] = carta;
		mazzo->num_carte++;
	}
	else printf("Non posso aggiungere la carta al mazzo...\n");
}

//GetCard
/*
Preleva una carta da un mazzo e la sposta nel mazzo personale di un giocatore
INGRESSO:
utente: giocatore in ingresso
mazzo: mazzo dal quale viene prelevata la carta 

USCITA:
utente: giocatore con la carta aggiunta
mazzo: mazzo con la carta sottratta
*/
void GetCard(Utente *utente,Mazzo *mazzo)
{
	Carta carta;
	PrendiCarta(mazzo,&carta);
	AddCard(&utente->mazzo,carta);
}

//Punteggio
/*
Funzione che conta il punteggio del mazzo che viene inviato in ingresso.
INGRESSO:
mazzo: lista del mazzo (può essere quello totale o quello di un giocatore)
from: indice della carta da cui si inizia a contare il punteggio. 
      0-> conta anche il valore della carta coperta
	  1-> conta il punteggio delle carte scoperte

VALORE DI RITORNO:
ritorna il punteggio del mazzo
*/
int Punteggio(Mazzo *mazzo,int from)
{
	int punteggio = 0;
	int i;
	for(i=from;i<NumCarte(mazzo);i++)
	{
		punteggio += mazzo->carte_mazzo[i].val;
	}
	if (punteggio>=10)
		punteggio = punteggio - 10;
	return punteggio;
}

//Ebanco
/*
Funzione che dice se il giocatore è il banco.
INGRESSO:
utente: giocatore

VALORE DI RITORNO:
Ritorna se il giocatore in ingresso è il banco.
*/
int Ebanco(Utente *utente)
{
	return utente->ruolo;
}

//PrendiUtenteTurno
/*
Funzione che permette di conoscere tutti i parametri del giocatore del turno corrente.
INGRESSO:
list: lista di giocatori

USCITA:
utente: giocatore del turno corrente
*/
void PrendiUtenteTurno(List_utente *list,Utente *utente)
{
	El_list_utente *tmp = list->inizio;
	while(tmp!=NULL && tmp->el.turno==NON_TURNO)
		tmp=tmp->next;

	*utente = tmp->el;
}

//StampaMazzo
/*
Funzione che stampa un mazzo.

INGRESSO:
mazzo: mazzo da stampare
*/
void StampaMazzo(Mazzo *mazzo,int start)
{
	int i;
	
	printf("Carta\t\t| Seme\t\t| Valore\n");
	for(i = 0;i<50;i++)
		printf("-");
	printf("\n");
	for(i=0;i<start;i++)
		printf("Carta coperta.\n");
	for(i = start;i<mazzo->num_carte;i++)
	{
		printf("%s\t\t",mazzo->carte_mazzo[i].nome);
		switch(mazzo->carte_mazzo[i].seme)
		{
			case CUORI:
				printf(" CUORI\t\t");
				break;
			case QUADRI:
				printf(" QUADRI\t\t");
				break;
			case FIORI:
				printf(" FIORI\t\t");
				break;
			case PICCHE:
				printf(" PICCHE\t\t");
				break;
		}
		printf(" %d\n",mazzo->carte_mazzo[i].val);
	
	}
	
}

//StampaStatoTutti
/*
Funzione che stampa i dati di tutti i giocatori.
INGRESSO:
list: lista di giocatori

USCITA:
list: lista di giocatori aggiornata
*/
void StampaStatoTutti(List_utente *list,int showall)
{
	El_list_utente *tmp = list->inizio;

	while(tmp!=NULL)
	{
		StampaStato(&tmp->el,showall);
		printf("\n");
		tmp = tmp->next;
	}
}

//StampaStato
/*
Funzione che stampa i dati relativi a un giocatore solo.
INGRESSO:
list: lista di giocatori
showall: MOSTRA-> mostra tutte le carte
		 NON_MOSTRA-> non mostra le carte coperte

USCITA:
list: lista di giocatori aggiornata
*/
void StampaStato(Utente *utente,int showall)
{
	int i;
	for(i=0;i<50;i++)
		printf("-");
	printf("\n");

	printf("Nome: %s\n",utente->nome);
	printf("Banco: ");
	if(utente->ruolo==BANCO)
		printf("SI\n");
	else
		printf("NO\n");
	printf("Soldi: %d\n",utente->soldi);
	printf("Puntata: ");
	if(utente->puntata == 0)
		printf("non e' stato puntato nulla.\n");
	else
		printf("%d\n",utente->puntata);
	printf("Di turno: ");
	if(utente->turno == SI_TURNO)
		printf("SI, e' il suo turno\n");
	else
		printf("NO, non e' il suo turno\n");

	if(showall==MOSTRA || SeUmano(utente)==UMANO)
		StampaMazzo(&utente->mazzo,0);
	else StampaMazzo(&utente->mazzo,2);
}

//SeUmano
/*
Funzione che dice se il giocatore in ingresso è umano.
INGRESSO:
utente: giocatore

VALORE DI RITORNO:
Ritorna 0 se il giocatore è umano, 1 se PC.
*/
int SeUmano(Utente *utente)
{
	if(utente->tipo == UMANO)
		return UMANO;
	else return PC;
}

//DaiCarta
/*
Funzione che da una carta ad un giocatore
INGRESSO:
list: lista dei giocatori
mazzo: mazzo dal quale prelevare la carte da dare al giocatore scelto
num_giocatore: indice del giocatore scelto

USCITA:
list: lista dei giocatori aggiornata 
mazzo: mazzo dal quale è stata tolta una carta
*/
void DaiCarta(List_utente *list,Mazzo *mazzo,int num_giocatore){
	Carta carta;
	int num = NumCarte(mazzo);
	El_list_utente *tmp;
	int cont = 1;

	if(num<=0)
		printf("Carte terminate\n");

	PrendiCarta(mazzo,&carta);
	
	tmp = list->inizio;
	while(tmp != NULL && cont<num_giocatore)
	{
		tmp = tmp->next;
		cont++;
	}
	AggiungiCarta(&tmp->el.mazzo,carta);
}

//PrendiCarta
/*
Funzione che preleva una carta da un mazzo
INGRESSO:
mazzo: mazzo dal quale prelevare la carta
carta: carta da prelevare

USCITA:
mazzo: mazzo aggiornato
carta: carta prelevata
*/
void PrendiCarta(Mazzo *mazzo,Carta *carta)
{
	int num = NumCarte(mazzo);
	if(num<=0)
	{
		printf("Non posso prelevare la carta\n");
	}
	*carta = mazzo->carte_mazzo[num-1];
	mazzo->num_carte--;

	//printf("Carta prelevata...\n");
}

//NumCarte
/*
Funzione che conta il numero di carte in un mazzo
INGRESSO:
mazzo: mazzo in cui contare le carte

VALORE DI RITORNO:
il numero di carte del mazzo scelto
*/
int NumCarte(Mazzo *mazzo)
{
	return mazzo->num_carte;
}

//DaiLePrimeCarte
/*
Funzione che da le prime due carte ai giocatori
INGRESSO:
list: lista dei giocatori
mazzo: mazzo dal quale prelevare le carte da dare ai giocatori

USCITA:
list: lista dei giocatori aggiornata 
mazzo: mazzo dal quale sono state prelevate le carte
*/
void DaiLePrimeCarte(List_utente *list,Mazzo *mazzo)
{
	int num_giocatori = NumElList(list);
	int i;

	for(i=0;i<num_giocatori;i++)
	{
			DaiCarta(list,mazzo,i+1);
			DaiCarta(list,mazzo,i+1);
	}
}

//NumElList
/*
Funzione che conta il numero di giocatori nella lista
INGRESSO:
list: lista dei giocatori

VALORE DI RITORNO
ritorna il numero di elementi della lista
*/
int NumElList(List_utente *list)
{
	return list->numel;
}

//Mischia
/*
Funzione che mischia il mazzo.

INGRESSO:
mazzo: mazzo da mischiare

USCITA:
mazzo: mazzo mischiato
*/
void Mischia(Mazzo *mazzo)
{
	int i;
	Carta tmp;
	int first,second;
	
	srand( (unsigned)time( NULL ) );

	for(i=0;i<MAX_SHUFFLE;i++)
	{
		first = rand()%NumCarte(mazzo);	
		second = rand()%NumCarte(mazzo);

		tmp = mazzo->carte_mazzo[first];
		mazzo->carte_mazzo[first] = mazzo->carte_mazzo[second];
		mazzo->carte_mazzo[second] = tmp;
	}
	
}

//Aggiungi carta
/*
Inserisce una carta in un mazzo
INGRESSO:
mazzo: mazzo in cui inserire una carta
carta: carta da inserire nel mazzo

USCITA:
mazzo: mazzo aggiornato (con la carta inserita)

*/
void AggiungiCarta(Mazzo *mazzo,Carta carta)
{
	if(mazzo->num_carte<MAX_CARD)
	{
		mazzo->carte_mazzo[mazzo->num_carte] = carta;
		mazzo->num_carte++;
		//printf("Carta aggiunta al mazzo\n");
	}
	else printf("Non ho potuto aggiungere la carta\n");
}

//PreparaMazzo
/*
Preparo il mazzo con le carte in ordine.

INGRESSO:
mazzo: da preparare

USCITA:
mazzo: preparato
*/

void PreparaMazzo(Mazzo *mazzo)
{
	int i,j;
	Carta carta;
	int semi[4] = {CUORI,QUADRI,FIORI,PICCHE};
	char carte[13][MAX_STR+1] = {"asso","due","tre","quattro","cinque","sei","sette","otto","nove","dieci","jack","donna","re",};
	InitMazzo(mazzo);
	
	for(i=0;i<4;i++)
	{
		for(j=0;j<9;j++)
		{
			ImpostaCarta(&carta,carte[j],semi[i],(int)(j+1));
			AggiungiCarta(mazzo,carta);
		}
		
		for(;j<13;j++)
		{
			ImpostaCarta(&carta,carte[j],semi[i],(int)(j-j));
			AggiungiCarta(mazzo,carta);
		}
	}
}

//ImpostaCarta
/*
Imposto una carta (seme e valore)
INGRESSO:
nome: carta da settare
val: numero della carta
seme: seme della carta
valore: valore che ha la carta nel gioco (1,2,3,4,5,6,7,8,9 e 0 per 10 e figure)

USCITA:
carta: carta inizializzata con numero, valore e seme
*/
void ImpostaCarta(Carta *carta,char *nome,int seme,int val)
{
	carta->seme = seme;
	carta->val = val;

	strcpy(carta->nome,nome);
}


//PreparaUmano
/*
Funzione che inizializza i dati del giocatore umano
INGRESSO:
list: lista dei giocatori
nome: stringa che contiene il nome
soldi: quantità iniziale di denaro

USCITA:
list: lista dei giocatori aggiornata
*/
void PreparaUmano(List_utente *list,char *nome,int soldi)
{
	Utente utente;
	
	utente.ruolo= GIOCATORE;
	utente.soldi = soldi;
	utente.puntata = 0;
	utente.turno = SI_TURNO;//imposto il turno sul giocatore umano
	SettaNome(&utente,nome);
	utente.tipo = UMANO;
	InitMazzo(&utente.mazzo);
	AggiungiGiocatoreInTesta(list,&utente);
}

//PreparaPC
/*
Funzione che inizializza i dati dei giocatori del pc
INGRESSO:
list: lista dei giocatori
num_giocatori: numero di giocatori controllati dal pc
soldi: quantità iniziale di denaro

USCITA:
list: lista dei giocatori con i dati aggiornati
*/
void PreparaPC(List_utente *list,int num_giocatori,int soldi)
{
	Utente utente;
	int i;
	char nome[MAX_STR+1];

	for(i=0;i<num_giocatori;i++)
	{
		utente.ruolo = BANCO; //imposto PC come banco
		utente.soldi = soldi;
		utente.puntata = 0;
		utente.turno = NON_TURNO; // 0 no, 1 si
		utente.tipo = PC;
		sprintf(nome,"\"PC%d\"",i+1);
		SettaNome(&utente,nome);
		InitMazzo(&utente.mazzo);
		AggiungiGiocatoreInTesta(list,&utente);

	}
	
}

//AggiungiGiocatoreInTesta
/*
Funzione che aggiunge un giocatore nella lista dei giocatori (inserisce all'inizio) tramite la funzione Push.
INGRESSO:
list: lista dei giocatori
el: elemento da aggiungere alla lista (utente)

USCITA:
list: lista dei giocatori con i dati aggiornati
*/
void AggiungiGiocatoreInTesta(List_utente *list,Utente *el)
{
	Push(list,el);
}

//Push
/*
Inserisce all'inizio della lista un nuovo elemento di tipo User
INGRESSO:
list: lista nella quale inserire un elemento
utente: elemento da inserire nella lista

USCITA:
list: lista dei giocatori aggiornata (con il giocatore inserito)
*/
void Push(List_utente *list,Utente *utente)
{
	El_list_utente *tmp;

	tmp = (El_list_utente *)malloc(sizeof(El_list_utente));
	if(tmp == NULL)
		printf("Impossibile inserire utente\n");

	tmp->el = *utente;
	tmp->next = list->inizio;

	list->inizio = tmp;

	list->numel++;
}

//InitMazzo
/*
Funzione che inizializza un mazzo.

INGRESSO:
mazzo: mazzo da inizializzare

USCITA:
mazzo: mazzo inizializzato (con numero di carte pari a zero)
*/
void InitMazzo(Mazzo *mazzo)
{
	mazzo->num_carte = 0;
}

//SettaNome
/*
Funzione che setta il nome di un giocatore nella struct
INGRESSO:
utente: giocatore interessato
nome: stringa che contiene il nome

USCITA:
utente: giocatore interessato con il nome settato
*/
void SettaNome(Utente *utente,char *nome)
{
	strcpy(utente->nome,nome);
}

//SetMenuSoldi
/*
Funzione che stampa a video il menu che chiede la quota iniziale di denaro che avranno i giocatori.

VALORE DI RITORNO:
num: quota iniziale di denaro
*/
int SetMenuSoldi()
{
	int num;
	do
	{
		printf("\nInserisci il denaro iniziale dei giocatori: ");
		while(scanf("%d",&num) != 1)
		{ //controllo inserimento numero e non stringa
			printf("Errore, inserisci un numero intero:\n");
			/* rimuovo eventuali caratteri rimasti nel buffer fino al newline */
			while (getchar() != '\n');
		}	
		if(num<MIN_MONEY)
			printf("\nATTENZIONE: valore minore a %d non ammissibile\n\n",MIN_MONEY);
	}while(num<MIN_MONEY);
	
	return num;
}

//ImpostaNomeGiocatore
/*
Funzione che chiede al giocatore umano di inserire il proprio nome
INGRESSO:
nome: puntatore alla stringa che contiene il nome (all'inizio vuota)

USCITA:
nome: puntatore alla stringa che contiene il nome inserito
*/
void ImpostaNomeGiocatore(char *nome)
{
	printf("\nInserisci il tuo nome: ");
	scanf("%s",nome);
}


//InitListUtente OK
/*
Inizializza la lista dei giocatori.
INGRESSO:
list: lista dei giocatori

USCITA:
list: lista dei giocatori aggiornata(lista vuota)
*/
void InitListUtente(List_utente *list)
{
	list->numel = 0;
	list->inizio = NULL;
}

//menuContinua OK
int menuContinua()
{	
	int menu;
	do
	{
	/*Inizio elenco delle funzioni disponibili in output*/
	printf("Vuoi giocare un altra mano?\n\n");
	printf("1)Si\n");
	printf("2)No\n");
	/*fine elenco funzioni*/
	printf("Inserisci l'operazione da effettuare: ");
	while(scanf("%d",&menu) != 1) //controllo inserimento numero
		{ 
			printf("Errore, inserisci un numero compreso tra 1 e 2:\n");
			/* rimuovo eventuali caratteri rimasti nel buffer fino al newline */
			while (getchar() != '\n');
		}	
		if(menu<1 || menu>2)
			printf("\nATTENZIONE: inserisci un valore compreso tra 1 e 2\n\n");
	}while(menu<1 || menu>2);
	return menu;
}

//Menu OK
int menu()
{	
	int menu;
	do
	{
	/*Inizio elenco delle funzioni disponibili in output*/
	printf("BACCARA'\n\n");
	printf("1)Nuova Partita\n");
	printf("2)Carica Partita\n");
	printf("3)Esci\n\n");
	/*fine elenco funzioni*/
	printf("Inserisci l'operazione da effettuare: ");
	while(scanf("%d",&menu) != 1) //controllo inserimento numero e non stringa
		{ 
			printf("Errore, inserisci un numero compreso tra 1 e 3:\n");
			/* rimuovo eventuali caratteri rimasti nel buffer fino al newline */
			while (getchar() != '\n');
		}	
		if(menu<1 || menu>3)
			printf("\nATTENZIONE: inserisci un valore compreso tra 1 e 3\n\n");
	}while(menu<1 || menu>3);
	return menu;
}

25 Risposte

  • Re: Problema salvataggio file[RISOLTO]

    In questa porzione di codice
    
       if(fread(&n,sizeof(int),1,f) == 0)
          printf("Numero di elementi uguale a 0...\n");
       else
       {
          fread(&n,sizeof(int),1,f);
    
    perché leggi due volte lo stesso valore?
  • Re: Problema salvataggio file[RISOLTO]

    Quindi quell'else è inutile? mi stai dicendo che quando chiamo la fread nella condizione dell'if non c'è bisogno di andarla a richiamare dopo?
    grazie per la risposta.
  • Re: Problema salvataggio file[RISOLTO]

    ururi1989 ha scritto:


    quindi quell'else è inutile? mi stai dicendo che quando chiamo la fread nella condizione dell'if non c'è bisogno di andarla a richiamare dopo?
    grazie per la risposta.
    oddio non l'else, semplicemente la ripetizione di fread... sono fuso..
  • Re: Problema salvataggio file[RISOLTO]

    oregon ha scritto:


    In questa porzione di codice
    
       if(fread(&n,sizeof(int),1,f) == 0)
          printf("Numero di elementi uguale a 0...\n");
       else
       {
          fread(&n,sizeof(int),1,f);
    
    perché leggi due volte lo stesso valore?
    ciao, per caso hai provato ad eseguirlo?
  • Re: Problema salvataggio file[RISOLTO]

    No ...
  • Re: Problema salvataggio file[RISOLTO]

    L'errore che mi restituisce durante l'esecuzione è: "Eccezione non gestita in 0x00303E3B in Win32Project1.exe: 0xC0000005: violazione di accesso durante la lettura del percorso 0x00000858."
    Si ferma in questo punto:
    
    while(ptr->next != NULL)
    			ptr = ptr->next;
    		ptr->next = tmp;
    		list->numel++;
    	}
    
  • Re: Problema salvataggio file[RISOLTO]

    Ovvio il perche': lapalissiano

    Ragiona:

    test su ptr->next (e gia' qui' non va bene, ma lasciamo stare)

    ragiona su quanto hai scritto:

    ptr = ptr->next
    ptr->next = tmp

    secondo te, che relazione c'e' con

    ptr->next->next = tmp

    Sono la stessa cosa o sono due cose diverse?
  • Re: Problema salvataggio file[RISOLTO]

    migliorabile ha scritto:


    Ovvio il perche': lapalissiano

    Ragiona:

    test su ptr->next (e gia' qui' non va bene, ma lasciamo stare)

    ragiona su quanto hai scritto:

    ptr = ptr->next
    ptr->next = tmp

    secondo te, che relazione c'e' con

    ptr->next->next = tmp

    Sono la stessa cosa o sono due cose diverse?
    grazie per la risposta migliorabile. Come mai mi dici che il test su next non va bene? In pratica quel: ptr=ptr->next non mi serve, sto scrivendo due volte la stessa cosa.
    Correggo con
    while(ptr->next != NULL)
    			ptr->next = tmp;
  • Re: Problema salvataggio file[RISOLTO]

    migliorabile ha scritto:


    Ovvio il perche': lapalissiano

    Ragiona:

    test su ptr->next (e gia' qui' non va bene, ma lasciamo stare)
    hai ragione, continua a bloccarsi nel test.
  • Re: Problema salvataggio file[RISOLTO]

    Ora, ragiona sul test:

    perche fai il test su ptr->next e poi scrivi ptr->next = tmp?

    Dove sta' l'errore?
  • Re: Problema salvataggio file[RISOLTO]

    migliorabile ha scritto:


    Ora, ragiona sul test:

    perche fai il test su ptr->next e poi scrivi ptr->next = tmp?

    Dove sta' l'errore?
    mmm, l'errore è che se next è NULL io sto assegnango a tmp un NULL.. ci sono?
  • Re: Problema salvataggio file[RISOLTO]

    ururi1989 ha scritto:


    migliorabile ha scritto:


    Ora, ragiona sul test:

    perche fai il test su ptr->next e poi scrivi ptr->next = tmp?

    Dove sta' l'errore?
    mmm, l'errore è che se next è NULL io sto assegnango a tmp un NULL.. ci sono?
    ho detto una boiata.. non ci sono proprio..
  • Re: Problema salvataggio file[RISOLTO]

    Allora: un passo indietro:

    che cosa e' ptr e che cosa e' ptr->next?

    che cosa succede se ptr e' NULL?
    che cosa succese se ptr->next e' NULL?

    Che cosa bisogna controllare?

    se ptr e' NULL?
    o se ptr->next e' NULL?
    
    
           +---+-------+     +---+-------+
    ptr -> |   |next --+---->|   |next   +
           +---+-------+     +---+-------+
    
    
    Dal disegno dovrebbe essere evidente
  • Re: Problema salvataggio file[RISOLTO]

    migliorabile ha scritto:


    Allora: un passo indietro:

    che cosa e' ptr e che cosa e' ptr->next?

    che cosa succede se ptr e' NULL?
    che cosa succese se ptr->next e' NULL?

    Che cosa bisogna controllare?

    se ptr e' NULL?
    o se ptr->next e' NULL?
    
    
           +---+-------+     +---+-------+
    ptr -> |   |next --+---->|   |next   +
           +---+-------+     +---+-------+
    
    
    Dal disegno dovrebbe essere evidente
    Allora, ptr è un puntatore alla lista El_list_utente, se ptr è NULL la lista è vuota, se ptr->next è NULL allora vuol dire che ptr è l'ultimo elemento della lista. Io devo inserire l'elemento alla fine della lista, quindi devo scorrerla. Quindi devo prima controllare che ptr non sia NULL:
    while(ptr != NULL)
    			ptr->next = tmp;
    		list->numel++;
    mmm, ho toppato tutto?
Devi accedere o registrarti per scrivere nel forum
25 risposte