From 8efe8ea391d76b65a5075f413930636422d88b6d Mon Sep 17 00:00:00 2001 From: Dan Barber Date: Thu, 19 Jan 2017 12:21:46 +0000 Subject: [PATCH] Add tests and logic for basic rook movement --- test/models/moves_test.exs | 22 ++++++++++++++++++++++ web/models/moves.ex | 27 ++++++++++++++++++++++++++- 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/test/models/moves_test.exs b/test/models/moves_test.exs index 33457dc..5c68b6b 100644 --- a/test/models/moves_test.exs +++ b/test/models/moves_test.exs @@ -33,6 +33,28 @@ defmodule Chess.MovesTest do assert moves == expected_moves end + test "rooks can move horizontally or vertically" do + board = %{ "4,5" => %{type: :rook, colour: :white} } + moves = Moves.available(board, {4, 5}) + + expected_moves = Enum.sort([ + {4, 0}, {4, 1}, {4, 2}, {4, 3}, {4, 4}, {4, 6}, {4, 7}, + {0, 5}, {1, 5}, {2, 5}, {3, 5}, {5, 5}, {6, 5}, {7, 5}, + ]) + assert moves == expected_moves + end + + test "rook cannot move further than the edge" do + board = %{ "0,0" => %{type: :rook, colour: :white} } + moves = Moves.available(board, {0, 0}) + + expected_moves = Enum.sort([ + {0, 1}, {0, 2}, {0, 3}, {0, 4}, {0, 5}, {0, 6}, {0, 7}, + {1, 0}, {2, 0}, {3, 0}, {4, 0}, {5, 0}, {6, 0}, {7, 0}, + ]) + assert moves == expected_moves + end + def board do Chess.Board.default end diff --git a/web/models/moves.ex b/web/models/moves.ex index c66fc3f..1732fea 100644 --- a/web/models/moves.ex +++ b/web/models/moves.ex @@ -15,7 +15,32 @@ defmodule Chess.Moves do _ -> [{file, rank - 1}] end %{type: :rook} -> - [] + rook_moves(board, square) end end + + defp rook_moves(board, square) do + {file, rank} = square + moves = [] + + moves = cond do + file > 0 -> moves ++ Enum.map((file - 1)..0, fn (f) -> {f, rank} end) + true -> moves + end + moves = cond do + file < 7 -> moves ++ Enum.map((file + 1)..7, fn (f) -> {f, rank} end) + true -> moves + end + + moves = cond do + rank > 0 -> moves ++ Enum.map((rank - 1)..0, fn (r) -> {file, r} end) + true -> moves + end + moves = cond do + rank < 7 -> moves ++ Enum.map((rank + 1)..7, fn (r) -> {file, r} end) + true -> moves + end + + Enum.sort(moves) + end end