-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.cpp
140 lines (113 loc) · 3.46 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
135
136
137
138
139
//
// main.cpp
// BullCowGame
//
// Created by Justin Kanz on 5/8/19.
// Copyright © 2019 Justin Kanz. All rights reserved.
//
/* This is the console executable, that makes use of the BullCow class
This acts as the view in a MVC pattern, and is responsible for all user interaction. For game logic see the FBullCowGame class.
*/
#pragma once
#include <iostream>
#include <string>
#include "FBullCowGame.hpp"
// to make syntax Unreal friendly
using FText = std::string;
using int32 = int;
// function prototypes as outside a calss
void PrintIntro();
void PlayGame();
FText GetValidGuess();
bool AskToPlayAgain();
void PrintGameSummary();
FBullCowGame BCGame; //instantiate a new instance of the game, which we reuse across plays
//Entry Point for the application
int main()
{
bool bPlayAgain = false;
do{
PrintIntro();
PlayGame();
bPlayAgain = AskToPlayAgain();
}
while(bPlayAgain);
return 0;
}
void PrintIntro()
{
std::cout << "Welcom to Bulls and Cows, a fun word game!\n";
std::cout << "Can you guess the " << BCGame.GetHiddenWordLength();
std::cout << " letter isogram I'm thinking of?\n";
std::cout << std::endl;
return;
}
// plays a single game to completion
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();
//submit 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 a guess from the player
int32 CurrentTry = BCGame.GetCurrentTry();
std::cout << "Guess #" << CurrentTry << " of " << BCGame.GetMaxTries();
std::cout << ". Enter Your Guess " << std::endl;
std::getline(std::cin, Guess);
// check status and give feedback
Status = BCGame.CheckGuessValidity(Guess);
switch (Status)
{
case EGuessStatus::Wrong_Length:
std::cout << "Please enter a " << BCGame.GetHiddenWordLength() << "letter word.\n";
break;
case EGuessStatus::Not_Lowercase:
std::cout << "Please enter all lowercase letters.\n\n";
break;
case EGuessStatus::Not_Isogram:
std::cout << "Please enter a word without repeating letters.\n\n";
break;
default: // assume the guess is correct
break;
}
std::cout << std::endl;
}
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";
}
}