bulls and cows [guess 4 characters]

Bjarne Stroustrup “Programming Principles and Practice Using C++”
Chapter 6 Exercise 8
Using std_lib_facilities.h by Bjarne Stroustrup.

//	Philipp Siedler
//	Bjarne Stroustrup's PP
//	Chapter 6 Exercise 8

#include "std_lib_facilities.h"

vector<char> randomCharGen(int _seed, int _num) {
	vector <char> chosen;
	int counter = 0;
	vector <char> alphabet = { 'a', 'b', 'c', 'd', 'e', 'f', 'g',
	'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's',
	't', 'u', 'v', 'w', 'x', 'y', 'z' };

	srand(_seed);
	while (chosen.size() < _num) {
		char temp = alphabet[rand() % alphabet.size()];
		if (chosen.size() == 0) {
			chosen.push_back(temp);
		}
		else{
			for (int j = 0; j < chosen.size(); j++) {
				if (temp == chosen[j]) {
					counter++;
				}
			}
			if (counter == 0) {
				chosen.push_back(temp);
			}
			else {
				counter = 0;
			}
		}
	}
	return chosen;
}

int main()
try
{
	vector <char> randomChars;
	vector <char> charGuess;
	char charGuessTemp;
	int charGuessCheck;

	int bulls = 0;
	int cows = 0;

	int charNums = 4;
	int seed;
	string seedCheck;

	string answer = "noAnswer";

	while (randomChars.size() < charNums) {
		cout << "Enter seed value between 0 and 100\n";
		if (cin >> seed && seed <= 100 && seed >= 0) {}
		else {
			cin.clear();
			cin >> seedCheck;
			error("Seed value is wrong: ", seedCheck);
		}
		randomChars = randomCharGen(seed, charNums);

		for (int i = 0; i < randomChars.size(); i++) {
			cout << randomChars[i] << "\n";
		}

		while (bulls != charNums) {
			bulls = 0;
			cows = 0;

			cout << "Enter 4 different letters\n";
			if (cin) {
				while (charGuess.size() < charNums) {
					if (cin >> charGuessTemp) {
						charGuess.push_back(charGuessTemp);
					}
					else {
						cin.clear();
						cin >> charGuessCheck;
						error("Entered wrong guess", charGuessCheck);
					}
				}
			}

			//COMPARING GUESS AND RANDOM LETTERS
			for (int i = 0; i < charNums; i++) {
				for (int j = 0; j < charNums; j++) {
					if (charGuess[i] == randomChars[j] && i == j) {
						bulls++;
					}
					else if (charGuess[i] == randomChars[j] && i != j) {
						cows++;
					}
				}
			}
			cout << "Bulls: " << bulls << " Cows: " << cows << "\n";
			charGuess.clear();
		}

		cout << "You win!\n";
		cout << "Play again? Type y for yes and n for no: ";
		cin >> answer;

		if (answer == "noAnswer") {
			error("Wrong Answer.");
		}
		else if (answer == "y") {
			randomChars.clear();
			bulls = 0;
		}
	}
	keep_window_open(".");
}

catch (runtime_error e) {
	cout << e.what() << "\n";
	keep_window_open(".");
}
catch (...) {
	cout << "Extiting" << "\n";
	keep_window_open(".");
}
Output:
Enter sentece to be checked or x to exit:
birds fly and fish swim.
OK!
x for exit or continue:
C++ rules.
OK!
x for exit or continue:
x
Please enter . to exit

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.