#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Hangman
{
private:
const std::string word;
vector<char> correctLetters;
vector<char> incorrectGuess;
bool letterExistsInCorrectLetters(const char letter) const
{
if (std::find(correctLetters.begin(), correctLetters.end(), letter) != correctLetters.end())
{
return true;
}
return false;
}
bool letterExistsInWord(const char letter) const
{
if (word.find_first_of(letter) != std::string::npos)
{
return true;
}
return false;
}
bool isAlreadyPlayed(const char letter) const
{
if (std::find(correctLetters.begin(), correctLetters.end(), letter) != correctLetters.end())
{
return true;
}
if (std::find(incorrectGuess.begin(), incorrectGuess.end(), letter) != incorrectGuess.end())
{
return true;
}
return false;
}
void printIncorrectLetters() const
{
std::cout << "Incorrect Letters so far: ";
for (vector<char>::const_iterator
iter = incorrectGuess.begin();
iter != incorrectGuess.end();
++iter)
{
std::cout << " " << *iter << " ";
}
std::cout << std::endl;
}
public:
Hangman(const std::string &word_)
: word(word_)
{
correctLetters.push_back(' ');
}
bool play(const char letter)
{
if (isAlreadyPlayed(letter))
{
std::cerr << "Letter already played" << std::endl;
return false;
}
if (letterExistsInWord(letter))
{
correctLetters.push_back(letter);
}
else
{
incorrectGuess.push_back(letter);
}
return true;
}
void print() const
{
for (int i = 0; i < this->word.size(); ++i)
{
if (letterExistsInCorrectLetters(word[i]))
{
std::cout << " " << word[i] << " ";
}
else
{
std::cout << " _ ";
}
}
std::cout << std::endl;
this->printIncorrectLetters();
}
bool isWin() const
{
for (int i = 0; i < this->word.size(); ++i)
{
if (!letterExistsInCorrectLetters(word[i]))
{
return false;
}
}
std::cout << "You Won !!!" << std::endl;
return true;
}
bool isLost() const
{
if (incorrectGuess.size() > 9)
{
return true;
}
return false;
}
};
int main() {
// your code goes here
Hangman h("jack sparrow");
while ( !h.isLost())
{
char guess;
std::cout << "Guess Letter: ";
std::cin >> guess;
bool res = h.play(guess);
h.print();
if (h.isWin())
{
break;
}
}
if (h.isLost())
{
std::cout << "You have lost" << std::endl;
}
return 0;
}