01: #include<stdio.h>
02: #include<stdlib.h>
03: #include<string.h>
04: #include<time.h>
05: 
06: char *leggiparola(FILE *fp)
07: {
08:   char tmp[1000], *parola;
09: 
10:   if(fscanf(fp, " %s",tmp)!=1) return NULL;
11:   parola=malloc(strlen(tmp) + 1);
12:   strcpy(parola, tmp);
13: 
14:   return parola;
15: }
16: 
17: int main(int argc, char **argv){
18:   FILE *fp;
19: 
20:   fp=fopen("dizionario.txt", "r");
21:   if(!fp)
22:   {
23:     perror("Errore in apertura file");
24:     exit(EXIT_FAILURE);
25:   }
26: 
27:   char *s; // indirizzo dove e' memorizzata parola letta
28:   char **dizionario=NULL; // array delle parole lette, man mano che leggo una parola uso realloc() per allungarlo
29:   int nparole=0; // quante parole ho letto
30:   while((s=leggiparola(fp))!=NULL) // leggiparola restituisce NULL se non riesce a leggere
31:   {
32:     //printf("Ho letto: [%s]\n", s); DEBUG
33:     dizionario=realloc(dizionario, sizeof(char*)*(nparole+1)); // allargo il dizionario per memorizzare nuova parola
34:     dizionario[nparole] = s; // memorizzo parola letta
35:     ++nparole;
36:   }
37:   printf("Ho letto e memorizzato %d parole\n", nparole); // DEBUG
38: 
39:   srand(time(0)); // inizializzo generazione numeri casuali
40: 
41:   int estratta=rand()%nparole; // mi restituisce numero tra 0 e nparole-1 che poi e' l'indice di una parola a caso
42: 
43:   //printf("Ho estratto %s\n", dizionario[estratta]); // DEBUG
44: 
45: 
46:   char *paroladaindovinare=dizionario[estratta]; // a rigore non necessario, ma rende il resto del codice piu' leggibile
47:   int letteredaindovinare=strlen(paroladaindovinare);
48:   char *mascherata=malloc(strlen(paroladaindovinare) + 1); // parola "oscurata"
49:   int i;
50:   for(i=0; i<strlen(paroladaindovinare); ++i) // la riempo di '*'
51:     mascherata[i]='*';
52:   mascherata[i]='\0'; // e la termino
53: 
54:   int ntentativi = strlen(paroladaindovinare) + 2; // mi calcolo il numero di tentativi
55:   while(ntentativi)
56:   {
57:     char guess;
58:     printf("Devi indovinare la parola [%s], ti restano %2d tentativi, inserisci una lettera minuscola: ", mascherata, ntentativi); 
59:     scanf(" %c", &guess); // qui andrebbe controllato che sia una lettera maiuscola ma tralasciamo
60:     for(i=0; i<strlen(paroladaindovinare); ++i) // ciclo per controllare se ho indovinato qualche lettera
61:     {
62:       if(guess==paroladaindovinare[i]) // ho indovinato la lettera corrispondente
63:       {
64:   --letteredaindovinare;
65:   mascherata[i]=guess;
66:       }
67:     }
68: 
69:     if(!letteredaindovinare) // le abbiamo indovinate tutte!
70:     {
71:       printf("Complimenti hai indovinato la parola [%s]!\n", paroladaindovinare);
72:       exit(EXIT_SUCCESS);
73:     }
74:     --ntentativi;
75:   }
76: 
77:   printf("Mi dispiace, non hai indovinato! La parola da indovinare era [%s]\n", paroladaindovinare);
78:   
79: 
80:   return 0;
81: }
82: 
83: