From c64d40f99afd5230212916dc2f9bd32f98f13d9e Mon Sep 17 00:00:00 2001 From: Dan Barber Date: Fri, 9 Mar 2018 16:09:26 -0500 Subject: [PATCH] Add basic pawn move generation --- lib/chess/moves.ex | 14 ++++++++++++ lib/chess/moves/pawn.ex | 20 +++++++++++++++++ test/chess/moves/pawn_test.exs | 39 ++++++++++++++++++++++++++++++++++ 3 files changed, 73 insertions(+) create mode 100644 lib/chess/moves.ex create mode 100644 lib/chess/moves/pawn.ex create mode 100644 test/chess/moves/pawn_test.exs diff --git a/lib/chess/moves.ex b/lib/chess/moves.ex new file mode 100644 index 0000000..60be54a --- /dev/null +++ b/lib/chess/moves.ex @@ -0,0 +1,14 @@ +defmodule Chess.Moves do + @moduledoc false + + alias Chess.Moves.Pawn + + def available(board, {file, rank}) do + piece = board["#{file},#{rank}"] + + case piece do + %{type: :pawn} -> + Pawn.moves(board, {file, rank}) + end + end +end diff --git a/lib/chess/moves/pawn.ex b/lib/chess/moves/pawn.ex new file mode 100644 index 0000000..460d450 --- /dev/null +++ b/lib/chess/moves/pawn.ex @@ -0,0 +1,20 @@ +defmodule Chess.Moves.Pawn do + @moduledoc false + + def moves(board, {file, rank}) do + piece = board["#{file},#{rank}"] + + 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 + end + end +end diff --git a/test/chess/moves/pawn_test.exs b/test/chess/moves/pawn_test.exs new file mode 100644 index 0000000..142ec80 --- /dev/null +++ b/test/chess/moves/pawn_test.exs @@ -0,0 +1,39 @@ +defmodule Chess.Moves.PawnTest do + use Chess.DataCase + + alias Chess.Moves.Pawn + + test "white pawn can move forward one or two spaces" do + moves = Pawn.moves(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}) + + expected_moves = [{4, 5}, {4, 4}] + assert moves == expected_moves + end + + test "white pawn not on starting square can move forward one space" do + board = %{"4,2" => %{type: :pawn, colour: :white}} + moves = Pawn.moves(board, {4, 2}) + + expected_moves = [{4, 3}] + assert moves == expected_moves + end + + test "black pawn not on starting square can move forward one space" do + board = %{"4,5" => %{type: :pawn, colour: :black}} + moves = Pawn.moves(board, {4, 5}) + + expected_moves = [{4, 4}] + assert moves == expected_moves + end + + def board do + Chess.Board.default + end +end