Как убрать возможные «коллизии» для короля в моей шахматной программе? - PullRequest
0 голосов
/ 11 января 2020

У меня есть задание, в котором я должен сделать упрощенную игру в шахматы только с ладьями и королями. В этой игре мне нужно показать возможные ходы для следующего хода для каждой фигуры. Я сделал так, чтобы в нем были перечислены все возможные последующие ходы в зависимости от его способностей (король может передвигаться на 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)

Как я могу убрать квадраты, где ладья может убить короля за возможные квадраты?

...