Example #1
0
 // Check if piece has legal moves
 public bool HasLegalMove(Pieces piece)
 {
     FindLegalMoves(piece);
     foreach (Cell cell in Board)
     {
         if (cell.IsLegal)
         {
             return(true);
         }
     }
     return(false);
 }
Example #2
0
 // Check if piece can make aggressive moves
 public bool HasAggressiveMove(Pieces piece)
 {
     FindLegalMoves(piece);
     foreach (Cell cell in Board)
     {
         if (cell.IsLegal && cell.IsOccupied)
         {
             return(true);
         }
     }
     return(false);
 }
Example #3
0
        public void MovePiece(Pieces piece, Cell cell)
        {
            ClearMarkedLegalMoves();
            FindLegalMoves(piece);

            if (cell.IsLegal)
            {
                piece.Position.ChangeStatus();
                piece.Position = cell;
                cell.piece     = piece;

                if (!cell.IsOccupied)
                {
                    cell.ChangeStatus();
                }
            }
        }
Example #4
0
        // Method to move in any direction until obstructed
        public void LineMovement(Pieces piece, int rowMovement, int columnMovement)
        {
            bool Unobstructed = true;

            do
            {
                int desitinationRow   = piece.Position.Row + rowMovement;
                int destinationColumn = piece.Position.Column + columnMovement;

                if (IsOnBoard(desitinationRow, destinationColumn))
                {
                    if (Board[desitinationRow, destinationColumn].Piece == null)
                    {
                        Board[desitinationRow, destinationColumn].IsLegal = true;
                    }
                    else
                    {
                        if (IsOppositeColour(piece.IsWhite, Board[desitinationRow, destinationColumn].Piece.IsWhite))
                        {
                            Board[desitinationRow, destinationColumn].IsLegal = true;
                        }
                        Unobstructed = false;
                    }

                    if (rowMovement != 0)
                    {
                        rowMovement = rowMovement + (rowMovement / Math.Abs(rowMovement));
                    }
                    if (columnMovement != 0)
                    {
                        columnMovement = columnMovement + (columnMovement / Math.Abs(columnMovement));
                    }
                }
                else
                {
                    Unobstructed = false;
                }
            }while (Unobstructed);
        }
Example #5
0
        public static string ConvertPieceToInitial(Pieces piece)
        {
            string pieceInitial = "";

            switch (piece.Name)
            {
            case "Pawn":
                pieceInitial = "P";
                break;

            case "Knight":
                pieceInitial = "N";
                break;

            case "King":
                pieceInitial = "K";
                break;

            case "Bishop":
                pieceInitial = "B";
                break;

            case "Rook":
                pieceInitial = "R";
                break;

            case "Queen":
                pieceInitial = "Q";
                break;
            }

            if (!piece.IsWhite)
            {
                pieceInitial = pieceInitial.ToLower();
            }

            return(pieceInitial);
        }
Example #6
0
        private void CheckPawnLegals(Pieces piece)
        {
            foreach (Move move in piece.PossibleMoves)
            {
                int desitinationRow   = piece.Position.Row + move.MoveRow;
                int destinationColumn = piece.Position.Column + move.MoveColumn;

                if (IsOnBoard(desitinationRow, destinationColumn))
                {
                    // move diagonally only if it's occupied by opposite colour
                    if (desitinationRow != piece.Position.Row && destinationColumn != piece.Position.Column)
                    {
                        if (Board[desitinationRow, destinationColumn].IsOccupied &&
                            IsOppositeColour(piece.IsWhite, Board[desitinationRow, destinationColumn].Piece.IsWhite))
                        {
                            Board[desitinationRow, destinationColumn].IsLegal = true;
                        }
                    }

                    // Moving forward
                    else
                    {
                        // if unobstructed is legal
                        if (!Board[desitinationRow, destinationColumn].IsOccupied)
                        {
                            Board[desitinationRow, destinationColumn].IsLegal = true;

                            // if first move and unoccipied, can move two steps
                            if (piece.IsFirstMove && !Board[desitinationRow + move.MoveRow, destinationColumn + move.MoveColumn].IsOccupied)
                            {
                                Board[desitinationRow + move.MoveRow, destinationColumn + move.MoveColumn].IsLegal = true;
                            }
                        }
                    }
                }
            }
        }
Example #7
0
        public void Promotion(Pieces piece, string newPiece)
        {
            switch (newPiece)
            {
            case "Rook":
                piece.Position.Piece = new Rook(piece.IsWhite, piece.Position);
                break;

            case "Bishop":
                piece.Position.Piece = new Bishop(piece.IsWhite, piece.Position);
                break;

            case "Knight":
                piece.Position.Piece = new Knight(piece.IsWhite, piece.Position);
                break;

            case "Queen":
                piece.Position.Piece = new Queen(piece.IsWhite, piece.Position);
                break;
            }

            // Prevent ChangeStatus() from occuring
            piece.Position.IsOccupied = true;
        }
Example #8
0
        // Create reusable method?
        private void CheckKnightLegals(Pieces piece)
        {
            foreach (Move move in piece.PossibleMoves)
            {
                int desitinationRow   = piece.Position.Row + move.MoveRow;
                int desitnationColumn = piece.Position.Column + move.MoveColumn;

                // Can move anywhere as long as it is of opposite colour or unoccupied
                if (IsOnBoard(desitinationRow, desitnationColumn))
                {
                    if (Board[desitinationRow, desitnationColumn].Piece == null)
                    {
                        Board[desitinationRow, desitnationColumn].IsLegal = true;
                    }
                    else
                    {
                        if (IsOppositeColour(piece.IsWhite, Board[desitinationRow, desitnationColumn].Piece.IsWhite))
                        {
                            Board[desitinationRow, desitnationColumn].IsLegal = true;
                        }
                    }
                }
            }
        }
Example #9
0
        // Can make this shorter? (DRY)
        // Create method to check each of these and reuse?
        // Pawn only move forward, unless piece of opposite colour on diagonal
        // Check if path is obstructed? (if piece is blocked, do not move in that direction anymore) for Q, R, B
        // Check if K is in check, if so next move must move piece out of check (i.e check if K is on same cell as legal move)
        // Check if K is in mate, if so end the game (check all K legal and occupied positions are in opponents legal move)
        // Castling, en passant?
        // Promotion, when pawn reaches other side of the board, give choice on which piece to choose (B R Q N)

        public void FindLegalMoves(Pieces piece)
        {
            if (piece.Name == "Pawn")
            {
                foreach (Move move in piece.PossibleMoves)
                {
                    int desitinationRow   = piece.Position.Row + move.MoveRow;
                    int desitnationColumn = piece.Position.Column + move.MoveColumn;

                    if (IsOnBoard(desitinationRow, desitnationColumn))
                    {
                        // move 2 only if first move and empty or occupied by opposite colour and it's the first move
                        if (Math.Abs(move.MoveRow) == 2)
                        {
                            if (piece.IsFirstMove &&
                                (Board[desitinationRow, desitnationColumn].piece == null ||
                                 IsOppositeColour(piece.IsWhite, Board[desitinationRow, desitnationColumn].piece.IsWhite)))
                            {
                                Board[desitinationRow, desitnationColumn].IsLegal = true;
                                piece.IsFirstMove = false;
                            }
                        }

                        // move diagonally only if it's occupied by opposite colour
                        else if (desitinationRow != piece.Position.Row && desitnationColumn != piece.Position.Column)
                        {
                            if (Board[desitinationRow, desitnationColumn].IsOccupied &&
                                IsOppositeColour(piece.IsWhite, Board[desitinationRow, desitnationColumn].piece.IsWhite))
                            {
                                Board[desitinationRow, desitnationColumn].IsLegal = true;
                            }
                        }

                        // Moving forward by 1
                        else
                        {
                            if (!Board[desitinationRow, desitnationColumn].IsOccupied ||
                                IsOppositeColour(piece.IsWhite, Board[desitinationRow, desitnationColumn].piece.IsWhite))
                            {
                                Board[desitinationRow, desitnationColumn].IsLegal = true;
                            }
                        }
                    }
                }
            }

            else if (piece.Name == "King" || piece.Name == "Knight")
            {
                foreach (Move move in piece.PossibleMoves)
                {
                    int desitinationRow   = piece.Position.Row + move.MoveRow;
                    int desitnationColumn = piece.Position.Column + move.MoveColumn;
                    if (IsOnBoard(desitinationRow, desitnationColumn))
                    {
                        if (Board[desitinationRow, desitnationColumn].piece == null)
                        {
                            Board[desitinationRow, desitnationColumn].IsLegal = true;
                        }
                        else
                        {
                            if (IsOppositeColour(piece.IsWhite, Board[desitinationRow, desitnationColumn].piece.IsWhite))
                            {
                                Board[desitinationRow, desitnationColumn].IsLegal = true;
                            }
                        }
                    }
                }
            }

            else if (piece.Name == "Rook")
            {
                CheckRookObstruction(piece);
            }

            else if (piece.Name == "Bishop")
            {
                CheckBishopObstruction(piece);
            }

            else if (piece.Name == "Queen")
            {
                CheckRookObstruction(piece);
                CheckBishopObstruction(piece);
            }
        }
Example #10
0
        private void CheckBishopObstruction(Pieces piece)
        {
            // backward movement
            bool Unobstructed = true;
            int  movement     = 1;

            do
            {
                int desitinationRow   = piece.Position.Row + movement;
                int destinationColumn = piece.Position.Column + movement;
                if (IsOnBoard(desitinationRow, destinationColumn))
                {
                    if (Board[desitinationRow, destinationColumn].piece == null)
                    {
                        Board[desitinationRow, destinationColumn].IsLegal = true;
                    }
                    else
                    {
                        if (IsOppositeColour(piece.IsWhite, Board[desitinationRow, destinationColumn].piece.IsWhite))
                        {
                            Board[desitinationRow, destinationColumn].IsLegal = true;
                        }
                        Unobstructed = false;
                    }
                    ++movement;
                }
                else
                {
                    Unobstructed = false;
                }
            }while (Unobstructed);

            // forward movement
            Unobstructed = true;
            movement     = 1;
            do
            {
                int desitinationRow   = piece.Position.Row - movement;
                int destinationColumn = piece.Position.Column + movement;

                if (IsOnBoard(desitinationRow, destinationColumn))
                {
                    if (Board[desitinationRow, destinationColumn].piece == null)
                    {
                        Board[desitinationRow, destinationColumn].IsLegal = true;
                    }
                    else
                    {
                        if (IsOppositeColour(piece.IsWhite, Board[desitinationRow, destinationColumn].piece.IsWhite))
                        {
                            Board[desitinationRow, destinationColumn].IsLegal = true;
                        }
                        Unobstructed = false;
                    }
                    ++movement;
                }
                else
                {
                    Unobstructed = false;
                }
            }while (Unobstructed);

            // left movement
            Unobstructed = true;
            movement     = 1;
            do
            {
                int desitinationRow   = piece.Position.Row + movement;
                int destinationColumn = piece.Position.Column - movement;

                if (IsOnBoard(desitinationRow, destinationColumn))
                {
                    if (Board[desitinationRow, destinationColumn].piece == null)
                    {
                        Board[desitinationRow, destinationColumn].IsLegal = true;
                    }
                    else
                    {
                        if (IsOppositeColour(piece.IsWhite, Board[desitinationRow, destinationColumn].piece.IsWhite))
                        {
                            Board[desitinationRow, destinationColumn].IsLegal = true;
                        }
                        Unobstructed = false;
                    }
                    ++movement;
                }
                else
                {
                    Unobstructed = false;
                }
            }while (Unobstructed);

            // right movement
            Unobstructed = true;
            movement     = 1;
            do
            {
                int desitinationRow   = piece.Position.Row - movement;
                int destinationColumn = piece.Position.Column - movement;

                if (IsOnBoard(desitinationRow, destinationColumn))
                {
                    if (Board[desitinationRow, destinationColumn].piece == null)
                    {
                        Board[desitinationRow, destinationColumn].IsLegal = true;
                    }
                    else
                    {
                        if (IsOppositeColour(piece.IsWhite, Board[desitinationRow, destinationColumn].piece.IsWhite))
                        {
                            Board[desitinationRow, destinationColumn].IsLegal = true;
                        }
                        Unobstructed = false;
                    }
                    ++movement;
                }
                else
                {
                    Unobstructed = false;
                }
            }while (Unobstructed);
        }
Example #11
0
 /** This takes a string and returns the Player's piece that's name equals the string
  * @param a_pieceString - The string we are matching to a piece
  * @returns The piece that's name matches the string
  * @author Thomas Hooper
  * @date August 2019
  */
 public Piece ReturnPieceFromString(string a_pieceString)
 {
     return(Pieces.Find(x => x.Name.Equals(a_pieceString)));
 }
Example #12
0
        /** This method generates all the possible moves the player is able to make
         * It goes through each piece and their valid squares and determines if it can
         * make each move for each piece and square. It also evaluates if the piece can capture,
         * castle or en passant
         * @param a_player - The opposing player
         * @param a_board - The board the game is played on
         * @param a_previousMove - the previous move that was played
         * @author Thomas Hooper
         * @date July 2019
         */
        public void GenerateMoves(Player a_player, Board a_board, Move a_previousMove)
        {
            List <Move> moves = new List <Move>();

            foreach (Piece p in Pieces)
            {
                foreach (BoardSquare s in p.ValidSquares)
                {
                    #region Just Moving
                    if (!s.Occupied)
                    {
                        moves.Add(new Move(s, p));
                    }
                    #endregion
                    #region Capturing
                    else
                    {
                        if (a_player.Pieces.Exists(x => x.Row == s.Row && x.Column == s.Column))                        //BoardSquare Color
                        {
                            if (p.AttackingSquares.Exists(x => x.Row == s.Row && x.Column == s.Column) && s.PieceColor != p.Color)
                            {
                                Piece capturedPiece = a_player.Pieces.Find(x => x.Row == s.Row && x.Column == s.Column);
                                moves.Add(new Move(s, p, capturedPiece));
                            }
                        }
                    }
                    #endregion
                }
            }

            #region En Passant
            if (a_previousMove != null)
            {
                if (a_previousMove.MovingPiece is Pawn && (a_previousMove.MovingPiece.Row == 3 || a_previousMove.MovingPiece.Row == 4))
                {
                    if (Pieces.Exists(x => x is Pawn && x.Row == a_previousMove.MovingPiece.Row))
                    {
                        if (a_previousMove.MovingPiece.Color == Color.White && a_previousMove.MovingPiece.Row == 4)
                        {
                            if (a_previousMove.OriginalSquare.Row == 6)
                            {
                                List <Piece> pawns = Pieces.FindAll(x => x.Row == 4);
                                foreach (Piece p in pawns)
                                {
                                    if (Math.Abs(p.Column - a_previousMove.MovingPiece.Column) == 1)
                                    {
                                        BoardSquare square = a_board.ReturnSquare(a_previousMove.OriginalSquare.Row + 1, a_previousMove.OriginalSquare.Column);
                                        moves.Add(new Move(square, p)
                                        {
                                            EnPassant = true
                                        });
                                    }
                                }
                            }
                        }
                        else if (a_previousMove.MovingPiece.Color == Color.Black && a_previousMove.MovingPiece.Row == 3)
                        {
                            if (a_previousMove.OriginalSquare.Row == 1)
                            {
                                List <Piece> pawns = Pieces.FindAll(x => x.Row == 3);
                                foreach (Piece p in pawns)
                                {
                                    if (Math.Abs(p.Column - a_previousMove.MovingPiece.Column) == 1)
                                    {
                                        BoardSquare square = a_board.ReturnSquare(a_previousMove.OriginalSquare.Row - 1, a_previousMove.OriginalSquare.Column);
                                        moves.Add(new Move(square, p)
                                        {
                                            EnPassant = true
                                        });
                                    }
                                }
                            }
                        }
                    }
                }
            }
            #endregion
            #region Castling
            King k = (King)Pieces.Find(x => x is King);
            if (!k.HasMoved && !Check)
            {
                BoardSquare s1 = new BoardSquare();
                BoardSquare s2 = new BoardSquare();
                BoardSquare s3 = new BoardSquare();
                if (Pieces.Exists(x => x is Rook && !x.HasMoved && x.Column == 7))
                {
                    Rook r = (Rook)Pieces.Find(x => x is Rook && !x.HasMoved && x.Column == 7);
                    s1 = a_board.ReturnSquare(k.Row, k.Column + 1);
                    s2 = a_board.ReturnSquare(k.Row, k.Column + 2);
                    if (!s1.Occupied && !s2.Occupied)
                    {
                        moves.Add(new Move(s2, k, r, true));
                    }
                }
                if (Pieces.Exists(x => x is Rook && !x.HasMoved && x.Column == 0))
                {
                    Rook r = (Rook)Pieces.Find(x => x is Rook && !x.HasMoved && x.Column == 0);
                    s1 = a_board.ReturnSquare(k.Row, k.Column - 1);
                    s2 = a_board.ReturnSquare(k.Row, k.Column - 2);
                    s3 = a_board.ReturnSquare(k.Row, k.Column - 3);

                    if (!s1.Occupied && !s2.Occupied && !s3.Occupied)
                    {
                        moves.Add(new Move(s2, k, r, true));
                    }
                }
            }
            #endregion
            Moves = moves;
        }