コード例 #1
0
        internal bool DoMove(Piece piece, Position newPos, Chessboard board)
        {
            bool Obstacle = false;

            // Store a temporary state of the board
            Chessboard tempBoard     = Chessboard.DeepClone(board);
            Piece      pieceMirrored = DeepClone(piece);


            // Check if there any same-side pieces in the way of the moving piece
            // Knight is an eception
            if (!piece.GetType().Equals(typeof(Knight)))
            {
                int Dx = newPos.X - piece.CurrentPosition.X;
                int Dy = newPos.Y - piece.CurrentPosition.Y;

                // Perform mirror operations when needed
                Position newPosMirrored = new Position(newPos.X, newPos.Y);
                if (Dx < 0)
                {
                    tempBoard.State  = HorizontalMirror(tempBoard.State);
                    newPosMirrored.X = (ushort)(7 - newPos.X);
                    pieceMirrored.CurrentPosition.X = (ushort)(7 - piece.CurrentPosition.X);
                }
                if (Dy < 0)
                {
                    tempBoard.State  = VerticalMirror(tempBoard.State);
                    newPosMirrored.Y = (ushort)(7 - newPos.Y);
                    pieceMirrored.CurrentPosition.Y = (ushort)(7 - piece.CurrentPosition.Y);
                }

                Dx = newPosMirrored.X - pieceMirrored.CurrentPosition.X;
                Dy = newPosMirrored.Y - pieceMirrored.CurrentPosition.Y;

                if (Dx == 0)
                {
                    for (int iy = pieceMirrored.CurrentPosition.Y + 1; iy < newPosMirrored.Y; iy++)
                    {
                        if (tempBoard.State[newPosMirrored.X, iy] == null)
                        {
                            continue;
                        }

                        if (iy < newPosMirrored.Y && tempBoard.State[newPosMirrored.X, iy].Side != pieceMirrored.Side)
                        {
                            Obstacle = true;
                        }

                        if (tempBoard.State[newPosMirrored.X, iy].Side == pieceMirrored.Side)
                        {
                            Obstacle = true;
                        }
                    }
                }
                else if (Dy == 0) // Connection line between moves is horizontal
                {
                    for (int ix = pieceMirrored.CurrentPosition.X + 1; ix < newPosMirrored.X; ix++)
                    {
                        if (tempBoard.State[ix, newPosMirrored.Y] == null)
                        {
                            continue;
                        }

                        if (ix < newPosMirrored.X && tempBoard.State[ix, newPosMirrored.Y].Side != pieceMirrored.Side)
                        {
                            Obstacle = true;
                        }

                        if (tempBoard.State[ix, newPosMirrored.Y].Side == pieceMirrored.Side)
                        {
                            Obstacle = true;
                        }
                    }
                }
                else if (Dy / Dx == 1) // Connection line between moves is diagonal
                {
                    int ix = pieceMirrored.CurrentPosition.X + 1;
                    int iy = pieceMirrored.CurrentPosition.Y + 1;

                    for (int i = pieceMirrored.CurrentPosition.X; i < newPosMirrored.X; i++)
                    {
                        if (tempBoard.State[ix, iy] == null)
                        {
                            ix++;
                            iy++;
                            continue;
                        }

                        if (tempBoard.State[ix, iy].Side == pieceMirrored.Side)
                        {
                            Obstacle = true;
                        }

                        if (ix < newPosMirrored.X && iy < newPosMirrored.Y && tempBoard.State[ix, iy].Side != pieceMirrored.Side)
                        {
                            Obstacle = true;
                        }

                        ix++;
                        iy++;
                    }
                }
            }


            // Check if in the end position of the move there is a piece of the same side
            if (board.State[newPos.X, newPos.Y]?.Side == piece.Side)
            {
                Obstacle = true;
            }

            if (!Obstacle)
            {
                board.State[newPos.X, newPos.Y] = piece;
                board.State[piece.CurrentPosition.X, piece.CurrentPosition.Y] = null;
                piece.CurrentPosition.X = newPos.X;
                piece.CurrentPosition.Y = newPos.Y;
                return(true);
            }
            return(false);
        }
コード例 #2
0
        internal bool CheckKingsSafety(Piece pieceMoving, Position newPos, Chessboard board)
        {
            bool       mat       = false;
            Side       defSide   = pieceMoving.Side;
            Chessboard tempBoard = Chessboard.DeepClone(board);
            //Piece pieceMirrored = DeepClone(pieceMoving);
            King defKing = tempBoard.FindKing(defSide);

            int Dx = pieceMoving.CurrentPosition.X - defKing.CurrentPosition.X;
            int Dy = pieceMoving.CurrentPosition.Y - defKing.CurrentPosition.Y;

            // Perform mirror operations when needed
            if (Dx < 0)
            {
                tempBoard.State = HorizontalMirror(tempBoard.State);
            }
            if (Dy < 0)
            {
                tempBoard.State = VerticalMirror(tempBoard.State);
            }

            // Find king again if board was mirrored
            defKing = tempBoard.FindKing(defSide);

            // Store possible enemy piece that might has mat.
            Piece possibleMatPiece = null;

            if (Dx == 0)
            {
                for (int iy = defKing.CurrentPosition.Y + 1; iy < 8; iy++)
                {
                    if (tempBoard.State[defKing.CurrentPosition.X, iy]?.Side != defSide)
                    {
                        possibleMatPiece = tempBoard.State[defKing.CurrentPosition.X, iy];
                    }
                }
            }
            else if (Dy == 0)
            {
                for (int ix = defKing.CurrentPosition.X + 1; ix < 8; ix++)
                {
                    if (tempBoard.State[ix, defKing.CurrentPosition.Y]?.Side != defSide)
                    {
                        possibleMatPiece = tempBoard.State[ix, defKing.CurrentPosition.Y];
                    }
                }
            }
            else
            {
                int ix = defKing.CurrentPosition.X + 1;
                int iy = defKing.CurrentPosition.Y + 1;

                for (int i = defKing.CurrentPosition.X; i < 8; i++)
                {
                    if (tempBoard.State[ix, iy] == null)
                    {
                        ix++;
                        iy++;
                        continue;
                    }

                    if (tempBoard.State[ix, iy].Side != defKing.Side)
                    {
                        possibleMatPiece = tempBoard.State[ix, iy];
                    }

                    ix++;
                    iy++;
                }
            }

            // Try to kill defendant King.


            return(false);
        }