1
0
mirror of https://github.com/danbee/chess synced 2025-03-04 08:39:06 +00:00

Knights are obstructed

This commit is contained in:
Daniel Barber 2018-03-14 20:36:20 -04:00
parent 5745b916c4
commit 7e1665781a
Signed by: danbarber
GPG Key ID: 931D8112E0103DD8
3 changed files with 44 additions and 11 deletions

View File

@ -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

View File

@ -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

View File

@ -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