-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.cpp
136 lines (112 loc) · 3.38 KB
/
main.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/*
This is the cosole executable, that makes use of the BullCow class
This acts as the view in the MVC pattern, and is responsible for all user interation. For game logic see the FBullCowGame class.
*/
#include <iostream>
#include <string>
#include "FBullCowGame.h"
// to make syntax Unreal friendly
using FText = std::string;
using int32 = int;
void PrintIntro();
void PlayGame();
FText GetValidGuess();
bool AskToPlayAgain();
void PrintGameSummary();
FBullCowGame BCGame; //instantiate a new game
// entry point of our application
int main()
{
bool bPlayAgain = false;
do
{
PrintIntro();
PlayGame();
bPlayAgain = AskToPlayAgain();
}
while (bPlayAgain);
return 0; //exit the application
}
// introduce the game
void PrintIntro()
{
std::cout << std::endl;
std::cout << " __n__n__ " " ______"<< std::endl;
std::cout << " .------`-\\00/-' " " '-\\00/-`------."<< std::endl;
std::cout << " / ## ## (oo) " " (oo) ## ## \\"<< std::endl;
std::cout << " / \\## __ ./ " " \\. __ ##/ \\"<< std::endl;
std::cout << " |//\\ \\|/ " " \\|/ YY\\\\|"<< std::endl;
std::cout << " ||| ||| " " ||| |||"<< std::endl;
std::cout << "''''''''''''''''''''''''''''''''''''''''" << std::endl;
std::cout << "\n\nWelcome to Bulls and Cows, a fun word game!\n";
std::cout << std::endl;
std::cout << "Can you guess the " << BCGame.GetHiddenWordLength();
std::cout << " letter isogram I'm thinking of?\n";
std::cout << std::endl;
return;
}
// Plays the game
void PlayGame()
{
BCGame.Reset();
int32 MaxTries = BCGame.GetMaxTries();
// loop asking for guesses while the game is NOT won
// and there are still tries remaining
while( ! BCGame.IsGameWon() && BCGame.GetCurrentTry() <= MaxTries) {
FText Guess = GetValidGuess(); // TODO make loop checking valid guess
// sumbit valid guess to the game and recieve counts
FBullCowCount BullCowCount = BCGame.SubmitValidGuess(Guess);
std::cout << "Bulls = " << BullCowCount.Bulls;
std::cout << ". Cows = " << BullCowCount.Cows << "\n\n";
}
PrintGameSummary();
return;
}
// loop continually until the user gives a valid guess
FText GetValidGuess()
{
FText Guess = "";
EGuessStatus Status = EGuessStatus::Invalid_Status;
do {
// get guess from the player
int32 CurrentTry = BCGame.GetCurrentTry();
std::cout << "Try " << CurrentTry << " of " << BCGame.GetMaxTries();
std::cout << ". Enter your guess: ";
std::getline(std::cin, Guess);
// check and give feedback
Status = BCGame.CheckGuessValidity(Guess);
switch (Status) {
case EGuessStatus::Not_Isogram:
std::cout << "Please enter a valid Isogram word.\n\n";
break;
case EGuessStatus::Wrong_Length:
std::cout << "Please enter a " << BCGame.GetHiddenWordLength() << " letter word.\n\n";
break;
case EGuessStatus::Not_Lowercase:
std::cout << "Please enter using lowercase only.\n\n";
break;
default:
// assume the guess is valid
break;
}
} while (Status != EGuessStatus::OK); // keep looping until we get no errors
return Guess;
}
bool AskToPlayAgain()
{
std::cout << "Do you want to play again with the same hidden word? (y/n) ";
FText Response = "";
std::getline(std::cin, Response);
return (Response[0] == 'y') || (Response[0] == 'Y');
}
void PrintGameSummary()
{
if (BCGame.IsGameWon())
{
std::cout << "WELL DONE - YOU WIN!!!\n";
}
else
{
std::cout << "Better luck next time!!!\n";
}
}