Exemple #1
0
        internal override MoveCheckResult CanMoveLeft(ChessBoard board, BoardTile currentTile, BoardTile destinationTile, int count = 8)
        {
            MoveCheckResult result = base.CanMoveLeft(board, currentTile, destinationTile, count);

            // Check for legal castling move
            if (isInInitialPosition)
            {
                var rooks = board.TilesByPieceType(typeof(Rook), this.IsWhite);

                foreach (var rook in rooks)
                {
                    if (rook != destinationTile)
                    {
                        continue;
                    }

                    if (rook.OccupyingPiece is Rook piece)
                    {
                        if (piece.IsInInitialPosition)
                        {
                            if (rook.X == 0)
                            {
                                // check right path
                                if (board.Tiles[currentTile.Y, currentTile.X - 1].OccupyingPiece == null && rook.CanMoveTo(board, board.Tiles[currentTile.Y, currentTile.X - 1]))
                                {
                                    result = MoveCheckResult.CanMove;
                                }
                            }
                            else if (rook.X == 7)
                            {
                                // check left path
                                if (board.Tiles[currentTile.Y, currentTile.X + 1].OccupyingPiece == null && rook.CanMoveTo(board, board.Tiles[currentTile.Y, currentTile.X + 1]))
                                {
                                    result = MoveCheckResult.CanMove;
                                }
                            }
                        }
                    }
                }
            }

            return(result);
        }
Exemple #2
0
 /// <summary>
 /// Returns if the given <see cref="MoveCheckResult"/> represents a legal move, even if that move is incomplete.
 /// </summary>
 public static bool IsLegalMove(this MoveCheckResult moveCheckResult)
 => (moveCheckResult & MoveCheckResult.IllegalMove) == MoveCheckResult.OK;
Exemple #3
0
        private void CompareMoveTypes(MoveType expectedMoveType, MoveType actualMoveType, ref MoveCheckResult moveCheckResult)
        {
            if (actualMoveType != expectedMoveType)
            {
                if (expectedMoveType == MoveType.Default || actualMoveType != MoveType.Default)
                {
                    // Given actualMoveType should not have been specified.
                    switch (actualMoveType)
                    {
                    case MoveType.Promotion:
                        moveCheckResult |= MoveCheckResult.IllegalMoveTypePromotion;
                        break;

                    case MoveType.EnPassant:
                        moveCheckResult |= MoveCheckResult.IllegalMoveTypeEnPassant;
                        break;

                    case MoveType.CastleQueenside:
                        moveCheckResult |= MoveCheckResult.IllegalMoveTypeCastleQueenside;
                        break;

                    case MoveType.CastleKingside:
                        moveCheckResult |= MoveCheckResult.IllegalMoveTypeCastleKingside;
                        break;
                    }
                }
                else
                {
                    // Only warn that a different MoveType was expected. Not an illegal move though.
                    switch (expectedMoveType)
                    {
                    case MoveType.Promotion:
                        moveCheckResult |= MoveCheckResult.MissingPromotionInformation;
                        break;

                    case MoveType.EnPassant:
                        moveCheckResult |= MoveCheckResult.MissingEnPassant;
                        break;

                    case MoveType.CastleQueenside:
                        moveCheckResult |= MoveCheckResult.MissingCastleQueenside;
                        break;

                    case MoveType.CastleKingside:
                        moveCheckResult |= MoveCheckResult.MissingCastleKingside;
                        break;
                    }
                }
            }
        }