Exemplo n.º 1
0
        public override bool move(ref Tile startingTile, ref Tile destinationTile, ChessBoard chess)
        {
            if (destinationTile.PieceInside != null)
            {
                if (destinationTile.PieceInside.IsWhite == IsWhite)
                {
                    return(false);
                }
            }
            King blackKing = (King)chess.Pieces[20];
            King whiteKing = (King)chess.Pieces[21];

            if (((Math.Abs(Position.RowInBoard - destinationTile.RowInBoard) == 2 && Math.Abs(Position.ColumnInBoard - destinationTile.ColumnInBoard) == 1) || (Math.Abs(Position.RowInBoard - destinationTile.RowInBoard) == 1 && Math.Abs(Position.ColumnInBoard - destinationTile.ColumnInBoard) == 2)) && allowMove(ref chess, ref destinationTile))
            {
                if (IsWhite)
                {
                    if (!whiteKing.canMoveBeforeKing(ref chess, ref destinationTile, this))
                    {
                        return(false);
                    }
                }
                else
                {
                    if (!blackKing.canMoveBeforeKing(ref chess, ref destinationTile, this))
                    {
                        return(false);
                    }
                }
                changeTileForPiece(ref startingTile, ref destinationTile, ref chess);
                return(true);
            }
            return(false);
        }
Exemplo n.º 2
0
        public override bool move(ref Tile startingTile, ref Tile destinationTile, ChessBoard chess)
        {
            if (destinationTile.PieceInside != null)
            {
                if (destinationTile.PieceInside.IsWhite == IsWhite)
                {
                    return(false);
                }
            }
            King whiteKing = (King)chess.Pieces[21];
            King blackKing = (King)chess.Pieces[20];
            bool isClear   = true;

            if (destinationTile.RowInBoard > Position.RowInBoard && destinationTile.ColumnInBoard > Position.ColumnInBoard && Math.Abs(Position.RowInBoard - destinationTile.RowInBoard) == Math.Abs(Position.ColumnInBoard - destinationTile.ColumnInBoard))
            {
                for (int i = 1; i < Math.Abs(Position.ColumnInBoard - destinationTile.ColumnInBoard); i++)
                {
                    if (chess.Tiles[Position.RowInBoard + i, Position.ColumnInBoard + i].PieceInside != null)
                    {
                        isClear = false;
                        break;
                    }
                }
                if (IsWhite)
                {
                    if (isClear && allowMove(ref chess, ref destinationTile) && whiteKing.canMoveBeforeKing(ref chess, ref destinationTile, this) && IsWhite)
                    {
                        changeTileForPiece(ref startingTile, ref destinationTile, ref chess);
                        return(true);
                    }
                }
                else
                {
                    if (isClear && allowMove(ref chess, ref destinationTile) && blackKing.canMoveBeforeKing(ref chess, ref destinationTile, this) && !IsWhite)
                    {
                        changeTileForPiece(ref startingTile, ref destinationTile, ref chess);
                        return(true);
                    }
                }
                isClear = true;
            }
            if (destinationTile.RowInBoard > Position.RowInBoard && destinationTile.ColumnInBoard < Position.ColumnInBoard && Math.Abs(Position.RowInBoard - destinationTile.RowInBoard) == Math.Abs(Position.ColumnInBoard - destinationTile.ColumnInBoard))
            {
                for (int i = 1; i < Math.Abs(Position.ColumnInBoard - destinationTile.ColumnInBoard); i++)
                {
                    if (chess.Tiles[Position.RowInBoard + i, Position.ColumnInBoard - i].PieceInside != null)
                    {
                        isClear = false;
                        break;
                    }
                }
                if (IsWhite)
                {
                    if (isClear && allowMove(ref chess, ref destinationTile) && whiteKing.canMoveBeforeKing(ref chess, ref destinationTile, this) && IsWhite)
                    {
                        changeTileForPiece(ref startingTile, ref destinationTile, ref chess);
                        return(true);
                    }
                }
                else
                {
                    if (isClear && allowMove(ref chess, ref destinationTile) && blackKing.canMoveBeforeKing(ref chess, ref destinationTile, this) && !IsWhite)
                    {
                        changeTileForPiece(ref startingTile, ref destinationTile, ref chess);
                        return(true);
                    }
                }
                isClear = true;
            }
            if (destinationTile.RowInBoard < Position.RowInBoard && destinationTile.ColumnInBoard < Position.ColumnInBoard && Math.Abs(Position.RowInBoard - destinationTile.RowInBoard) == Math.Abs(Position.ColumnInBoard - destinationTile.ColumnInBoard))
            {
                for (int i = 1; i < Math.Abs(Position.ColumnInBoard - destinationTile.ColumnInBoard); i++)
                {
                    if (chess.Tiles[Position.RowInBoard - i, Position.ColumnInBoard - i].PieceInside != null)
                    {
                        isClear = false;
                        break;
                    }
                }
                if (IsWhite)
                {
                    if (isClear && allowMove(ref chess, ref destinationTile) && whiteKing.canMoveBeforeKing(ref chess, ref destinationTile, this) && IsWhite)
                    {
                        changeTileForPiece(ref startingTile, ref destinationTile, ref chess);
                        return(true);
                    }
                }
                else
                {
                    if (isClear && allowMove(ref chess, ref destinationTile) && blackKing.canMoveBeforeKing(ref chess, ref destinationTile, this) && !IsWhite)
                    {
                        changeTileForPiece(ref startingTile, ref destinationTile, ref chess);
                        return(true);
                    }
                }
                isClear = true;
            }
            if (destinationTile.RowInBoard < Position.RowInBoard && destinationTile.ColumnInBoard > Position.ColumnInBoard && Math.Abs(Position.RowInBoard - destinationTile.RowInBoard) == Math.Abs(Position.ColumnInBoard - destinationTile.ColumnInBoard))
            {
                for (int i = 1; i < Math.Abs(Position.ColumnInBoard - destinationTile.ColumnInBoard); i++)
                {
                    if (chess.Tiles[Position.RowInBoard - i, Position.ColumnInBoard + i].PieceInside != null)
                    {
                        isClear = false;
                        break;
                    }
                }
                if (IsWhite)
                {
                    if (isClear && allowMove(ref chess, ref destinationTile) && whiteKing.canMoveBeforeKing(ref chess, ref destinationTile, this) && IsWhite)
                    {
                        changeTileForPiece(ref startingTile, ref destinationTile, ref chess);
                        return(true);
                    }
                }
                else
                {
                    if (isClear && allowMove(ref chess, ref destinationTile) && blackKing.canMoveBeforeKing(ref chess, ref destinationTile, this) && !IsWhite)
                    {
                        changeTileForPiece(ref startingTile, ref destinationTile, ref chess);
                        return(true);
                    }
                }
                isClear = true;
            }
            return(false);
        }
Exemplo n.º 3
0
        // part of pawn move function
        private bool pawnMovements(ref Tile startingTile, ref Tile destinationTile, ref ChessBoard chess, bool white)
        {
            int  mult;
            King blackKing = (King)chess.Pieces[20];
            King whiteKing = (King)chess.Pieces[21];

            if (white)
            {
                mult = 1;
            }
            else
            {
                mult = -1;
            }
            if (!HasMoved && (Position.RowInBoard - destinationTile.RowInBoard == 2 * mult) && destinationTile.ColumnInBoard == Position.ColumnInBoard && allowMove(ref chess, ref destinationTile))
            {
                if (white)
                {
                    if (!whiteKing.canMoveBeforeKing(ref chess, ref destinationTile, this))
                    {
                        return(false);
                    }
                }
                else
                {
                    if (!blackKing.canMoveBeforeKing(ref chess, ref destinationTile, this))
                    {
                        return(false);
                    }
                }
                if (destinationTile.PieceInside != null)
                {
                    return(false);
                }
                changeTileForPiece(ref startingTile, ref destinationTile, ref chess);
                HasMoved          = true;
                JustMovedTwoSteps = true;
                return(true);
            }
            if ((Position.RowInBoard - destinationTile.RowInBoard == 1 * mult) && destinationTile.ColumnInBoard == Position.ColumnInBoard && allowMove(ref chess, ref destinationTile))
            {
                if (white)
                {
                    if (!whiteKing.canMoveBeforeKing(ref chess, ref destinationTile, this))
                    {
                        return(false);
                    }
                }
                else
                {
                    if (!blackKing.canMoveBeforeKing(ref chess, ref destinationTile, this))
                    {
                        return(false);
                    }
                }
                if (destinationTile.PieceInside != null)
                {
                    return(false);
                }
                changeTileForPiece(ref startingTile, ref destinationTile, ref chess);
                JustMovedTwoSteps = false;
                return(true);
            }
            else if ((Position.RowInBoard - destinationTile.RowInBoard == 1 * mult) && Position.ColumnInBoard - destinationTile.ColumnInBoard == 1 && destinationTile.PieceInside != null && allowMove(ref chess, ref destinationTile))
            {
                if (white)
                {
                    if (!whiteKing.canMoveBeforeKing(ref chess, ref destinationTile, this))
                    {
                        return(false);
                    }
                }
                else
                {
                    if (!blackKing.canMoveBeforeKing(ref chess, ref destinationTile, this))
                    {
                        return(false);
                    }
                }
                if (destinationTile.PieceInside.IsWhite != white)
                {
                    changeTileForPiece(ref startingTile, ref destinationTile, ref chess);
                    JustMovedTwoSteps = false;
                    return(true);
                }
            }
            else if ((Position.RowInBoard - destinationTile.RowInBoard == 1 * mult) && Position.ColumnInBoard - destinationTile.ColumnInBoard == -1 && destinationTile.PieceInside != null && allowMove(ref chess, ref destinationTile))
            {
                if (white)
                {
                    if (!whiteKing.canMoveBeforeKing(ref chess, ref destinationTile, this))
                    {
                        return(false);
                    }
                }
                else
                {
                    if (!blackKing.canMoveBeforeKing(ref chess, ref destinationTile, this))
                    {
                        return(false);
                    }
                }
                if (destinationTile.PieceInside.IsWhite != white)
                {
                    changeTileForPiece(ref startingTile, ref destinationTile, ref chess);
                    JustMovedTwoSteps = false;
                    return(true);
                }
            }
            return(false);
        }