mirror of
https://github.com/danbee/chess
synced 2025-03-04 08:39:06 +00:00
Add basic pawn move generation
This commit is contained in:
parent
e23980537b
commit
c64d40f99a
14
lib/chess/moves.ex
Normal file
14
lib/chess/moves.ex
Normal file
@ -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
|
||||
20
lib/chess/moves/pawn.ex
Normal file
20
lib/chess/moves/pawn.ex
Normal file
@ -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
|
||||
39
test/chess/moves/pawn_test.exs
Normal file
39
test/chess/moves/pawn_test.exs
Normal file
@ -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
|
||||
Loading…
Reference in New Issue
Block a user