#include "tools.hpp" #include #include #include using std::string; using std::cin; using std::cout; using std::endl; using std::ostringstream; bool Running; bool GameOver; int Attempt; int Digits[3] = {0,0,0}; int Guess = 0; int Score = 0; int AskForGuess(int attempt) { ostringstream oss; oss << "GUESS #" << attempt; while(true) { int guess = GetIntInput(oss.str()); if(guess < 0) cout << "PLEASE GUESS A NON-NEGATIVE NUMBER." << endl; else if(guess < 100 || guess > 999) cout << "PLEASE GUESS A NUMBER BETWEEN 100 AND 999." << endl; else return guess; } } int* MakeArrayFromInt(int valIn) { int retArray[3] = {0,0,0}; retArray[0] = valIn / 100; retArray[1] = (valIn - (retArray[0] * 100)) / 10; retArray[2] = (valIn - (retArray[0] * 100)) - (retArray[1] * 10); return retArray; } int MakeIntFromArray(int arrayIn[3]) { return (arrayIn[0] * 100) + (arrayIn[1] * 10) + arrayIn[2]; } void DisplayGameOver() { GameOver = true; cout << "OH WELL, THAT'S TWENTY GUESSES." << endl; cout << "MY NUMBER WAS " << MakeIntFromArray(Digits) << "." << endl << endl; } void DisplayRules() { cout << "I WILL THINK OF A THREE-DIGIT NUMBER. YOU WILL TRY TO GUESS MY" << endl; cout << "NUMBER AND I WILL GIVE YOU GLUES AS FOLLOWS:" << endl; cout << " PICO - ONE DIGIT CORRECT BUT IN THE WRONG POSITION" << endl; cout << " FERMI - ONE DIGIT CORRECT AND IN THE RIGHT POSITION" << endl; cout << " BAGELS - NO DIGITS ARE CORRECT" << endl << endl; cout << "YOU GET TWENTY TRIES BEFORE YOU LOSE." << endl << endl; } void CreateTheDigits() { bool gotDigit = false; Digits[0] = GenerateRandomNumber(1, 9, false); while(!gotDigit) { Digits[1] = GenerateRandomNumber(0, 10, false); gotDigit = Digits[1] != Digits[0]; } gotDigit = false; while(!gotDigit) { Digits[2] = GenerateRandomNumber(0, 10, false); gotDigit = (Digits[2] != Digits[0]) && (Digits[2] != Digits[1]); } } bool CheckGuess(int guess) { int* temp = MakeArrayFromInt(guess); int vals[3] = {0,0,0}; for(int d = 0; d < 3; d++) if(temp[d] == Digits[d]) vals[d] = 1; if(MakeIntFromArray(vals) == 111) return true; if(temp[0] == Digits[1] || temp[0] == Digits[2]) vals[0] = 2; if(temp[1] == Digits[0] || temp[1] == Digits[2]) vals[1] = 2; if(temp[2] == Digits[0] || temp[2] == Digits[1]) vals[2] = 2; if(MakeIntFromArray(vals) == 0) cout << "BAGELS" << endl; else { for(int d = 0; d < 3; d++) { if(vals[d] == 1) cout << "FERMI "; else if(vals[d] == 2) cout << "PICO "; } cout << endl; } return false; } int main(int argc, char *argv[]) { cout << "*** BAGELS : C\\C++ ***" << endl; Running = true; if(AskToSeeTheRules())DisplayRules(); Score = 0; while(Running) { Attempt = 1; CreateTheDigits(); cout << "OK, I HAVE A NUMBER IN MIND." << endl; GameOver = false; while(!GameOver) { Guess = AskForGuess(Attempt); if(CheckGuess(Guess)) { cout << "YOU GOT IT!!!" << endl; Score++; GameOver = true; } else { Attempt++; if(Attempt > 20) DisplayGameOver(); } } cout << "*** GAME OVER ***" << endl; Running = AskToPlayAgain(); } cout << "A " << Score << " POINT BAGELS BUFF!" << endl; cout << "HOPE YOU HAD FUN. BYE!" << endl; return 0; }