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: