diff --git a/lib/chess/moves/generator.ex b/lib/chess/moves/generator.ex new file mode 100644 index 0000000..da7dff9 --- /dev/null +++ b/lib/chess/moves/generator.ex @@ -0,0 +1,30 @@ +defmodule Chess.Moves.Generator do + @moduledoc false + + def moves(_colour, _board, {0, _rank}, {-1, _}), do: [] + def moves(_colour, _board, {_file, 0}, {_, -1}), do: [] + def moves(_colour, _board, {7, _rank}, {1, _}), do: [] + def moves(_colour, _board, {_file, 7}, {_, 1}), do: [] + def moves(colour, board, {file, rank}, {fv, rv}) do + next_square = {file + fv, rank + rv} + cond do + can_take_piece?(colour, board, next_square) -> + [next_square] + obstruction?(board, next_square) -> + [] + true -> + [next_square | moves(colour, board, next_square, {fv, rv})] + end + end + + defp can_take_piece?(colour, board, {file, rank}) do + piece = board["#{file},#{rank}"] + + piece && piece["colour"] != colour + end + + defp obstruction?(board, {file, rank}) do + board + |> Map.has_key?("#{file},#{rank}") + end +end diff --git a/lib/chess/moves/rook.ex b/lib/chess/moves/rook.ex index 58e764e..3029867 100644 --- a/lib/chess/moves/rook.ex +++ b/lib/chess/moves/rook.ex @@ -1,6 +1,8 @@ defmodule Chess.Moves.Rook do @moduledoc false + alias Chess.Moves.Generator + def moves(board, {file, rank}) do moves_north(board, {file, rank}) ++ moves_south(board, {file, rank}) ++ @@ -11,51 +13,24 @@ defmodule Chess.Moves.Rook do defp moves_north(board, {file, rank}) do board["#{file},#{rank}"] |> Map.get("colour") - |> _moves(board, {file, rank}, {0, +1}) + |> Generator.moves(board, {file, rank}, {0, +1}) end defp moves_south(board, {file, rank}) do board["#{file},#{rank}"] |> Map.get("colour") - |> _moves(board, {file, rank}, {0, -1}) + |> Generator.moves(board, {file, rank}, {0, -1}) end defp moves_east(board, {file, rank}) do board["#{file},#{rank}"] |> Map.get("colour") - |> _moves(board, {file, rank}, {+1, 0}) + |> Generator.moves(board, {file, rank}, {+1, 0}) end defp moves_west(board, {file, rank}) do board["#{file},#{rank}"] |> Map.get("colour") - |> _moves(board, {file, rank}, {-1, 0}) - end - - defp _moves(_colour, _board, {0, _rank}, {-1, _}), do: [] - defp _moves(_colour, _board, {_file, 0}, {_, -1}), do: [] - defp _moves(_colour, _board, {7, _rank}, {1, _}), do: [] - defp _moves(_colour, _board, {_file, 7}, {_, 1}), do: [] - defp _moves(colour, board, {file, rank}, {fv, rv}) do - next_square = {file + fv, rank + rv} - cond do - can_take_piece?(colour, board, next_square) -> - [next_square] - obstruction?(board, next_square) -> - [] - true -> - [next_square | _moves(colour, board, next_square, {fv, rv})] - end - end - - defp can_take_piece?(colour, board, {file, rank}) do - piece = board["#{file},#{rank}"] - - piece && piece["colour"] != colour - end - - defp obstruction?(board, {file, rank}) do - board - |> Map.has_key?("#{file},#{rank}") + |> Generator.moves(board, {file, rank}, {-1, 0}) end end