/*Update Board with specific Move, perform Promotion if necessary*/ void updateBoard(Game *game, Move *move){ if (move == NULL) return; updateCastling(game, move); //Not implemented char c = game->board[move->source->column][move->source->row]; game->board[move->source->column][move->source->row] = EMPTY; game->board[move->dest->column][move->dest->row] = c; if (move->promotion != NONETYPE){ Color col = getColFromChar(c); game->board[move->dest->column][move->dest->row] = getCharFromType(move->promotion, col); } }
/* Executes a move */ int makeMove(Board *brd, Move move) { int piece, kingSquare; piece = brd->piecesBySquare[move.from]; if(move.capture != noPiece) removePiece(brd,move.to); if (move.promotion != noPiece) { addPiece(brd, move.to, move.promotion); removePiece(brd, move.from); } else { movePiece(brd, move.from, move.to); } if (move.from == H1 && move.to == F1 && move.castling == 1) movePiece(brd,E1,G1); if (move.from == A1 && move.to == D1 && move.castling == 1) movePiece(brd,E1,C1); if (move.from == H8 && move.to == F8 && move.castling == 1) movePiece(brd,E8,G8); if (move.from == A8 && move.to == D8 && move.castling == 1) movePiece(brd,E8,C8); if (move.from == E1 && move.to == G1 && move.castling == 1) movePiece(brd,H1,F1); if (move.from == E1 && move.to == C1 && move.castling == 1) movePiece(brd,A1,D1); if (move.from == E8 && move.to == G8 && move.castling == 1) movePiece(brd,H8,F8); if (move.from == E8 && move.to == C8 && move.castling == 1) movePiece(brd,A8,D8); updateCastling(brd, move); brd->prevMoves[brd->numMoves++] = move; if ( ((piece == wKing) && (isSquareThreat(brd, move.to, BLACK))) || ((piece == bKing) && (isSquareThreat(brd, move.to, WHITE))) ) return FALSE; if(brd->side == WHITE) { kingSquare = brd->squaresByPieces[wKing][0]; if(isSquareThreat(brd, kingSquare, BLACK)) { return FALSE; } } else { kingSquare = brd->squaresByPieces[bKing][0]; if(isSquareThreat(brd, kingSquare, WHITE)) { return FALSE; } } return TRUE; }