private static void TryAddSquare(List <SquareCoordinate> ret, SquareCoordinate startingSquare, int newRank, int newFile, Board board, Color pieceColor, SquareInfluenceType availabilityType) { if (!IsValidPosition(newRank, newFile)) { return; } var newSquare = new SquareCoordinate(newRank, newFile); switch (availabilityType) { case SquareInfluenceType.Control: ret.Add(newSquare); break; case SquareInfluenceType.Mobility: if (IsInPieceMobility(board, startingSquare, newSquare, pieceColor)) { ret.Add(newSquare); } break; default: throw new NotImplementedException(); } }
private static bool TryAddPieceGetIsLast(List <SquareCoordinate> ret, SquareCoordinate startingSquare, int newRank, int newFile, Board board, Color pieceColor, SquareInfluenceType availabilityType) { if (!IsValidPosition(newRank, newFile)) { return(true); } TryAddSquare(ret, startingSquare, newRank, newFile, board, pieceColor, availabilityType); return(board.IsAnyPieceInSquare(new SquareCoordinate(newRank, newFile))); }
internal static IEnumerable <SquareCoordinate> GetPawnAvailability(SquareCoordinate startingCoordinate, Board board, Color pieceColor, SquareInfluenceType availabilityType) { switch (availabilityType) { case SquareInfluenceType.Control: return(GetPawnControl(startingCoordinate, board, pieceColor)); case SquareInfluenceType.Mobility: return(GetPawnMobility(startingCoordinate, board, pieceColor)); default: throw new NotImplementedException(); } }
internal static IEnumerable <SquareCoordinate> GetKnightAvailability(SquareCoordinate startingCoordinate, Board board, Color pieceColor, SquareInfluenceType availabilityType) { var ret = new List <SquareCoordinate>(); //Upper right, up var rank = startingCoordinate.Rank + 2; var file = startingCoordinate.File + 1; TryAddSquare(ret, startingCoordinate, rank, file, board, pieceColor, availabilityType); //Upper right, right rank = startingCoordinate.Rank + 1; file = startingCoordinate.File + 2; TryAddSquare(ret, startingCoordinate, rank, file, board, pieceColor, availabilityType); //Upper left, up rank = startingCoordinate.Rank + 2; file = startingCoordinate.File - 1; TryAddSquare(ret, startingCoordinate, rank, file, board, pieceColor, availabilityType); //Upper left, right rank = startingCoordinate.Rank + 1; file = startingCoordinate.File - 2; TryAddSquare(ret, startingCoordinate, rank, file, board, pieceColor, availabilityType); //Bottom right, bottom rank = startingCoordinate.Rank - 2; file = startingCoordinate.File + 1; TryAddSquare(ret, startingCoordinate, rank, file, board, pieceColor, availabilityType); //Bottom right, right rank = startingCoordinate.Rank - 1; file = startingCoordinate.File + 2; TryAddSquare(ret, startingCoordinate, rank, file, board, pieceColor, availabilityType); //Bottom left, bottom rank = startingCoordinate.Rank - 2; file = startingCoordinate.File - 1; TryAddSquare(ret, startingCoordinate, rank, file, board, pieceColor, availabilityType); //Bottom left, right rank = startingCoordinate.Rank - 1; file = startingCoordinate.File - 2; TryAddSquare(ret, startingCoordinate, rank, file, board, pieceColor, availabilityType); return(ret); }
internal static IEnumerable <SquareCoordinate> GetKingAvailability(King king, SquareCoordinate startingCoordinate, Board board, SquareInfluenceType availabilityType) { switch (availabilityType) { case SquareInfluenceType.Control: return(GetKingControl(startingCoordinate)); case SquareInfluenceType.Mobility: return(GetKingMobility(king, startingCoordinate, board)); default: throw new NotImplementedException(); } }
internal static IEnumerable <SquareCoordinate> GetLineAvailability(SquareCoordinate startingCoordinate, Board board, Color pieceColor, SquareInfluenceType availabilityType) { var ret = new List <SquareCoordinate>(); //Upper line for (int i = 1; i < 8; i++) { var rank = startingCoordinate.Rank + i; var file = startingCoordinate.File; if (TryAddPieceGetIsLast(ret, startingCoordinate, rank, file, board, pieceColor, availabilityType)) { break; } } //Bottom line for (int i = 1; i < 8; i++) { var rank = startingCoordinate.Rank - i; var file = startingCoordinate.File; if (TryAddPieceGetIsLast(ret, startingCoordinate, rank, file, board, pieceColor, availabilityType)) { break; } } //Right line for (int i = 1; i < 8; i++) { var rank = startingCoordinate.Rank; var file = startingCoordinate.File + i; if (TryAddPieceGetIsLast(ret, startingCoordinate, rank, file, board, pieceColor, availabilityType)) { break; } } //Left line for (int i = 1; i < 8; i++) { var rank = startingCoordinate.Rank; var file = startingCoordinate.File - i; if (TryAddPieceGetIsLast(ret, startingCoordinate, rank, file, board, pieceColor, availabilityType)) { break; } } return(ret); }