public IEnumerable<Move> GetPossibleMoves(Board board) { var result = new List<Move>(); short x = -1; short y = -1; for (x = -1; x <= 1; x++) { for (y = -1; y <= 1; y++) { if (!(x == 0 && y == 0)) { TryMoveToSquare(board, result, new Move(this.Location, new Coordinate(Location.X + x, Location.Y + y)), MoveType.CanAttack); } } } if (!HasMoved) { // Can't move to escape check if (!IsUnderAttack(board)) { var oneRight = new Coordinate(Location.X + 1, Location.Y); var twoRight = new Coordinate(Location.X + 2, Location.Y); var rook = board.GetPiece((short)(Location.X + 3), Location.Y); if(board.GetPiece(oneRight.X, oneRight.Y) == null && board.GetPiece(twoRight.X, twoRight.Y) == null && rook != null && rook.PieceType == PieceType.Rook && rook.HasMoved == false) { if(!board.CheckMoveForCheck(new Move(Location, oneRight)) && !board.CheckMoveForCheck(new Move(Location, twoRight))) { result.Add(new Move(Location, twoRight, rook.Location, oneRight)); } } var oneLeft = new Coordinate(Location.X - 1, Location.Y); var twoLeft = new Coordinate(Location.X - 2, Location.Y); var threeLeft = new Coordinate(Location.X - 3, Location.Y); rook = board.GetPiece((short)(Location.X - 4), Location.X); if (board.GetPiece(oneLeft.X, oneLeft.Y) == null && board.GetPiece(twoLeft.X, twoLeft.Y) == null && board.GetPiece(threeLeft.X, threeLeft.Y) == null && rook != null && rook.PieceType == PieceType.Rook && rook.HasMoved == false) { if (!board.CheckMoveForCheck(new Move(Location, oneLeft)) && !board.CheckMoveForCheck(new Move(Location, twoLeft)) && !board.CheckMoveForCheck(new Move(Location, threeLeft))) { result.Add(new Move(Location, twoLeft, rook.Location, oneLeft)); } } } } return result; }
protected MoveResult TryMoveToSquare(Board board, List<Move> possibleMoves, Move move, MoveType moveType) { if (move.To.IsValid) { var targetPiece = board.GetPiece(move.To.X, move.To.Y); if (moveType != MoveType.MustAttack && targetPiece == null) { if(!board.CheckMoveForCheck(move)) { possibleMoves.Add(move); } return new MoveResult() { Type = MoveResultType.Move }; } else if(moveType != MoveType.CannotAttack && targetPiece != null && targetPiece.Player != Player) { if(!board.CheckMoveForCheck(move)) { possibleMoves.Add(move); } return new MoveResult() { Type = MoveResultType.Attack, CapturedPiece = targetPiece }; } } return new MoveResult() { Type = MoveResultType.Invalid }; }