#include <string>
#include <iostream>
#include <fstream>
using namespace std;
char ch;
class HangMan { // unica classe del progetto
private:
int manche; // le possibilità di sbaglio
string situation; // tiene in memoria la parola scoperta fino ad ora dall'utente
// nel formato da mandare in output
string word; // parola da scoprire
ifstream* in; // puntatore a un ogetto ifstream, per permettere l'allocazione dinamica
public:
string now; // adattamento di situation eliminando gli spazi di formattazione
string getWord() {
return word; // ritorna valore word
}
string* getSituation() {
return &situation; // ritorna indirizzo di memoria di situation, per permettere modifiche
}
int* getManche() {
return &manche; // ritorna indirizzo di memoria di manche, per permettere modifiche
}
// costruttore
HangMan(string file) {
vector<string> parole; // memorizza le parole presenti nel file
manche = 6; // le possibilità di errore partono da 6
in = new ifstream(file.c_str());// allocazione dinamica, dato che il nome del file si sa a run-time
if(!in->is_open()) { // se il file non è stato trovato
// avverti l'utente
cerr << "Errore: file " + file + " non trovato" << endl;
cout << "Premi un tasto ed invio per continuare... ";
cin >> ch;
exit(1);// esci in errore
}
string s; // stringa temporanea in cui salvare la parola corrente
while(*in >> s) {
parole.push_back(s); // aggiungila al vettore di stringhe
}
srand(time(0));// inizializza il seme per generare un numero pseudo-causuale
int parola = 0 + rand() % (parole.size()-1); // crea un numero pseudo-causuale compreso tra 0 e il numero di parole del vettore, inizia da 0 quindi -1
word = parole[parola]; // usa questo numero come indice per generare la parola a random
for(register int w = 0; w < word.size(); w++)
//tutto minuscolo
word[w] = tolower(word[w]);
for(register int i = 0; i < word.size(); i++) {
//inizializza situation e now nei due differenti formati
situation += " _";
now += " ";
}
}
void clear() {
/*
Questa funziona potrebbe essere aggirata con un system("cls") in windows
o un system("clear") in linux, per portabilizzare il tutto e stata usata questa
scorciatoia. Oppure la funzione clrscr() di conio.h(solo in windows)
*/
for(register int i = 0; i < 25; i++) // vai a capo 25 volte
cout << "\n";
}
void printSituation() {// aggiorna la schermata
clear();//pulisci lo schermo
// e scrivi
cout << "\nLa parola scoperta Š fino ad ora: \t\t\t Hai " << manche << " tentativi" << endl << endl;
cout << situation << endl << endl;
cout << "Cosa vuoi fare?\n\n";
cout << "1. Dico una lettera\n";
cout << "2. Dico una parola\n";
cout << "3. Mi arrendo\n\n";
}
void completeSituation() {
// dopo che l'utente indovina la parola in un colpo, viene completata la situazione
for(register int i = 0; i < word.size(); i++) {
situation[i*2+1] = word[i];
}
}
string play() {// inizia a giocare
int option;
printSituation();//scrivi la situazione
do {
cin >> option;//prendi l'opzione
if(option < 1 || option > 3) cerr << "Inserire opzione esistente: 1, 2 o 3!\n";
} while(option < 1 || option > 3);
switch(option) {// a seconda dell'opzione ritorna una stringa diversa
case 1:
return "LET";
break;
case 2:
return "WOR";
break;
case 3:
return "END";
}
return NULL;//si è verificato un errore
}
};