1
/***************************************************************************
5
* Authors: Maxwell Lazaroff, Michael Cook, and Joe Flint
6
* Date Created : May 3rd, 2005
7
* Last Modified: November 5th, 2005
9
* - description - Implements a chessboard, with methods for checking
11
***************************************************************************/
16
#include "boardmove.h"
17
#include "chessplayer.h"
21
/***************************************************************************
22
* Piece Class Member Functions
23
***************************************************************************/
25
//******** ACCESSORS ********
27
Color Piece::getColor() const { return this->_color; }
28
Unit Piece::getUnit() const { return this->_piece; }
29
unsigned int Piece::getMovecount() const { return this->_movecount; }
30
bool Piece::getJustMoved() const { return this->_justMoved; }
33
Piece::getName() const
35
switch( this->_piece ) {
55
//******** UTILITIES ********
57
void Piece::setColor(Color color) { this->_color = color; }
58
void Piece::setUnit(Unit unit) { this->_piece = unit; }
59
void Piece::setMovecount(unsigned int movecount) { this->_movecount = movecount; }
60
void Piece::setJustMoved() { this->_justMoved = true; }
61
void Piece::unsetJustMoved() { this->_justMoved = false; }
63
/***************************************************************************
64
* Board Class Member Functions
65
***************************************************************************/
69
/***************************************************************************
72
* - Resets the board to its initial setup.
73
***************************************************************************/
76
for(uint i = 0; i < 8; i++) {
77
for(uint j = 0; j < 8; j++) {
78
_board[i][j].setColor(BLANK);
79
_board[i][j].setUnit(EMPTY);
80
_board[i][j].setMovecount( 0 );
81
_board[i][j].unsetJustMoved();
85
// Setting up the pawns
86
for(int i = 0; i < 8; i++)
88
_board[0][i].setColor(BLACK);
89
_board[1][i].setColor(BLACK);
90
_board[1][i].setUnit(PAWN);
91
_board[6][i].setColor(WHITE);
92
_board[6][i].setUnit(PAWN);
93
_board[7][i].setColor(WHITE);
96
// Setting up the remaining pieces
97
_board[0][0].setUnit(ROOK);
98
_board[0][1].setUnit(KNIGHT);
99
_board[0][2].setUnit(BISHOP);
100
_board[0][3].setUnit(QUEEN);
101
_board[0][4].setUnit(KING);
102
_board[0][5].setUnit(BISHOP);
103
_board[0][6].setUnit(KNIGHT);
104
_board[0][7].setUnit(ROOK);
106
_board[7][0].setUnit(ROOK);
107
_board[7][1].setUnit(KNIGHT);
108
_board[7][2].setUnit(BISHOP);
109
_board[7][3].setUnit(QUEEN);
110
_board[7][4].setUnit(KING);
111
_board[7][5].setUnit(BISHOP);
112
_board[7][6].setUnit(KNIGHT);
113
_board[7][7].setUnit(ROOK);
120
/***************************************************************************
123
* - Prints the board to the console. This is a throw back to the early
124
* development days of Brutal Chess when it was all still text based.
125
* We're keeping this around in case we want to add support later for
126
* playing over a network with the text based version vs. the graphical
128
***************************************************************************/
130
// A matrix that we'll fill with characters to visually represent the
131
// current state of the chess board.
132
char printerboard[25][25];
134
// Setting the edges of the squares.
135
for(int i = 0; i < 25; i++) {
136
for(int j = 0; j < 25; j++) {
138
printerboard[i][j] = '-';
140
printerboard[i][j] = '|';
144
for(int i = 1; i < 25; i += 6) {
145
for(int j = 2; j < 25; j += 6)
146
printerboard[i][j] = '-';
148
for(int i = 2; i < 25; i += 6) {
149
for(int j = 1; j < 25; j += 6)
150
printerboard[i][j] = '-';
152
for(int i = 4; i < 25; i += 6) {
153
for(int j = 5; j < 25; j += 6)
154
printerboard[i][j] = '-';
156
for(int i = 5; i < 25; i += 6) {
157
for(int j = 4; j < 25; j += 6)
158
printerboard[i][j] = '-';
161
for(int i = 4; i < 25; i += 6) {
162
for(int j = 2; j < 25; j += 6)
163
printerboard[i][j] = ' ';
165
for(int i = 5; i < 25; i += 6) {
166
for(int j = 1; j < 25; j += 6)
167
printerboard[i][j] = ' ';
169
for(int i = 1; i < 25; i += 6) {
170
for(int j = 5; j < 25; j += 6)
171
printerboard[i][j] = ' ';
173
for(int i = 2; i < 25; i += 6) {
174
for(int j = 4; j < 25; j += 6)
175
printerboard[i][j] = ' ';
178
// Setting the piece type for non-empty squares.
179
for(int i = 1; i < 25; i += 3) {
180
for(int j = 1; j < 25; j += 3) {
181
if(_board[i/3][j/3].getUnit() == PAWN)
182
printerboard[i][j] = 'P';
183
if(_board[i/3][j/3].getUnit() == KNIGHT)
184
printerboard[i][j] = 'N';
185
if(_board[i/3][j/3].getUnit() == BISHOP)
186
printerboard[i][j] = 'B';
187
if(_board[i/3][j/3].getUnit() == ROOK)
188
printerboard[i][j] = 'R';
189
if(_board[i/3][j/3].getUnit() == QUEEN)
190
printerboard[i][j] = 'Q';
191
if(_board[i/3][j/3].getUnit() == KING)
192
printerboard[i][j] = 'K';
193
if(_board[i/3][j/3].getUnit() == EMPTY) {
196
printerboard[i][j] = '-';
198
printerboard[i][j] = ' ';
201
printerboard[i][j] = ' ';
203
printerboard[i][j] = '-';
209
// Setting the piece colors.
210
for(int i = 2; i < 25; i += 3) {
211
for(int j = 2; j < 25; j += 3) {
212
if(_board[i/3][j/3].getColor() == BLACK)
213
printerboard[i][j] = 'B';
214
else if(_board[i/3][j/3].getColor() == WHITE)
215
printerboard[i][j] = 'W';
219
printerboard[i][j] = '-';
221
printerboard[i][j] = ' ';
224
printerboard[i][j] = ' ';
226
printerboard[i][j] = '-';
232
// Setting up the file indicators.
234
cout << " 0 1 2 3 4 5 6 7" << endl;
235
for(int i = 0; i < 25; i++) {
236
for(int j = 0; j < 25; j++)
237
cout << printerboard[i][j];
247
Board::pawnPromotion()
248
/***************************************************************************
249
* Board::pawnPromotion
251
* - Looks over board and promotes any pawns that make it to the last rank
252
* a queen. Need to implement a way to choose, however.
253
***************************************************************************/
255
for(int i = 0; i < 8; i++) {
256
if ((_board[7][i].getColor() == BLACK) &&
257
(_board[7][i].getUnit()==PAWN))
258
_board[7][i].setUnit(QUEEN);
259
if ((_board[0][i].getColor() == WHITE) &&
260
(_board[0][i].getUnit() == PAWN))
261
_board[0][i].setUnit(QUEEN);
268
Board::updateBoard(BoardMove move)
269
/***************************************************************************
272
* - Takes in a BoardMove, 'move', which has already validated
273
* hopefully, and takes care of moving the pieces, updating movecounts, and
274
* when neccessary, taking pieces.
275
***************************************************************************/
277
// Getting Move Coordinates.
278
uint srow = move.getStartx();
279
uint scol = move.getStarty();
280
uint erow = move.getEndx();
281
uint ecol = move.getEndy();
283
move.checkFlags( *this );
285
// Check for En Passant and handle it.
286
if (move.getIsEnPassant()) {
287
move.unsetIsEnPassant();
288
_board[srow][ecol].setUnit(EMPTY);
289
_board[srow][ecol].setColor(BLANK);
290
_board[srow][ecol].setMovecount(0);
293
// Check for Castling and handle it.
294
if (move.getCastling()) {
295
move.unsetCastling();
297
if ((_board[srow][ecol-2].getUnit() == ROOK) &&
298
(_board[srow][ecol-2].getMovecount() == 0)) {
299
_board[srow][ecol+1].setUnit(_board[srow][ecol-2].getUnit());
300
_board[srow][ecol+1].setColor(_board[srow][ecol-2].getColor());
301
_board[srow][ecol+1].setMovecount(_board[srow][ecol-2].getMovecount()+1);
302
_board[srow][ecol-2].setUnit(EMPTY);
303
_board[srow][ecol-2].setColor(BLANK);
304
_board[srow][ecol-2].setMovecount(0);
305
} else if((_board[srow][ecol+1].getUnit() == ROOK) &&
306
(_board[srow][ecol+1].getMovecount() == 0)) {
307
_board[srow][ecol-1].setUnit(_board[srow][ecol+1].getUnit());
308
_board[srow][ecol-1].setColor(_board[srow][ecol+1].getColor());
309
_board[srow][ecol-1].setMovecount(_board[srow][ecol+1].getMovecount()+1);
310
_board[srow][ecol+1].setUnit(EMPTY);
311
_board[srow][ecol+1].setColor(BLANK);
312
_board[srow][ecol+1].setMovecount(0);
316
// Move to the current 'end' coordinates.
317
_board[erow][ecol].setUnit(_board[srow][scol].getUnit());
318
_board[erow][ecol].setColor(_board[srow][scol].getColor());
319
_board[erow][ecol].setMovecount(_board[srow][scol].getMovecount()+1);
320
_board[srow][scol].setUnit(EMPTY);
321
_board[srow][scol].setColor(BLANK);
322
_board[srow][scol].setMovecount(0);
324
//Check for any neccessary pawns to promote
327
// Do this here, or flags don't get set right
328
// Updating 'last moved piece'
329
// Unseting them all is slower, but safer
330
for( int i = 0; i < BOARDSIZE; i++ )
331
for( int j = 0; j < BOARDSIZE; j++ )
332
_board[i][j].unsetJustMoved();
334
_board[erow][ecol].setJustMoved();
340
Board::inDanger(bool is_white, int row, int col) const
341
/***************************************************************************
344
* - Checks to make sure that the legal move the king made is not illegal
345
* by placing himself into check
346
****************************************************************************/
349
//Look up the column for an enemy Rook or Queen
351
for (int i = col+1; i < 8; i++) {
353
if (_board[row][i].getColor() == WHITE)
355
if ((_board[row][i].getColor() == BLACK) &&
356
((_board[row][i].getUnit() == ROOK) ||
357
(_board[row][i].getUnit() == QUEEN)))
359
if (_board[row][i].getColor() == BLACK)
362
if (_board[row][i].getColor() == BLACK)
364
if ((_board[row][i].getColor() == WHITE) &&
365
((_board[row][i].getUnit() == ROOK) ||
366
(_board[row][i].getUnit() == QUEEN)))
368
if(_board[row][i].getColor() == WHITE)
373
//Look down the column for an enemy Rook or Queen
375
for(int i = col-1; i >= 0; i--) {
377
if(_board[row][i].getColor() == WHITE)
379
if( _board[row][i].getColor() == BLACK
380
&&(_board[row][i].getUnit() == ROOK
381
|| _board[row][i].getUnit() == QUEEN) )
383
if(_board[row][i].getColor() == BLACK)
388
if(_board[row][i].getColor() == BLACK)
390
if( _board[row][i].getColor() == WHITE
391
&&(_board[row][i].getUnit() == ROOK
392
|| _board[row][i].getUnit() == QUEEN) )
394
if(_board[row][i].getColor() == WHITE)
399
//Look right across the rows for an enemy Rook or Queen
402
for(int i=row+1; i < 8; i++)
406
if(_board[i][col].getColor() == WHITE)
408
if( _board[i][col].getColor() == BLACK
409
&&(_board[i][col].getUnit() == ROOK
410
|| _board[i][col].getUnit() == QUEEN) )
412
if(_board[i][col].getColor() == BLACK)
417
if(_board[i][col].getColor() == BLACK)
419
if( _board[i][col].getColor() == WHITE
420
&&(_board[i][col].getUnit() == ROOK
421
|| _board[i][col].getUnit() == QUEEN) )
423
if(_board[i][col].getColor() == WHITE)
428
//Look left across the rows for an enemy Rook or Queen
431
for(int i=row-1; i >= 0; i--)
435
if(_board[i][col].getColor() == WHITE)
437
if( _board[i][col].getColor() == BLACK
438
&&(_board[i][col].getUnit() == ROOK
439
|| _board[i][col].getUnit() == QUEEN) )
441
if(_board[i][col].getColor() == BLACK)
446
if(_board[i][col].getColor() == BLACK)
448
if( _board[i][col].getColor() == WHITE
449
&&(_board[i][col].getUnit() == ROOK
450
|| _board[i][col].getUnit() == QUEEN) )
452
if(_board[i][col].getColor() == WHITE)
459
if(row != 7 && col != 7)
461
for(int i = 1; (row+i != 8 && col+i !=8); i++)
465
if(_board[row+i][col+i].getColor() == WHITE)
467
if( _board[row+i][col+i].getColor() == BLACK
468
&&(_board[row+i][col+i].getUnit() == BISHOP
469
|| _board[row+i][col+i].getUnit() == QUEEN) )
471
if(_board[row+i][col+i].getColor() == BLACK)
476
if(_board[row+i][col+i].getColor() == BLACK)
478
if( _board[row+i][col+i].getColor() == WHITE
479
&&(_board[row+i][col+i].getUnit() == BISHOP
480
|| _board[row+i][col+i].getUnit() == QUEEN) )
482
if(_board[row+i][col+i].getColor() == WHITE)
487
if(row != 0 && col != 7)
489
for(int i = 1; (row-i >= 0 && col+i !=8); i++)
493
if(_board[row-i][col+i].getColor() == WHITE)
495
if( _board[row-i][col+i].getColor() == BLACK
496
&&(_board[row-i][col+i].getUnit() == BISHOP
497
|| _board[row-i][col+i].getUnit() == QUEEN) )
499
if(_board[row-i][col+i].getColor() == BLACK)
504
if(_board[row-i][col+i].getColor() == BLACK)
506
if( _board[row-i][col+i].getColor() == WHITE
507
&&(_board[row-i][col+i].getUnit() == BISHOP
508
|| _board[row-i][col+i].getUnit() == QUEEN) )
510
if(_board[row-i][col+i].getColor() == WHITE)
515
if(row != 7 && col != 0)
517
for(int i = 1; (row+i != 8 && col-i >=0); i++)
521
if(_board[row+i][col-i].getColor() == WHITE)
523
if( _board[row+i][col-i].getColor() == BLACK
524
&&(_board[row+i][col-i].getUnit() == BISHOP
525
|| _board[row+i][col-i].getUnit() == QUEEN) )
527
if(_board[row+i][col-i].getColor() == BLACK)
532
if(_board[row+i][col-i].getColor() == BLACK)
534
if( _board[row+i][col-i].getColor() == WHITE
535
&&(_board[row+i][col-i].getUnit() == BISHOP
536
|| _board[row+i][col-i].getUnit() == QUEEN) )
538
if(_board[row+i][col-i].getColor() == WHITE)
543
if(row != 0 && col != 0)
545
for(int i = 1; (row-i >=0 && col-i >=0); i++)
549
if(_board[row-i][col-i].getColor() == WHITE)
551
if( _board[row-i][col-i].getColor() == BLACK
552
&&(_board[row-i][col-i].getUnit() == BISHOP
553
|| _board[row-i][col-i].getUnit() == QUEEN) )
555
if(_board[row-i][col-i].getColor() == BLACK)
560
if(_board[row-i][col-i].getColor() == BLACK)
562
if( _board[row-i][col-i].getColor() == WHITE
563
&&(_board[row-i][col-i].getUnit() == BISHOP
564
|| _board[row-i][col-i].getUnit() == QUEEN) )
566
if(_board[row-i][col-i].getColor() == WHITE)
575
if(row != 0 && col != 0)
577
if(_board[row-1][col-1].getUnit() == PAWN
578
&& _board[row-1][col-1].getColor() == BLACK)
581
if(row != 0 && col != 7)
583
if(_board[row-1][col+1].getUnit() == PAWN
584
&& _board[row-1][col+1].getColor() == BLACK)
590
if(row != 7 && col != 0)
592
if(_board[row+1][col-1].getUnit() == PAWN
593
&& _board[row+1][col-1].getColor() == WHITE)
596
if(row != 7 && col != 7)
598
if(_board[row+1][col+1].getUnit() == PAWN
599
&& _board[row+1][col+1].getColor() == WHITE)
604
// Checking to see if any Knights are putting the king into check.
607
BoardMove knightOne(startrow, startcol, row+1, col+2);
608
BoardMove knightTwo(startrow, startcol, row+1, col-2);
609
BoardMove knightThr(startrow, startcol, row+2, col+1);
610
BoardMove knightFou(startrow, startcol, row+2, col-1);
611
BoardMove knightFiv(startrow, startcol, row-1, col+2);
612
BoardMove knightSix(startrow, startcol, row-1, col-2);
613
BoardMove knightSev(startrow, startcol, row-2, col+1);
614
BoardMove knightEig(startrow, startcol, row-2, col-1);
617
if (Board::is_in(knightOne))
619
if ( _board[row+1][col+2].getUnit() == KNIGHT
620
&& _board[row+1][col+2].getColor() == BLACK)
623
if (Board::is_in(knightTwo))
625
if ( _board[row+1][col-2].getUnit() == KNIGHT
626
&& _board[row+1][col-2].getColor() == BLACK)
629
if (Board::is_in(knightThr))
631
if ( _board[row+2][col+1].getUnit() == KNIGHT
632
&& _board[row+2][col+1].getColor() == BLACK)
635
if (Board::is_in(knightFou))
637
if ( _board[row+2][col-1].getUnit() == KNIGHT
638
&& _board[row+2][col-1].getColor() == BLACK)
641
if (Board::is_in(knightFiv))
643
if ( _board[row-1][col+2].getUnit() == KNIGHT
644
&& _board[row-1][col+2].getColor() == BLACK)
647
if (Board::is_in(knightSix))
649
if ( _board[row-1][col-2].getUnit() == KNIGHT
650
&& _board[row-1][col-2].getColor() == BLACK)
653
if (Board::is_in(knightSev))
655
if ( _board[row-2][col+1].getUnit() == KNIGHT
656
&& _board[row-2][col+1].getColor() == BLACK)
659
if (Board::is_in(knightEig))
661
if ( _board[row-2][col-1].getUnit() == KNIGHT
662
&& _board[row-2][col-1].getColor() == BLACK)
668
if (Board::is_in(knightOne))
670
if ( _board[row+1][col+2].getUnit() == KNIGHT
671
&& _board[row+1][col+2].getColor() == WHITE)
674
if (Board::is_in(knightTwo))
676
if ( _board[row+1][col-2].getUnit() == KNIGHT
677
&& _board[row+1][col-2].getColor() == WHITE)
680
if (Board::is_in(knightThr))
682
if ( _board[row+2][col+1].getUnit() == KNIGHT
683
&& _board[row+2][col+1].getColor() == WHITE)
686
if (Board::is_in(knightFou))
688
if ( _board[row+2][col-1].getUnit() == KNIGHT
689
&& _board[row+2][col-1].getColor() == WHITE)
692
if (Board::is_in(knightFiv))
694
if ( _board[row-1][col+2].getUnit() == KNIGHT
695
&& _board[row-1][col+2].getColor() == WHITE)
698
if (Board::is_in(knightSix))
700
if ( _board[row-1][col-2].getUnit() == KNIGHT
701
&& _board[row-1][col-2].getColor() == WHITE)
704
if (Board::is_in(knightSev))
706
if ( _board[row-2][col+1].getUnit() == KNIGHT
707
&& _board[row-2][col+1].getColor() == WHITE)
710
if (Board::is_in(knightEig))
712
if ( _board[row-2][col-1].getUnit() == KNIGHT
713
&& _board[row-2][col-1].getColor() == WHITE)
718
// Check to make sure a king isn't trying to move next to another king
725
if( _board[row+1][col+1].getUnit() == KING
726
&& _board[row+1][col+1].getColor() == BLACK)
729
if ( _board[row][col+1].getUnit() == KING
730
&& _board[row][col+1].getColor() == BLACK)
734
if( _board[row-1][col+1].getUnit() == KING
735
&& _board[row-1][col+1].getColor() == BLACK)
741
if( _board[row-1][col].getUnit() == KING
742
&& _board[row-1][col].getColor() == BLACK)
746
if ( _board[row-1][col-1].getUnit() == KING
747
&& _board[row-1][col-1].getColor() == BLACK)
753
if( _board[row][col-1].getUnit() == KING
754
&& _board[row][col-1].getColor() == BLACK)
758
if( _board[row+1][col-1].getUnit() == KING
759
&& _board[row+1][col-1].getColor() == BLACK)
765
if( _board[row+1][col].getUnit() == KING
766
&& _board[row+1][col].getColor() == BLACK)
776
if( _board[row+1][col+1].getUnit() == KING
777
&& _board[row+1][col+1].getColor() == WHITE)
780
if ( _board[row][col+1].getUnit() == KING
781
&& _board[row][col+1].getColor() == WHITE)
785
if( _board[row-1][col+1].getUnit() == KING
786
&& _board[row-1][col+1].getColor() == WHITE)
792
if( _board[row-1][col].getUnit() == KING
793
&& _board[row-1][col].getColor() == WHITE)
797
if ( _board[row-1][col-1].getUnit() == KING
798
&& _board[row-1][col-1].getColor() == WHITE)
804
if( _board[row][col-1].getUnit() == KING
805
&& _board[row][col-1].getColor() == WHITE)
809
if( _board[row+1][col-1].getUnit() == KING
810
&& _board[row+1][col-1].getColor() == WHITE)
816
if( _board[row+1][col].getUnit() == KING
817
&& _board[row+1][col].getColor() == WHITE)
826
Board::inDangerCount(bool is_white, int row, int col) const
827
/***************************************************************************
830
* - Checks to make sure that the legal move the king made is not illegal
831
* by placing himself into check
832
****************************************************************************/
836
//Look up the column for an enemy Rook or Queen
840
for(int i=col+1; i < 8; i++)
844
if(_board[row][i].getColor() == WHITE)
846
if( _board[row][i].getColor() == BLACK
847
&&(_board[row][i].getUnit() == ROOK
848
|| _board[row][i].getUnit() == QUEEN) )
850
if(_board[row][i].getColor() == BLACK)
855
if(_board[row][i].getColor() == BLACK)
857
if( _board[row][i].getColor() == WHITE
858
&&(_board[row][i].getUnit() == ROOK
859
|| _board[row][i].getUnit() == QUEEN) )
861
if(_board[row][i].getColor() == WHITE)
866
//Look down the column for an enemy Rook or Queen
869
for(int i=col-1; i >= 0; i--)
873
if(_board[row][i].getColor() == WHITE)
875
if( _board[row][i].getColor() == BLACK
876
&&(_board[row][i].getUnit() == ROOK
877
|| _board[row][i].getUnit() == QUEEN) )
879
if(_board[row][i].getColor() == BLACK)
884
if(_board[row][i].getColor() == BLACK)
886
if( _board[row][i].getColor() == WHITE
887
&&(_board[row][i].getUnit() == ROOK
888
|| _board[row][i].getUnit() == QUEEN) )
890
if(_board[row][i].getColor() == WHITE)
895
//Look right across the rows for an enemy Rook or Queen
898
for(int i=row+1; i < 8; i++)
902
if(_board[i][col].getColor() == WHITE)
904
if( _board[i][col].getColor() == BLACK
905
&&(_board[i][col].getUnit() == ROOK
906
|| _board[i][col].getUnit() == QUEEN) )
908
if(_board[i][col].getColor() == BLACK)
913
if(_board[i][col].getColor() == BLACK)
915
if( _board[i][col].getColor() == WHITE
916
&&(_board[i][col].getUnit() == ROOK
917
|| _board[i][col].getUnit() == QUEEN) )
919
if(_board[i][col].getColor() == WHITE)
924
//Look left across the rows for an enemy Rook or Queen
927
for(int i=row-1; i >= 0; i--)
931
if(_board[i][col].getColor() == WHITE)
933
if( _board[i][col].getColor() == BLACK
934
&&(_board[i][col].getUnit() == ROOK
935
|| _board[i][col].getUnit() == QUEEN) )
937
if(_board[i][col].getColor() == BLACK)
942
if(_board[i][col].getColor() == BLACK)
944
if( _board[i][col].getColor() == WHITE
945
&&(_board[i][col].getUnit() == ROOK
946
|| _board[i][col].getUnit() == QUEEN) )
948
if(_board[i][col].getColor() == WHITE)
955
if(row != 7 && col != 7)
957
for(int i = 1; (row+i != 8 && col+i !=8); i++)
961
if(_board[row+i][col+i].getColor() == WHITE)
963
if( _board[row+i][col+i].getColor() == BLACK
964
&&(_board[row+i][col+i].getUnit() == BISHOP
965
|| _board[row+i][col+i].getUnit() == QUEEN) )
967
if(_board[row+i][col+i].getColor() == BLACK)
972
if(_board[row+i][col+i].getColor() == BLACK)
974
if( _board[row+i][col+i].getColor() == WHITE
975
&&(_board[row+i][col+i].getUnit() == BISHOP
976
|| _board[row+i][col+i].getUnit() == QUEEN) )
978
if(_board[row+i][col+i].getColor() == WHITE)
983
if(row != 0 && col != 7)
985
for(int i = 1; (row-i >= 0 && col+i !=8); i++)
989
if(_board[row-i][col+i].getColor() == WHITE)
991
if( _board[row-i][col+i].getColor() == BLACK
992
&&(_board[row-i][col+i].getUnit() == BISHOP
993
|| _board[row-i][col+i].getUnit() == QUEEN) )
995
if(_board[row-i][col+i].getColor() == BLACK)
1000
if(_board[row-i][col+i].getColor() == BLACK)
1002
if( _board[row-i][col+i].getColor() == WHITE
1003
&&(_board[row-i][col+i].getUnit() == BISHOP
1004
|| _board[row-i][col+i].getUnit() == QUEEN) )
1006
if(_board[row-i][col+i].getColor() == WHITE)
1011
if(row != 7 && col != 0)
1013
for(int i = 1; (row+i != 8 && col-i >=0); i++)
1017
if(_board[row+i][col-i].getColor() == WHITE)
1019
if( _board[row+i][col-i].getColor() == BLACK
1020
&&(_board[row+i][col-i].getUnit() == BISHOP
1021
|| _board[row+i][col-i].getUnit() == QUEEN) )
1023
if(_board[row+i][col-i].getColor() == BLACK)
1028
if(_board[row+i][col-i].getColor() == BLACK)
1030
if( _board[row+i][col-i].getColor() == WHITE
1031
&&(_board[row+i][col-i].getUnit() == BISHOP
1032
|| _board[row+i][col-i].getUnit() == QUEEN) )
1034
if(_board[row+i][col-i].getColor() == WHITE)
1039
if(row != 0 && col != 0)
1041
for(int i = 1; (row-i >=0 && col-i >=0); i++)
1045
if(_board[row-i][col-i].getColor() == WHITE)
1047
if( _board[row-i][col-i].getColor() == BLACK
1048
&&(_board[row-i][col-i].getUnit() == BISHOP
1049
|| _board[row-i][col-i].getUnit() == QUEEN) )
1051
if(_board[row-i][col-i].getColor() == BLACK)
1056
if(_board[row-i][col-i].getColor() == BLACK)
1058
if( _board[row-i][col-i].getColor() == WHITE
1059
&&(_board[row-i][col-i].getUnit() == BISHOP
1060
|| _board[row-i][col-i].getUnit() == QUEEN) )
1062
if(_board[row-i][col-i].getColor() == WHITE)
1071
if(row != 0 && col != 0)
1073
if(_board[row-1][col-1].getUnit() == PAWN
1074
&& _board[row-1][col-1].getColor() == BLACK)
1077
if(row != 0 && col != 7)
1079
if(_board[row-1][col+1].getUnit() == PAWN
1080
&& _board[row-1][col+1].getColor() == BLACK)
1086
if(row != 7 && col != 0)
1088
if(_board[row+1][col-1].getUnit() == PAWN
1089
&& _board[row+1][col-1].getColor() == WHITE)
1092
if(row != 7 && col != 7)
1094
if(_board[row+1][col+1].getUnit() == PAWN
1095
&& _board[row+1][col+1].getColor() == WHITE)
1100
// Checking to see if any Knights are putting the king into check.
1103
BoardMove knightOne(startrow, startcol, row+1, col+2);
1104
BoardMove knightTwo(startrow, startcol, row+1, col-2);
1105
BoardMove knightThr(startrow, startcol, row+2, col+1);
1106
BoardMove knightFou(startrow, startcol, row+2, col-1);
1107
BoardMove knightFiv(startrow, startcol, row-1, col+2);
1108
BoardMove knightSix(startrow, startcol, row-1, col-2);
1109
BoardMove knightSev(startrow, startcol, row-2, col+1);
1110
BoardMove knightEig(startrow, startcol, row-2, col-1);
1113
if (Board::is_in(knightOne))
1115
if ( _board[row+1][col+2].getUnit() == KNIGHT
1116
&& _board[row+1][col+2].getColor() == BLACK)
1119
if (Board::is_in(knightTwo))
1121
if ( _board[row+1][col-2].getUnit() == KNIGHT
1122
&& _board[row+1][col-2].getColor() == BLACK)
1125
if (Board::is_in(knightThr))
1127
if ( _board[row+2][col+1].getUnit() == KNIGHT
1128
&& _board[row+2][col+1].getColor() == BLACK)
1131
if (Board::is_in(knightFou))
1133
if ( _board[row+2][col-1].getUnit() == KNIGHT
1134
&& _board[row+2][col-1].getColor() == BLACK)
1137
if (Board::is_in(knightFiv))
1139
if ( _board[row-1][col+2].getUnit() == KNIGHT
1140
&& _board[row-1][col+2].getColor() == BLACK)
1143
if (Board::is_in(knightSix))
1145
if ( _board[row-1][col-2].getUnit() == KNIGHT
1146
&& _board[row-1][col-2].getColor() == BLACK)
1149
if (Board::is_in(knightSev))
1151
if ( _board[row-2][col+1].getUnit() == KNIGHT
1152
&& _board[row-2][col+1].getColor() == BLACK)
1155
if (Board::is_in(knightEig))
1157
if ( _board[row-2][col-1].getUnit() == KNIGHT
1158
&& _board[row-2][col-1].getColor() == BLACK)
1164
if (Board::is_in(knightOne))
1166
if ( _board[row+1][col+2].getUnit() == KNIGHT
1167
&& _board[row+1][col+2].getColor() == WHITE)
1170
if (Board::is_in(knightTwo))
1172
if ( _board[row+1][col-2].getUnit() == KNIGHT
1173
&& _board[row+1][col-2].getColor() == WHITE)
1176
if (Board::is_in(knightThr))
1178
if ( _board[row+2][col+1].getUnit() == KNIGHT
1179
&& _board[row+2][col+1].getColor() == WHITE)
1182
if (Board::is_in(knightFou))
1184
if ( _board[row+2][col-1].getUnit() == KNIGHT
1185
&& _board[row+2][col-1].getColor() == WHITE)
1188
if (Board::is_in(knightFiv))
1190
if ( _board[row-1][col+2].getUnit() == KNIGHT
1191
&& _board[row-1][col+2].getColor() == WHITE)
1194
if (Board::is_in(knightSix))
1196
if ( _board[row-1][col-2].getUnit() == KNIGHT
1197
&& _board[row-1][col-2].getColor() == WHITE)
1200
if (Board::is_in(knightSev))
1202
if ( _board[row-2][col+1].getUnit() == KNIGHT
1203
&& _board[row-2][col+1].getColor() == WHITE)
1206
if (Board::is_in(knightEig))
1208
if ( _board[row-2][col-1].getUnit() == KNIGHT
1209
&& _board[row-2][col-1].getColor() == WHITE)
1214
// Check to make sure a king isn't trying to move next to another king
1221
if( _board[row+1][col+1].getUnit() == KING
1222
&& _board[row+1][col+1].getColor() == BLACK)
1225
if ( _board[row][col+1].getUnit() == KING
1226
&& _board[row][col+1].getColor() == BLACK)
1230
if( _board[row-1][col+1].getUnit() == KING
1231
&& _board[row-1][col+1].getColor() == BLACK)
1237
if( _board[row-1][col].getUnit() == KING
1238
&& _board[row-1][col].getColor() == BLACK)
1242
if ( _board[row-1][col-1].getUnit() == KING
1243
&& _board[row-1][col-1].getColor() == BLACK)
1249
if( _board[row][col-1].getUnit() == KING
1250
&& _board[row][col-1].getColor() == BLACK)
1254
if( _board[row+1][col-1].getUnit() == KING
1255
&& _board[row+1][col-1].getColor() == BLACK)
1261
if( _board[row+1][col].getUnit() == KING
1262
&& _board[row+1][col].getColor() == BLACK)
1272
if( _board[row+1][col+1].getUnit() == KING
1273
&& _board[row+1][col+1].getColor() == WHITE)
1276
if ( _board[row][col+1].getUnit() == KING
1277
&& _board[row][col+1].getColor() == WHITE)
1281
if( _board[row-1][col+1].getUnit() == KING
1282
&& _board[row-1][col+1].getColor() == WHITE)
1288
if( _board[row-1][col].getUnit() == KING
1289
&& _board[row-1][col].getColor() == WHITE)
1293
if ( _board[row-1][col-1].getUnit() == KING
1294
&& _board[row-1][col-1].getColor() == WHITE)
1300
if( _board[row][col-1].getUnit() == KING
1301
&& _board[row][col-1].getColor() == WHITE)
1305
if( _board[row+1][col-1].getUnit() == KING
1306
&& _board[row+1][col-1].getColor() == WHITE)
1312
if( _board[row+1][col].getUnit() == KING
1313
&& _board[row+1][col].getColor() == WHITE)
1323
Board::is_in(BoardMove move) const
1325
if( move.getStartx() < 8 && move.getStartx() >=0
1326
&& move.getStarty() < 8 && move.getStarty() >=0
1327
&& move.getEndx() < 8 && move.getEndy() >= 0
1328
&& move.getEndy() < 8 && move.getEndy() >= 0 )
1334
// End of file board.cpp