Example #1
0
        public override List <FigMove> GetPossibleMoves(Desk desk)
        {
            var list = new List <FigMove>();

            TryToAddMove(desk, list, -1, 1);
            TryToAddMove(desk, list, 0, 1);
            TryToAddMove(desk, list, 1, 1);
            TryToAddMove(desk, list, 1, 0);
            TryToAddMove(desk, list, 1, -1);
            TryToAddMove(desk, list, 0, -1);
            TryToAddMove(desk, list, -1, -1);
            TryToAddMove(desk, list, -1, 0);

            if (!IsMoved)
            {
                Position.FromTextToInt(FigPosition.GetPos(), out var x, out var y);
                if (x != 4)
                {
                    return(list);
                }
                if (IsAtacked(desk))
                {
                    return(list);
                }

                if (desk.FieldOfFigures[7, y] is Rook rrook && !rrook.IsMoved)
                {
                    if (desk.FieldOfFigures[x + 2, y] == null && !IsMoveOpensKing(desk, 2, 0))
                    {
                        if (desk.FieldOfFigures[x + 1, y] == null && !IsMoveOpensKing(desk, 1, 0))
                        {
                            list.Add(new FigMove(this, new Position(x + 2, y), false, CastlingTypes.ToRight));
                        }
                    }
                }

                if (desk.FieldOfFigures[0, y] is Rook lrook && !lrook.IsMoved)
                {
                    if (desk.FieldOfFigures[x - 1, y] == null && !IsMoveOpensKing(desk, -1, 0))
                    {
                        if (desk.FieldOfFigures[x - 2, y] == null && !IsMoveOpensKing(desk, -2, 0))
                        {
                            if (desk.FieldOfFigures[x - 3, y] == null && !IsMoveOpensKing(desk, -3, 0))
                            {
                                list.Add(new FigMove(this, new Position(x - 3, y), false, CastlingTypes.ToLeft));
                            }
                        }
                    }
                }
            }


            return(list);
        }
Example #2
0
        public new bool IsAtacked(Desk desk)
        {
            Position.FromTextToInt(FigPosition.GetPos(), out var x, out var y);
            bool isUp = false, isDown = false, isRight = false, isLeft = false,
                 isUpRight = false, isUpLeft = false, isDownRight = false, isDownLeft = false;

            // sometimes works
            for (var i = 1; i < 8; i++)
            {
                if (!isUp && y + i < 8 && desk.FieldOfFigures[x, y + i] != null)
                {
                    isUp = true;
                    var fig = desk.FieldOfFigures[x, y + i];
                    if (fig.FigureSide != FigureSide &&
                        (fig.FigureType == FigureType.Rook || fig.FigureType == FigureType.Queen))
                    {
                        return(true);
                    }
                }
                if (!isDown && y - i > -1 && desk.FieldOfFigures[x, y - i] != null)
                {
                    isDown = true;
                    var fig = desk.FieldOfFigures[x, y - i];
                    if (fig.FigureSide != FigureSide &&
                        (fig.FigureType == FigureType.Rook || fig.FigureType == FigureType.Queen))
                    {
                        return(true);
                    }
                }
                if (!isRight && x + i < 8 && desk.FieldOfFigures[x + i, y] != null)
                {
                    isRight = true;
                    var fig = desk.FieldOfFigures[x + i, y];
                    if (fig.FigureSide != FigureSide &&
                        (fig.FigureType == FigureType.Rook || fig.FigureType == FigureType.Queen))
                    {
                        return(true);
                    }
                }
                if (!isLeft && x - i > -1 && desk.FieldOfFigures[x - i, y] != null)
                {
                    isLeft = true;
                    var fig = desk.FieldOfFigures[x - i, y];
                    if (fig.FigureSide != FigureSide &&
                        (fig.FigureType == FigureType.Rook || fig.FigureType == FigureType.Queen))
                    {
                        return(true);
                    }
                }

                if (x + i < 8)
                {
                    if (y + i < 8 && !isUpRight)
                    {
                        var fig = desk.FieldOfFigures[x + i, y + i];
                        if (fig != null)
                        {
                            isUpRight = true;
                            if (i == 1 && fig.FigureSide != FigureSide &&
                                fig.FigureType == FigureType.Pawn)
                            {
                                return(true);
                            }
                            if (fig.FigureSide != FigureSide &&
                                (fig.FigureType == FigureType.Bishop || fig.FigureType == FigureType.Queen))
                            {
                                return(true);
                            }
                        }
                    }

                    if (y - i > -1 && !isDownRight)
                    {
                        var fig = desk.FieldOfFigures[x + i, y - i];
                        if (fig != null)
                        {
                            isDownRight = true;
                            if (fig.FigureSide != FigureSide &&
                                (fig.FigureType == FigureType.Bishop || fig.FigureType == FigureType.Queen))
                            {
                                return(true);
                            }
                        }
                    }
                }

                if (x - i > -1)
                {
                    if (y + i < 8 && !isUpLeft)
                    {
                        var fig = desk.FieldOfFigures[x - i, y + i];
                        if (fig != null)
                        {
                            isUpLeft = true;
                            if (i == 1 && fig.FigureSide != FigureSide && fig.FigureType == FigureType.Pawn)
                            {
                                return(true);
                            }
                            if (fig.FigureSide != FigureSide &&
                                (fig.FigureType == FigureType.Bishop || fig.FigureType == FigureType.Queen))
                            {
                                return(true);
                            }
                        }
                    }

                    if (y - i > -1 && !isDownLeft)
                    {
                        var fig = desk.FieldOfFigures[x - i, y - i];
                        if (fig != null)
                        {
                            isDownLeft = true;
                            if (fig.FigureSide != FigureSide &&
                                (fig.FigureType == FigureType.Bishop || fig.FigureType == FigureType.Queen))
                            {
                                return(true);
                            }
                        }
                    }
                }
            }



            // Now check for horses and pawns
            if (x < 8 - 1 && y < 8 - 2)
            {
                var fig = desk.FieldOfFigures[x + 1, y + 2];
                if (fig != null && fig.FigureSide != FigureSide && fig.FigureType == FigureType.Horse)
                {
                    return(true);
                }
            }
            if (x < 8 - 2 && y < 8 - 1)
            {
                var fig = desk.FieldOfFigures[x + 2, y + 1];
                if (fig != null && fig.FigureSide != FigureSide && fig.FigureType == FigureType.Horse)
                {
                    return(true);
                }
            }
            if (x > 0 && y > 1)
            {
                var fig = desk.FieldOfFigures[x - 1, y - 2];
                if (fig != null && fig.FigureSide != FigureSide && fig.FigureType == FigureType.Horse)
                {
                    return(true);
                }
            }
            if (x > 1 && y > 0)
            {
                var fig = desk.FieldOfFigures[x - 2, y - 1];
                if (fig != null && fig.FigureSide != FigureSide && fig.FigureType == FigureType.Horse)
                {
                    return(true);
                }
            }
            if (x > 0 && y < 8 - 2)
            {
                var fig = desk.FieldOfFigures[x - 1, y + 2];
                if (fig != null && fig.FigureSide != FigureSide && fig.FigureType == FigureType.Horse)
                {
                    return(true);
                }
            }
            if (x > 1 && y < 8 - 1)
            {
                var fig = desk.FieldOfFigures[x - 2, y + 1];
                if (fig != null && fig.FigureSide != FigureSide && fig.FigureType == FigureType.Horse)
                {
                    return(true);
                }
            }
            if (x < 8 - 1 && y > 1)
            {
                var fig = desk.FieldOfFigures[x + 1, y - 2];
                if (fig != null && fig.FigureSide != FigureSide && fig.FigureType == FigureType.Horse)
                {
                    return(true);
                }
            }
            if (x < 8 - 2 && y > 0)
            {
                var fig = desk.FieldOfFigures[x + 2, y - 1];
                if (fig != null && fig.FigureSide != FigureSide && fig.FigureType == FigureType.Horse)
                {
                    return(true);
                }
            }


            return(false);
        }