summaryrefslogtreecommitdiff
path: root/chesshelpers.c
diff options
context:
space:
mode:
Diffstat (limited to 'chesshelpers.c')
-rw-r--r--chesshelpers.c47
1 files changed, 40 insertions, 7 deletions
diff --git a/chesshelpers.c b/chesshelpers.c
index 1b28ed3..d0464fb 100644
--- a/chesshelpers.c
+++ b/chesshelpers.c
@@ -7,9 +7,11 @@
board_t init_board(int** pieces) {
board_t board;
board.pieces = pieces;
- board.blackKingHasMoved = 0;
- board.whiteKingHasMoved = 0;
- board.lastPawnMove = 0;
+ board.whiteCanCastleKingside = 1;
+ board.whiteCanCastleQueenside = 1;
+ board.blackCanCastleKingside = 1;
+ board.blackCanCastleQueenside = 1;
+ board.lastPawnMove = -1;
return board;
}
//function applies side effects to board values like king move state
@@ -17,13 +19,44 @@ board_t make_move(board_t board, vector_t origin, vector_t end) {
int piece = board.pieces[origin.mx][origin.my];
board.pieces[origin.mx][origin.my] = 0;
board.pieces[end.mx][end.my] = piece;
+ //white king moved
+ if(piece == king) {
+ board.whiteCanCastleQueenside = 0;
+ board.whiteCanCastleKingside = 0;
+ }
+ //white kingside rook moved
+ else if(origin.mx == 7 && origin.my == 7) {
+ board.whiteCanCastleKingside = 0;
+ }
+ //white queenside rook moved
+ else if(origin.mx == 0 && origin.my == 7) {
+ board.whiteCanCastleQueenside = 0;
+ }
+ //black king moved
+ else if(piece == king + 6) {
+ board.blackCanCastleQueenside = 0;
+ board.blackCanCastleKingside = 0;
+ }
+ //black kingside rook moved
+ else if(origin.mx == 7 && origin.my == 0) {
+ board.blackCanCastleKingside = 0;
+ }
+ //black queenside rook moved
+ else if(origin.mx == 0 && origin.my == 0) {
+ board.blackCanCastleQueenside = 0;
+ }
+ //this is not an else if! lastPawnMove must be reset
+ if(piece == pawn || piece == pawn + 6) {
+ board.lastPawnMove = origin.mx;
+ }
+ else {
+ //en passant no longer possible
+ board.lastPawnMove = -1;
+ }
return board;
}
board_t clone_board(board_t board) {
- board_t newBoard;
- newBoard.blackKingHasMoved = board.blackKingHasMoved;
- newBoard.whiteKingHasMoved = board.whiteKingHasMoved;
- newBoard.lastPawnMove = board.lastPawnMove;
+ board_t newBoard = board;
int** pieces = malloc(8 * sizeof(int*));
for(int r = 0; r < 8; r++) {
pieces[r] = malloc(8 * sizeof(int));