Jogo da Forca (Hangman)
#include <iostream>
#include <fstream>
#include <string>
#include <map>
#include <vector>
#include <ctime>
#include <cstdlib>
using namespace std;
string secretWord = "";
map<char, bool> guessed;
vector<char> wrongGuess;
void printHorizontalLine(int size, char style);
void printTitle(string title);
bool isGuessEqualsLetter(char guess);
void getGuess(char *guess);
void verifyGuess(char guess);
void printGuess();
void printWrongGuess();
bool isGameNotWon();
bool isPlayerHanged();
void printGameOver();
vector<string> readFile();
void drawSecretWord();
void addWord();
void saveFile(vector<string> newList);
int main() {
readFile();
drawSecretWord();
// cout << secretWord << endl;
const int BORDER_SIZE = 35;
const char BORDER_STYLE = '-';
const string TITLE = "JOGO DA FORCA";
printHorizontalLine(BORDER_SIZE, BORDER_STYLE);
printTitle(TITLE);
printHorizontalLine(BORDER_SIZE, BORDER_STYLE);
while(isGameNotWon() && isPlayerHanged()) {
printWrongGuess();
printGuess();
char guess;
getGuess(&guess);
guessed[guess] = true;
cout << endl;
verifyGuess(guess);
printHorizontalLine(BORDER_SIZE, BORDER_STYLE);
}
printGameOver();
return 0;
}
void printHorizontalLine(int size, char style) {
for(int i = 0; i < size; i++) {
cout << style;
}
cout << endl;
}
void printTitle(string title) {
cout << "\t" << title << endl;
}
bool isGuessEqualsLetter(char guess) {
for(char letter : secretWord) {
if(guess == letter) return true;
}
return false;
}
void getGuess(char *guess) {
cout << "Digite seu chute: ";
cin >> guess;
}
void verifyGuess(char guess) {
if(!isGuessEqualsLetter(guess)) {
wrongGuess.push_back(guess);
}
}
void printGuess() {
for(char letter : secretWord) {
if(guessed[letter]) cout << letter << " ";
else cout << "_ ";
}
cout << endl << endl;
}
void printWrongGuess() {
cout << "Chutes errados: ";
for(char letter: wrongGuess) {
cout << letter << " ";
}
cout << endl << endl;
}
bool isGameNotWon() {
for(char letter : secretWord) {
if(!guessed[letter]) {
return true;
}
}
return false;
}
bool isPlayerHanged() {
return wrongGuess.size() < 5;
}
void printGameOver() {
cout << "A palavra secreta era " << secretWord << endl;
if(isGameNotWon()) {
cout << "Voce perdeu." << endl;
}
else {
cout << "Parabens! Voce venceu! " << endl;
cout << "Voce deseja adicionar uma nova palavra ao banco (S/N)? ";
char option;
cin >> option;
if(option == 'S') {
addWord();
} else {
exit(0);
}
}
}
vector<string> readFile() {
ifstream file;
file.open("words.txt");
if(file.is_open()) {
int size;
file >> size;
vector<string> wordDatabase;
for(int i = 0; i < size; i++) {
string word;
file >> word;
wordDatabase.push_back(word);
}
file.close();
return wordDatabase;
}
else {
cout << "Nao foi possivel acessar o banco de palavras." << endl;
exit(0);
}
}
void drawSecretWord() {
vector<string> words = readFile();
srand(time(NULL));
int drawIndex = rand() % words.size();
secretWord = words[drawIndex];
}
void addWord() {
cout << "Digite a nova palavra em LETRAS MAIUSCULAS: ";
string newWord;
cin >> newWord;
vector<string> wordList = readFile();
wordList.push_back(newWord);
saveFile(wordList);
}
void saveFile(vector<string> newList) {
ofstream file;
file.open("words.txt");
if(file.is_open()) {
file << newList.size() << endl;
for(string word : newList) {
file << word << endl;
}
file.close();
}
else {
cout << "Nao foi possivel acessar o banco de palavras." << endl;
exit(0);
}
}
- Banco de palavras
6
ABACAXI
MELANCIA
MAMAO
LIMAO
ABOBORA