예제 #1
0
        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);
        }
예제 #2
0
        private bool IsIllegalMove(Move move)
        {
            var tempBoard = new Board.Board(_board);

            tempBoard.MovePiece(move);

            return(IsCheck(move.Color, tempBoard));
        }
예제 #3
0
        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();
        }
예제 #4
0
        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);
        }