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); }
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); }