Original Post
I've been away from C++ for a couple of years, and today I made a little game. Did I screw up badly somewhere? :)
#include <cassert>
#include <iostream>
#include <string>
using namespace std;
const int LOWER = 1;
const int UPPER = 255;
class Guesser
{
private:
int lower;
int upper;
int guess;
int tries;
void makeEducatedGuess()
{
guess = lower + ((upper - lower) >> 1);
assert (lower <= guess);
assert (guess <= upper);
++tries;
}
public:
Guesser(int lower, int upper)
: lower(lower), upper(upper), tries(0)
{
assert (lower < upper);
makeEducatedGuess();
}
int currentGuess() const
{
return guess;
}
int numberOfTries() const
{
return tries;
}
void correct()
{
lower = upper = guess;
}
void tooLow()
{
lower = guess + 1;
makeEducatedGuess();
}
void tooHigh()
{
upper = guess - 1;
makeEducatedGuess();
}
bool fuzzy() const
{
return lower != upper;
}
int answer() const
{
assert (!fuzzy());
return lower;
}
};
bool play()
{
cout << "Think of a number between " << LOWER
<< " and " << UPPER << "." << endl << endl;
Guesser guesser(LOWER, UPPER);
while (guesser.fuzzy())
{
cout << "Is it " << guesser.currentGuess()
<< "? ([Y]es / too [L]ow / too [H]igh): ";
string answer;
getline(cin, answer);
if (answer.size() == 0) return false;
switch (answer[0])
{
case 'y':
guesser.correct(); break;
case 'l':
guesser.tooLow(); break;
case 'h':
guesser.tooHigh(); break;
}
}
cout << endl << "The number you were thinking of is "
<< guesser.answer() << " (" << guesser.numberOfTries()
<< " tries)" << endl << endl << endl;
return true;
}
int main()
{
while (play());
cout << endl << "Goodbye." << endl;
}