-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTicTacToe.cpp
More file actions
127 lines (120 loc) · 2.09 KB
/
TicTacToe.cpp
File metadata and controls
127 lines (120 loc) · 2.09 KB
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
#include "TicTacToe.h"
const size_t TicTacToe::nextTurn(size_t& t)
{
t = (t + 1) % 2;
return t;
}
void TicTacToe::printWinner(Player& p)
{
cout << p.name() << " Won" << endl;
}
const bool TicTacToe::isWinner(size_t t) const
{
char c;
bool flag1 = true, flag2 = true, flag3 = true;
if (t == 0)
{
c = 'X';
}
else
{
c = 'O';
}
for (size_t i = 0; i < b.size(); i++)
{
flag2 = true, flag3 = true;
for (size_t j = 0; j < b.size(); j++)
{
if (i == j && b[{i, i}] != c)
{
flag1 = false;
}
if (b[{i,j}] != c)
{
flag2 = false;
}
if (b[{j,i}] != c)
{
flag3 = false;
}
}
if (flag2 || flag3)
{
return true;
}
}
bool flag4 = true;
for (int i = 0; i < b.size(); i++)
{
if (b[{i, b.size() - i - 1}] != c)
return flag1;
}
return flag1 || flag4;
}
TicTacToe::TicTacToe(size_t size) :b(size)
{
}
Player& TicTacToe::play(Player& p1, Player& p2)
{
size_t turn = 0;
Coordinate index;
Player* players [2] = { &p1, &p2 };
b.clear();
//cout << b << endl;
p1.setChar('X');
p2.setChar('O');
while (!b.isFull())
{
try
{
index = players[turn]->play(b);
if (b[index] == 'X' || b[index] == 'O')
{
throw IllegalCoordinateException(index, "This index is forbidden");
}
std::pair<size_t, size_t>temp (index.x(), index.y());
b[temp] = players[turn]->mychar();
//cout << b << endl;
}
catch (const IllegalCharException& ex)
{
cout << "Illegal char: " << ex.theChar() << endl;
nextTurn(turn);
winnerr = players[turn];
return *winnerr;
}
catch (const IllegalCoordinateException& ex)
{
cout << "Illegal coordinate: " << ex.theCoordinate() << endl;
nextTurn(turn);
winnerr = players[turn];
return *winnerr;
}
catch (...)
{
nextTurn(turn);
winnerr = players[turn];
return *winnerr;
}
if (isWinner(turn))
{
winnerr = players[turn];
return *winnerr;
}
nextTurn(turn);
}
winnerr = &p2;
printWinner(*winnerr);
return *winnerr;
}
Player & TicTacToe::winner() const
{
return *winnerr;
}
Board TicTacToe::board() const
{
/*ostringstream os;
os << b;
return os.str();*/
return b;
}