#include #include #include /** Dichiarazioni delle funzioni **/ int leggi(char *); //legge stringa da console int lung(char *); //calcola lunghezza della stringa in argomento int parolaok(char *); //controlla se la parola soddisfa i requisiti void draw(void); //extra-esame int main(int argc, char ** argv) { char s[BUFSIZ]; //parola da indovinare int l; //lunghezza della parola const int NUMT=3; //numero di tentativi per carattere char M='*'; //carattere della maschera if (argc>1) { M=*(argv[1]); printf("(Uso il carattere %c per la maschera.)\n",M); } else printf("(Uso il carattere di default %c per la maschera.)\n",M); printf("\v\t\t**************************\n\t\t** Gioco dell'Impiccato **\n\t\t**************************\n\v"); printf("Inserisci la parola da indovinare: "); if (leggi(s)<0) { printf("Errore di I/O"); return -1; } while (!parolaok(s)) { printf("La parola non e' ammessa. Riprova: "); if (leggi(s)<0) { printf("Errore di I/O"); return -1; } } l=lung(s); char maschera[l]; //crea maschera di M int tentativi[l-1]; //crea record dei tentativi int cont=l; //continua fino a che !=0 int pos; //posizione da indovinare int c; //carattere inserito dall'utente //inizializza maschera di M for (int i=0; i=1 && pos<=l)) printf("Posizione inesistente. Riprova.\n"); else if (maschera[pos-1]!=M) printf("Hai gia' indovinato la lettera in questa posizione. Riprova.\n"); else break; } while (1); //ciclo infinito, v. break (tentativi[pos-1])--; printf("Lettera? "); c=getchar(); if (c==s[pos-1]) { printf("Hai indovinato!\n"); maschera[pos-1]=s[pos-1]; //aggiorna la maschera cont--; } else { printf("Non hai indovinato.\n"); if (tentativi[pos-1]==0) { printf("Hai esaurito il numero di tentativi disponibili. Hai perso!\n"); draw(); //extra-esame return 0; } } } while(cont); printf("Hai vinto! La parola e': %s.\n",s); return 0; } int leggi(char *s) { char *p; if (fgets(s, BUFSIZ, stdin) != NULL) { if ((p = strchr(s, '\n')) != NULL) *p = '\0'; return 1; } return 0; } int lung(char *s) { int i=0; for (;s!=NULL && s[i]!='\0'; i++); return i; } int parolaok(char *s) //1 se non vuota, contiene solo //caratteri alfabetici, e al piu' tante maiuscole //che minuscole { if (s==NULL) return 0; int i=0; int up=0; for (;s[i]!='\0'; i++) { if ( !isalpha(s[i]) ) break; if ( isupper(s[i]) ) up++; } int l=lung(s); if ( i>0 && i==l && (l-up)>=up ) return 1; return 0; } void draw(void) { printf("\t\t\tT\n\t\t\to\n\t\t\t/\\\n\t\t\t||\n"); }