mirror of
https://github.com/danbee/chess
synced 2025-03-04 08:39:06 +00:00
Knights are obstructed
This commit is contained in:
parent
5745b916c4
commit
7e1665781a
@ -1,6 +1,7 @@
|
|||||||
defmodule Chess.Moves.Generator do
|
defmodule Chess.Moves.Generator do
|
||||||
@moduledoc false
|
@moduledoc false
|
||||||
|
|
||||||
|
# Move generation for pieces that move in straight lines
|
||||||
def moves(_colour, _board, {0, _rank}, {-1, _}), do: []
|
def moves(_colour, _board, {0, _rank}, {-1, _}), do: []
|
||||||
def moves(_colour, _board, {_file, 0}, {_, -1}), do: []
|
def moves(_colour, _board, {_file, 0}, {_, -1}), do: []
|
||||||
def moves(_colour, _board, {7, _rank}, {1, _}), do: []
|
def moves(_colour, _board, {7, _rank}, {1, _}), do: []
|
||||||
@ -10,21 +11,40 @@ defmodule Chess.Moves.Generator do
|
|||||||
cond do
|
cond do
|
||||||
can_take_piece?(colour, board, next_square) ->
|
can_take_piece?(colour, board, next_square) ->
|
||||||
[next_square]
|
[next_square]
|
||||||
obstruction?(board, next_square) ->
|
obstruction?(colour, board, next_square) ->
|
||||||
[]
|
[]
|
||||||
true ->
|
true ->
|
||||||
[next_square | moves(colour, board, next_square, {fv, rv})]
|
[next_square | moves(colour, board, next_square, {fv, rv})]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Move generation for pieces that follow a pattern
|
||||||
|
def moves(_colour, _board, {_file, _rank}, []), do: []
|
||||||
|
def moves(colour, board, {file, rank}, [{fv, rv} | moves]) do
|
||||||
|
move_square = {file + fv, rank + rv}
|
||||||
|
cond do
|
||||||
|
outside_board?(move_square) ||
|
||||||
|
obstruction?(colour, board, move_square) ->
|
||||||
|
moves(colour, board, {file, rank}, moves)
|
||||||
|
can_take_piece?(colour, board, move_square) ->
|
||||||
|
[move_square | moves(colour, board, {file, rank}, moves)]
|
||||||
|
true ->
|
||||||
|
[move_square | moves(colour, board, {file, rank}, moves)]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
defp outside_board?({file, rank}) do
|
||||||
|
file < 0 || file > 7 ||
|
||||||
|
rank < 0 || rank > 7
|
||||||
|
end
|
||||||
|
|
||||||
defp can_take_piece?(colour, board, {file, rank}) do
|
defp can_take_piece?(colour, board, {file, rank}) do
|
||||||
piece = board["#{file},#{rank}"]
|
piece = board["#{file},#{rank}"]
|
||||||
|
|
||||||
piece && piece["colour"] != colour
|
piece && piece["colour"] != colour
|
||||||
end
|
end
|
||||||
|
|
||||||
defp obstruction?(board, {file, rank}) do
|
defp obstruction?(colour, board, {file, rank}) do
|
||||||
board
|
piece = board["#{file},#{rank}"]
|
||||||
|> Map.has_key?("#{file},#{rank}")
|
piece && piece["colour"] == colour
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@ -1,12 +1,12 @@
|
|||||||
defmodule Chess.Moves.Knight do
|
defmodule Chess.Moves.Knight do
|
||||||
@moduledoc false
|
@moduledoc false
|
||||||
|
|
||||||
def moves(_board, {file, rank}) do
|
alias Chess.Moves.Generator
|
||||||
patterns()
|
|
||||||
|> Enum.map(fn ({fv, rv}) -> {file + fv, rank + rv} end)
|
def moves(board, {file, rank}) do
|
||||||
|> Enum.reject(fn ({file, rank}) ->
|
board["#{file},#{rank}"]
|
||||||
file < 0 || rank < 0 || file > 7 || rank > 7
|
|> Map.get("colour")
|
||||||
end)
|
|> Generator.moves(board, {file, rank}, patterns())
|
||||||
end
|
end
|
||||||
|
|
||||||
defp patterns do
|
defp patterns do
|
||||||
|
|||||||
@ -23,6 +23,19 @@ defmodule Chess.Moves.KnightTest do
|
|||||||
assert Enum.sort(moves) == expected_moves
|
assert Enum.sort(moves) == expected_moves
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "knights are blocked by other pieces of the same colour" do
|
||||||
|
board = %{
|
||||||
|
"0,0" => %{"type" => "knight", "colour" => "white"},
|
||||||
|
"1,2" => %{"type" => "king", "colour" => "white"},
|
||||||
|
}
|
||||||
|
moves = Moves.available(board, {0, 0})
|
||||||
|
|
||||||
|
expected_moves = Enum.sort([
|
||||||
|
{2, 1},
|
||||||
|
])
|
||||||
|
assert Enum.sort(moves) == expected_moves
|
||||||
|
end
|
||||||
|
|
||||||
def board do
|
def board do
|
||||||
Chess.Board.default
|
Chess.Board.default
|
||||||
end
|
end
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user