// Hangman
// The classic game of hangman
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <ctime>
#include <cctype>
using namespace std;
char GetGuess();
void IsGuessInWord(char guess, string THE_WORD, string soFar, int wrong);
int main()
{
// set-up
const int MAX_WRONG = 8; // maximum number of incorrect guesses allowed
vector<string> words; // collection of possible words to guess
words.push_back("GUESS");
words.push_back("HANGMAN");
words.push_back("DIFFICULT");
srand(time(0));
random_shuffle(words.begin(), words.end()); // word to guess
const string THE_WORD = words[0];
int wrong = 0; // number of incorrect guesses
string soFar(THE_WORD.size(), '-'); // word guessed so far
string used = ""; // letters already guessed
cout << "Welcome to Hangman. Good luck!\n";
// main loop
while ((wrong < MAX_WRONG) && (soFar != THE_WORD))
{
cout << "\n\nYou have " << (MAX_WRONG - wrong) << " incorrect guesses left.\n";
cout << "\nYou've used the following letters:\n" << used << endl;
cout << "\nSo far, the word is:\n" << soFar << endl;
char guess;
guess = GetGuess();
while (used.find(guess) != string::npos)
{
cout << "\nYou've already guessed " << guess << endl;
cout << "Enter your guess: ";
cin >> guess;
guess = toupper(guess);
}
used += guess;
IsGuessInWord(guess, THE_WORD, soFar, wrong);
}
// shut down
if (wrong == MAX_WRONG)
cout << "\nYou've been hanged!";
else
cout << "\nYou guessed it!";
cout << "\nThe word was " << THE_WORD << endl;
return 0;
}
char GetGuess()
{
char cGuess;
cout << "\n\nEnter your guess: ";
cin >> cGuess;
cGuess = toupper(cGuess); //make uppercase since secret word in uppercase
return cGuess;
}
void IsGuessInWord(char guess, string THE_WORD, string soFar, int wrong)
{
if (THE_WORD.find(guess, THE_WORD) != string::npos) //ERROR HERE!
{
cout << "That's right! " << guess << " is in the word.\n";
// update soFar to include newly guessed letter
for (int i = 0; i < THE_WORD.length(); ++i)
if (THE_WORD == guess)
soFar = guess;
}
else
{
cout << "Sorry, " << guess << " isn't in the word.\n";
++wrong;
}
}
String function error
Have a look at that line, and compare it to all the other times you use std::string::find. Spot the difference?
Quote:Original post by kevtimc
Does it have to do with the comma? Am I comparing the char and string wrong?
Lets see:
used.find(guess) != string::npos // worksTHE_WORD.find(guess, THE_WORD ) != string::npos // has error
Any better? [smile]
There is no more complie error when you take , THE_WORD out, but it has a run time error, if you guess the complete word, it dosent work properly.
There is no need to provide THE_WORD as an agrument to THE_WORD's find operation ^^
There is two types of std::string find. Each has different signature.
The way you use the find function dont match with any of them
There is two types of std::string find. Each has different signature.
The way you use the find function dont match with any of them
Ah! nvm I see what went wrong, I manually incuded THE_WORD in the argument by accident, I must have been thinking I was changing the function arguments. Thnx! :)
One thing you should be aware of is that when you send soFar as an argument to the IsGuessInWord you send a copy of soFar.
The current signature of IsGuessInWord:
void IsGuessInWord(char guess, string THE_WORD, string soFar, int wrong)
We say that soFar is passed by value
When the IsGuessInWord returns, soFar is unchanged and the copy of soFar is deleted.
The common solution to this problem is to send soFar by reference
The new signature then looks like:
void IsGuessInWord(char guess, string THE_WORD, string& soFar, int wrong)
(Note the ampersand in front od soFar)
Now, the changes to soFar in the IsGuessInWord will indeed affect the original
The current signature of IsGuessInWord:
void IsGuessInWord(char guess, string THE_WORD, string soFar, int wrong)
We say that soFar is passed by value
When the IsGuessInWord returns, soFar is unchanged and the copy of soFar is deleted.
The common solution to this problem is to send soFar by reference
The new signature then looks like:
void IsGuessInWord(char guess, string THE_WORD, string& soFar, int wrong)
(Note the ampersand in front od soFar)
Now, the changes to soFar in the IsGuessInWord will indeed affect the original
Gotcha, the book didn't focus on references yet, (next chapter), but ive read about them so I know how it works.
You could also pass THE_WORD by reference, copying a string or any large structure is usually a bad idea, to quicken things up, efficiency and such :). Remember to make anything you pass that isn’t going to be altered in the function a const tho.
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement