01: #include<stdio.h>
02: #include<stdlib.h>
03: #include<string.h>
04: #include<time.h>
05: 
06: int main(int argc, char **argv){
07: 
08:   int n;
09: 
10:   do
11:   {
12:     printf("Inserisci un numero di tentativi compreso tra 8 e 14: ");
13:     scanf("%d", &n);
14:   }while(n<8 || n>14);
15: 
16:   int nparole = 0;  
17:   char **parole;                       // array dinamico per memorizzare parole
18: 
19:   FILE *dict = fopen("dict.txt", "r");
20:   if(!dict)
21:   {
22:     perror("Errore");
23:     exit(EXIT_FAILURE);
24:   }
25: 
26:   char tmp[100];                      // uso per leggere parole da dict.txt
27:   while(fscanf(dict, " %s", tmp) == 1)
28:   {
29:     if(strlen(tmp) == n)             // verifico se parola letta corrisponde a requisito lunghezza
30:     {
31:       parole = realloc(parole, (nparole+1) * sizeof(char **));  // allargo array
32:       parole[nparole] = malloc((n + 1) * sizeof(char));         // alloco stringa
33:       strcpy(parole[nparole], tmp);                             // copio stringa letta in area allocata dinamicamente
34:       ++nparole;
35:     }
36:   }
37:   fclose(dict);
38:   //printf("Ho memorizzato %d parole\n", nparole);               // DEBUG
39: 
40:   srand(time(0));                     // inizializzazione generazione numeri casuali
41:   int iparola = rand() % nparole;     // selezione casuale indice parola da indovinare (il % mi restituira' valore tra 0 e nparole-1)
42: 
43:   char indovino[15]="--------------"; // stringa di 14 trattini
44:   indovino[n] = '\0';                 // l'accorcio di modo che sia di n trattini
45: 
46:   int tentativi = n/1.5 + 0.9999;     // il calcolo viene fatto a virgola mobile ma poi troncato quanto lo memorizzo (quindi arrotondo per eccesso) si poteva usare anche ceil()
47:   int lindovinate = 0;                // lettere indovinate
48: 
49:   do
50:   {
51:     char c;
52:     printf("Ti rimangono %d tentativi per indovinare:  %s\n", tentativi, indovino);
53:     printf("Inserisci una lettera: ");
54:     scanf(" %c", &c);
55: 
56:     int presenza = 0;
57:     int i;
58:     for(i=0; i<n; ++i)              // ciclo per verificare la presenza della lettera
59:     {
60:       if( c == parole[iparola][i])  // la lettera i-esima della parola selezionata e' uguale a quella inserita dall'utente?
61:       {
62:   presenza = 1;               // memorizzo che ho trovato almeno una lettera e che quindi non dovro' diminuire il numero di tentativi
63:   indovino[i] = c;            // metto nella stringa cioi trattini la lettera indovinata
64:   ++lindovinate;              // incremento numero lettere indovinate
65:       }
66:     }
67:     if(!presenza)
68:       --tentativi;                 // se la lettera non c'era, diminuisco il numero di tentativi
69:   }
70:   while(tentativi && lindovinate < n); // esco se esaurisco il numero di tentativi o se indovino tutte le lettere
71: 
72:   if(!tentativi)
73:   {
74:     printf("Hai perso, ritenta e forse sarai piu' fortunato\n");
75:   }
76:   else
77:   {
78:     printf("Bravo! Hai vinto.\n");
79:   }
80: 
81:   printf("La parola era [%s]\n", parole[iparola]);
82: 
83:   return 0;
84: }
85: 
86: