From 2c8f2c7bcdefb81e837bb676c51fbc323be9ec2b Mon Sep 17 00:00:00 2001 From: Dan Barber Date: Tue, 13 Mar 2018 22:20:48 -0400 Subject: [PATCH] Pawn can be blocked --- lib/chess/moves/pawn.ex | 39 +++++++++++++++++++++++----------- test/chess/moves/pawn_test.exs | 39 +++++++++++++++++++++++++++++++--- 2 files changed, 63 insertions(+), 15 deletions(-) diff --git a/lib/chess/moves/pawn.ex b/lib/chess/moves/pawn.ex index 8419a21..67bae47 100644 --- a/lib/chess/moves/pawn.ex +++ b/lib/chess/moves/pawn.ex @@ -2,19 +2,34 @@ defmodule Chess.Moves.Pawn do @moduledoc false def moves(board, {file, rank}) do - piece = board["#{file},#{rank}"] + board["#{file},#{rank}"] + |> _moves(board, {file, rank}) + end - case piece do - %{"colour" => "white"} -> - case rank do - 1 -> [{file, rank + 1}, {file, rank + 2}] - _ -> [{file, rank + 1}] - end - %{"colour" => "black"} -> - case rank do - 6 -> [{file, rank - 1}, {file, rank - 2}] - _ -> [{file, rank - 1}] - end + defp _moves(%{"colour" => "white"}, board, {file, rank}) do + cond do + obstruction?(board, {file, rank + 1}) -> [] + rank == 1 -> [ + {file, rank + 1} | + _moves(%{"colour" => "white"}, board, {file, rank + 1}) + ] + true -> [{file, rank + 1}] end end + + defp _moves(%{"colour" => "black"}, board, {file, rank}) do + cond do + obstruction?(board, {file, rank - 1}) -> [] + rank == 6 -> [ + {file, rank - 1} | + _moves(%{"colour" => "black"}, board, {file, rank - 1}) + ] + true -> [{file, rank - 1}] + end + end + + defp obstruction?(board, {file, rank}) do + board + |> Map.has_key?("#{file},#{rank}") + end end diff --git a/test/chess/moves/pawn_test.exs b/test/chess/moves/pawn_test.exs index f70d03d..9f5ce0e 100644 --- a/test/chess/moves/pawn_test.exs +++ b/test/chess/moves/pawn_test.exs @@ -4,14 +4,14 @@ defmodule Chess.Moves.PawnTest do alias Chess.Moves.Pawn test "white pawn can move forward one or two spaces" do - moves = Pawn.moves(board(), {4, 1}) + moves = Pawn.moves(default_board(), {4, 1}) expected_moves = [{4, 2}, {4, 3}] assert moves == expected_moves end test "black pawn can move forward one or two spaces" do - moves = Pawn.moves(board(), {4, 6}) + moves = Pawn.moves(default_board(), {4, 6}) expected_moves = [{4, 5}, {4, 4}] assert moves == expected_moves @@ -33,7 +33,40 @@ defmodule Chess.Moves.PawnTest do assert moves == expected_moves end - def board do + test "pawn is blocked from moving two squares by another piece" do + board = %{ + "4,1" => %{"type" => "pawn", "colour" => "white"}, + "4,3" => %{"type" => "pawn", "colour" => "black"}, + } + moves = Pawn.moves(board, {4, 1}) + + expected_moves = [{4, 2}] + assert moves == expected_moves + end + + test "pawn is blocked from moving one or two squares by another piece" do + board = %{ + "4,1" => %{"type" => "pawn", "colour" => "white"}, + "4,2" => %{"type" => "pawn", "colour" => "black"}, + } + moves = Pawn.moves(board, {4, 1}) + + expected_moves = [] + assert moves == expected_moves + end + + test "pawn is blocked from moving one square by another piece" do + board = %{ + "4,2" => %{"type" => "pawn", "colour" => "white"}, + "4,3" => %{"type" => "pawn", "colour" => "black"}, + } + moves = Pawn.moves(board, {4, 2}) + + expected_moves = [] + assert moves == expected_moves + end + + def default_board do Chess.Board.default end end