-
Notifications
You must be signed in to change notification settings - Fork 0
/
controller.cc
128 lines (113 loc) · 3.36 KB
/
controller.cc
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
#include <iostream>
#include <string>
#include "controller.h"
#include "game.h"
#include "board.h"
#include "player.h"
#include "exception.h"
using tictactoe::GameController;
using tictactoe::Square;
using tictactoe::Exception;
using std::cin;
using std::cout;
using std::cerr;
using std::endl;
using std::string;
GameController::GameController(): turn(X) {
game = new Game(this);
view = new BoardView();
}
void GameController::updateSquareView(Square square, Symbol symbol) {
view->updateSquareView(square, symbol);
}
bool isResponseYes(const string &response) {
return "Y" == response || "YES" == response || "y" == response ||
"Yes" == response || "yes" == response;
}
// Gets input from user to place their X or O to the square
void selectSquare(int &intSquare) {
cout << "Square you would like to place (enter 1-9): ";
while (true) {
if (cin >> intSquare && intSquare >= 1 && intSquare <= 9) break;
else {
cout << "Sorry! Invalid input! Please try again!" << endl;
cout << "Square you would like to place (enter 1-9): ";
cin.clear();
}
}
cout << "---------------------------------------------------" << endl;
}
void GameController::play() {
string response;
// Sets up player X
string name;
cout << "Name of Player X: ";
cin >> name;
cout << "Would you like player X to be an unbeatable computer player (Y/N)? ";
cin >> response;
if (isResponseYes(response)) {
playerX = new Player(name, X, true);
} else {
playerX = new Player(name, X);
}
// Sets up player O
cout << "Name of Player O: ";
cin >> name;
cout << "Would you like player O to be an unbeatable computer player (Y/N)? ";
cin >> response;
if (isResponseYes(response)) {
playerO = new Player(name, O, true);
} else {
playerO = new Player(name, O);
}
view->print();
int intSquare;
do {
if (X == turn) {
cout << playerX->getName() << "'s turn (X)" << endl;
if (playerX->isComputer()) {
cout << "Computer selecting..." << endl;
intSquare = game->minimax(X);
cout << "---------------------------------------------------" << endl;
} else {
selectSquare(intSquare);
}
try {
game->updateSquare(static_cast<Square>(intSquare - 1), X);
turn = O;
} catch (Exception &exception) {
cerr << exception.getMessage() << " Please try another square" << endl;
}
} else {
cout << playerO->getName() << "'s turn (O)" << endl;
if (playerO->isComputer()) {
cout << "Computer selecting..." << endl;
intSquare = game->minimax(O);
cout << "---------------------------------------------------" << endl;
} else {
selectSquare(intSquare);
}
try {
game->updateSquare(static_cast<Square>(intSquare - 1), O);
turn = X;
} catch (Exception &exception) {
cerr << exception.getMessage() << " Please try another square" << endl;
}
}
} while (NOT_OVER == game->isOver());
if (DRAW == game->isOver()) {
cout << "The game is over! It is DRAW" << endl;
} else {
Symbol winner = game->getWinner(game->isOver());
cout << "The game is over! WINNER: " << SYMBOL_VIEW[winner] << endl;
}
cout << "New Game (Y/N)? ";
cin >> response;
if (isResponseYes(response)) {
game->restart();
play();
}
}
void GameController::clearBoardView() {
view->clear();
}