-
Notifications
You must be signed in to change notification settings - Fork 0
/
FindWinner.cpp
100 lines (72 loc) · 2.17 KB
/
FindWinner.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
// file FindWinner.cpp
#include <cppunit/config/SourcePrefix.h>
#include "FindWinner.h"
#include <algorithm>
//---------------------------------------------------------------
// Define class static variables
//---------------------------------------------------------------
FindWinner* FindWinner::instance_m_p = 0;
Destroyer<FindWinner> FindWinner::destroyer_m;
//---------------------------------------------------------------
const int
FindWinner::winning_moves_array_m[][winner_array_cols_m] = {
{ 1, 2, 3 },
{ 4, 5, 6 },
{ 7, 8, 9 },
{ 1, 4, 7 },
{ 2, 5, 8 },
{ 3, 6, 9 },
{ 1, 5, 9 },
{ 3, 5, 7 } };
//---------------------------------------------------------------
const int
FindWinner::winner_array_rows_m = sizeof(winning_moves_array_m)/
(sizeof(int)*winner_array_cols_m);
//---------------------------------------------------------------
FindWinner::FindWinner()
{
buildWinningMovesSet();
}
//---------------------------------------------------------------
FindWinner::~FindWinner()
{
}
//---------------------------------------------------------------
FindWinner* FindWinner::Instance()
{
if ( NULL == instance_m_p )
{
instance_m_p = new FindWinner();
destroyer_m.SetDoomed(instance_m_p);
}
return instance_m_p;
}
//---------------------------------------------------------------
bool FindWinner::hasWinner(const Player* player_p) const
{
IntSetSet::const_iterator moves_it = winningMoves_m.begin();
bool found = false;
while ( ( false == found ) && ( winningMoves_m.end() != moves_it ) )
{
found = player_p->hasMoved(*moves_it);
moves_it++;
}
return found;
}
//---------------------------------------------------------------
void FindWinner::buildWinningMovesSet()
{
winningMoves_m.clear();
IntSet moves;
moves.clear();
for ( int row = 0; row < winner_array_rows_m; row++ )
{
for ( int col = 0; col < winner_array_cols_m; col++ )
{
moves.insert(winning_moves_array_m[row][col]);
}
winningMoves_m.insert(moves);
moves.clear();
}
}
//---------------------------------------------------------------