У меня есть задание, в котором я должен сделать упрощенную игру в шахматы только с ладьями и королями. В этой игре мне нужно показать возможные ходы для следующего хода для каждой фигуры. Я сделал так, чтобы в нем были перечислены все возможные последующие ходы в зависимости от его способностей (король может передвигаться на 1 шаг вокруг него). Однако я не учел, что мне нужно отфильтровать ходы, которые потенциально могут убить короля. Короля нельзя перемещать в клетку, где ладья противника находится на одной горизонтальной или вертикальной линии. Код в основном работает по этому методу
let getVacantNOccupied (run : Position list) : (Position list * (chessPiece option)) =
try
// Find index of first non-vacant square of a run
let idx = List.findIndex (fun (i, j) -> _board.[i,j].IsSome) run
let (i,j) = run.[idx]
let piece = _board.[i, j] // The first non-vacant neighbour
if idx = 0
then ([], piece)
else (run.[..(idx-1)], piece)
with
_ -> (run, None) // outside the board
и
member this.availableMoves (piece : chessPiece) : (Position list * chessPiece list) =
match piece.position with
None ->
([],[])
| Some p ->
let convertNWrap =
(relativeToAbsolute p) >> getVacantNOccupied
let vacantPieceLists = List.map convertNWrap piece.candiateRelativeMoves
// Extract and merge lists of vacant squares
let vacant = List.collect fst vacantPieceLists
// Extract and merge lists of first obstruction pieces and filter out own pieces
let opponent = List.choose snd vacantPieceLists
(vacant, opponent)
Как я могу убрать квадраты, где ладья может убить короля за возможные квадраты?