예제 #1
0
        public IChessGame Move(string move) // Pe2e4  Pe7e8Q
        {
            var movingFigure = new MovingFigure(move);

            if (board.GetFigureAt(movingFigure.From) == Figure.None)
            {
                return(this);
            }
            if ((movingFigure.Figure == Figure.BlackKing || movingFigure.Figure == Figure.WhiteKing) &&
                (movingFigure.AbsDeltaX == 2 && movingFigure.AbsDeltaY == 0))    // its castling
            {
                var targetColor = movingFigure.Figure.GetColor();
                if (targetColor != board.MoveColor)
                {
                    return(this);
                }
                var isToKingside = movingFigure.SignX > 0;
                if (CanKingCastle(isToKingside))
                {
                    return(Castle(isToKingside));
                }
                else
                {
                    return(this);
                }
            }
            if (!currentMove.CanMove(movingFigure))
            {
                return(this);
            }
            if (board.IsCheckAfterMove(movingFigure))
            {
                return(this);
            }
            var nextBoard         = board.Move(movingFigure);
            var nextChessPosition = new ChessGame(nextBoard);

            if (nextBoard.IsCheckAfterMove(movingFigure))
            {
                CheckTo = (Common.Helpers.Color)nextBoard.MoveColor;
                if (nextChessPosition.ComputeAllMoves().Count < 1)
                {
                    MateTo = (Common.Helpers.Color)nextBoard.MoveColor;
                }
            }
            else
            {
                CheckTo = Common.Helpers.Color.None;
            }
            return(nextChessPosition);
        }
예제 #2
0
        public List <string> GetAllValidMovesForFigureAt(int x, int y)
        {
            var validMoves   = new List <string>();
            var targetSquare = new Square(x, y);

            if (!targetSquare.IsOnBoard())
            {
                return(validMoves);
            }

            var targetFigure = board.GetFigureAt(targetSquare);

            if (targetFigure == Figure.None || targetFigure.GetColor() != board.MoveColor)
            {
                return(validMoves);
            }

            var          figureOnSquare = new FigureOnSquare(targetFigure, targetSquare);
            MovingFigure movingFigure;

            foreach (var squareTo in Square.YieldSquares())
            {
                movingFigure = new MovingFigure(figureOnSquare, squareTo);
                if (currentMove.CanMove(movingFigure) &&
                    !board.IsCheckAfterMove(movingFigure))
                {
                    validMoves.Add(((char)('a' + squareTo.X)).ToString() + (squareTo.Y + 1));
                }
            }

            if (targetFigure == Figure.BlackKing || targetFigure == Figure.WhiteKing)
            {
                if (CanKingCastle(true))
                {
                    validMoves.Add($"g{y + 1}");
                }
                if (CanKingCastle(false))
                {
                    validMoves.Add($"c{y + 1}");
                }
            }

            return(validMoves);
        }
예제 #3
0
        private List <MovingFigure> ComputeAllMoves()
        {
            var          allMoves = new List <MovingFigure>();
            MovingFigure movingFigure;

            foreach (var figureOnSquare in board.YieldFigures())
            {
                foreach (var squareTo in Square.YieldSquares())
                {
                    movingFigure = new MovingFigure(figureOnSquare, squareTo);
                    if (currentMove.CanMove(movingFigure) &&
                        !board.IsCheckAfterMove(movingFigure))
                    {
                        allMoves.Add(movingFigure);
                    }
                }
            }

            return(allMoves);
        }
예제 #4
0
파일: Move.cs 프로젝트: LazloSoot/ChessGame
 public bool CanMove(MovingFigure movingFigure)
 {
     this.movingFigure = movingFigure;
     return(movingFigure.To.IsOnBoard() && CanFigureMove() && CanMove() && CanMoveTo());
 }
예제 #5
0
        private bool CanKingCastle(bool isToKingside)
        {
            board.MoveColor = board.MoveColor.FlipColor();
            if (board.IsCheckTo())
            {
                board.MoveColor = board.MoveColor.FlipColor();
                return(false);
            }
            board.MoveColor = board.MoveColor.FlipColor();
            var isWhiteSide = board.MoveColor == Moves.Helpers.Color.White;
            var king        = (isWhiteSide) ? Figure.WhiteKing : Figure.BlackKing;
            var rookFigure  = (isWhiteSide) ? Figure.WhiteRook : Figure.BlackRook;
            var y           = (isWhiteSide) ? 0 : 7;
            var stepX       = (isToKingside) ? 1 : -1;

            if (!IsCastlingPossible(stepX > 0, king.GetColor()))
            {
                return(false);
            }
            MovingFigure mf;

            if (stepX == -1)
            {
                if (board.GetFigureAt(1, y) != Figure.None ||
                    board.GetFigureAt(2, y) != Figure.None ||
                    board.GetFigureAt(3, y) != Figure.None)
                {
                    return(false);
                }
            }
            else
            {
                if (board.GetFigureAt(6, y) != Figure.None ||
                    board.GetFigureAt(5, y) != Figure.None)
                {
                    return(false);
                }
            }
            var firstKingDestSquare = new Square(4 + stepX, y);

            mf = new MovingFigure(new FigureOnSquare(king, new Square(4, y)), firstKingDestSquare);
            if (!currentMove.CanMove(mf))
            {
                return(false);
            }
            if (board.IsCheckAfterMove(mf))
            {
                return(false);
            }

            var boardAfterFirstMove    = board.GetBoardAfterFirstKingCastlingMove(mf);
            var moveAfterFirstKingMove = new Move(boardAfterFirstMove);
            var finalKingDestSquare    = new Square(firstKingDestSquare.X + stepX, y);

            mf = new MovingFigure(new FigureOnSquare(king, firstKingDestSquare), finalKingDestSquare);
            if (!moveAfterFirstKingMove.CanMove(mf))
            {
                return(false);
            }
            if (boardAfterFirstMove.IsCheckAfterMove(mf))
            {
                return(false);
            }

            return(true);
        }
예제 #6
0
 private void Awake()
 {
     figure    = transform.parent.parent.GetComponent <MovingFigure>();
     direction = transform.localPosition;
 }