-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathRook.cpp
146 lines (129 loc) · 2.8 KB
/
Rook.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
140
141
142
143
144
145
146
#include "StdAfx.h"
#include "Piece.h"
#include "King.h"
#include "Rook.h"
#include "Board.h"
#include "Square.h"
CRook::CRook(EColour theColour, CBoard* pBoard, short thePosition)
: CPiece(theColour, pBoard, thePosition), moved(false)
{
}
CRook::~CRook(void)
{
}
bool CRook::move(short sourceRow, short targetRow, short sourceColumn, short targetColumn)
{
bool bResult = true;
if (!CPiece::move(sourceRow, targetRow, sourceColumn, targetColumn))
{
bResult = false;
}
moved = true;
return bResult;
}
bool CRook::isMoveLegal(short xrow, short yrow, short xcolumn, short ycolumn)
{
bool bResult = false;
ECastleType eCastleType = eUnknown;
// horizontal/vertical movement verification
if (xrow == yrow && xcolumn == ycolumn)
{
bResult = true;
}
// are we castling?
else if (kingHasCastled(eCastleType) && !moved)
{
if (xrow == yrow)
{
if (eCastleType == eLeftCastle)
{
if (ycolumn == 4)
{
bResult = true;
}
}
else if (eCastleType == eRightCastle)
{
if (ycolumn == 6)
{
bResult = true;
}
}
}
}
return bResult;
}
bool CRook::isMoveBlocked(short xrow, short yrow, short xcolumn, short ycolumn)
{
bool bResult = false;
short i = 0;
// verify path vertically up the board is not blocked
if (xrow < yrow)
{
for (i = xrow + 1; i < yrow; i++)
{
if (pBoard->getSquares()[getPositionFromRowAndColumn(i, xcolumn)]->isSquareOccupied())
{
bResult = true;
break;
}
}
}
// verify path vertically down the board is not blocked
if (yrow < xrow)
{
for (i = yrow + 1; i < xrow; i++)
{
if (pBoard->getSquares()[getPositionFromRowAndColumn(i, xcolumn)]->isSquareOccupied())
{
bResult = true;
break;
}
}
}
// verify path horizontally right across the board is not blocked
if (xcolumn < ycolumn)
{
for (i = xcolumn + 1; i < ycolumn; i++)
{
if (pBoard->getSquares()[getPositionFromRowAndColumn(xrow, i)]->isSquareOccupied())
{
bResult = true;
break;
}
}
}
// verify path horizontally left across the board is not blocked
if (ycolumn < xcolumn)
{
for (i = ycolumn + 1; i < xcolumn; i++)
{
if (pBoard->getSquares()[getPositionFromRowAndColumn(xrow, i)]->isSquareOccupied())
{
bResult = true;
break;
}
}
}
// same colour piece on target square is a block
if (isTargetSquareBlocked(yrow, ycolumn))
{
bResult = true;
}
return false;
}
bool CRook::kingHasCastled(ECastleType& eCastleType)
{
// find king of this colour and get castle status
short xrow = 0;
short xcolumn = 0;
CKing* pKing = dynamic_cast<CKing*> (getKing(eColour));
if (pKing != NULL)
{
return pKing->hasCastled(eCastleType);
}
else
{
return false;
}
}