private (bool Castled, string Error) CastleQueenSide(Board.Board board) { KeyValuePair <int, int> rookPos, rookMove, kingMove; if (this.Color == PieceColorEnum.Black) { rookPos = board.ConvertNotationForMove("a8"); rookMove = board.ConvertNotationForMove("d8"); kingMove = board.ConvertNotationForMove("c8"); } else { rookPos = board.ConvertNotationForMove("a1"); rookMove = board.ConvertNotationForMove("d1"); kingMove = board.ConvertNotationForMove("c1"); } // can't castle if it puts in check. run a simulation King kingCopy = (King)board.DeepClone(this); Board.Board simBoard = (Board.Board)board.DeepClone(board); simBoard.MovePiece(kingCopy, kingMove.Key, kingMove.Value); if (!kingCopy.IsInCheck(simBoard)) { return(false, "castling results in a check"); } // castle Rook rook = (Rook)board.Instance[rookPos.Key, rookPos.Value]; board.MovePiece(rook, rookMove.Key, rookMove.Value); board.MovePiece(this, kingMove.Key, kingMove.Value); return(true, string.Empty); }
private bool IsIllegalMove(Move move) { var tempBoard = new Board.Board(_board); tempBoard.MovePiece(move); return(IsCheck(move.Color, tempBoard)); }
private void PerformMove(Move move) { _board.MovePiece(move); if (IsCheck(move.Color.Opposite(), _board)) { move.IsCheck = true; } if (IsCheckMate(move.Color.Opposite(), _board)) { move.IsMate = true; } _signalBus.Fire(new PerformMoveSignal(move)); _possibleLegalMoves.Clear(); }
private List <Move> GetAntiCheckMoves(PieceColor color, Board.Board board) { var antiCheckMoves = new List <Move>(); foreach (var data in board.ChessPieceData.Where(d => d.Color == color)) { var possibleMoves = GetPossibleMoves(data.Position, board); foreach (var possibleMove in possibleMoves) { var tempBoard = new Board.Board(board); tempBoard.MovePiece(possibleMove); if (!IsCheck(color, tempBoard)) { antiCheckMoves.Add(possibleMove); } } } return(antiCheckMoves); }