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: