diff --git a/lib/chess/board.ex b/lib/chess/board.ex index 1107e16..553d2de 100644 --- a/lib/chess/board.ex +++ b/lib/chess/board.ex @@ -9,6 +9,10 @@ defmodule Chess.Board do end) end + def piece(board, {file, rank}) do + board["#{file},#{rank}"] + end + def move_piece(board, move_params) do [from_file, from_rank] = move_params["from"] [to_file, to_rank] = move_params["to"] diff --git a/lib/chess/moves.ex b/lib/chess/moves.ex index 0441835..56e2ac2 100644 --- a/lib/chess/moves.ex +++ b/lib/chess/moves.ex @@ -1,6 +1,8 @@ defmodule Chess.Moves do @moduledoc false + alias Chess.Board + alias Chess.Moves.Pieces.Pawn alias Chess.Moves.Pieces.Bishop alias Chess.Moves.Pieces.Knight @@ -9,7 +11,9 @@ defmodule Chess.Moves do alias Chess.Moves.Pieces.King def available(board, {file, rank}) do - piece = board["#{file},#{rank}"] + piece = + board + |> Board.piece({file, rank}) case piece do %{"type" => "pawn"} -> diff --git a/lib/chess/moves/generator.ex b/lib/chess/moves/generator.ex index b2b61ce..851d9cf 100644 --- a/lib/chess/moves/generator.ex +++ b/lib/chess/moves/generator.ex @@ -6,10 +6,13 @@ defmodule Chess.Moves.Generator do like this. """ + alias Chess.Board + # `movement` is either a vector (bishop, rook, queen) # or a pattern (king, knight) def moves(board, {file, rank}, movement) do - board["#{file},#{rank}"] + board + |> Board.piece({file, rank}) |> Map.get("colour") |> _moves(board, {file, rank}, movement) end @@ -52,12 +55,17 @@ defmodule Chess.Moves.Generator do end defp can_capture_piece?(colour, board, {file, rank}) do - piece = board["#{file},#{rank}"] + piece = + board + |> Board.piece({file, rank}) + piece && piece["colour"] != colour end defp obstruction?(colour, board, {file, rank}) do - piece = board["#{file},#{rank}"] + piece = + board + |> Board.piece({file, rank}) piece && piece["colour"] == colour end end diff --git a/lib/chess/moves/piece.ex b/lib/chess/moves/piece.ex index 18c8fca..635b1e1 100644 --- a/lib/chess/moves/piece.ex +++ b/lib/chess/moves/piece.ex @@ -1,9 +1,13 @@ defmodule Chess.Moves.Piece do @moduledoc false + alias Chess.Board alias Chess.Moves.Generator alias Chess.Moves.Pieces.Knight + def find(board, piece) do + end + def attacked?(board, {file, rank}) do attacked_by_rook_or_queen?(board, {file, rank}) || attacked_by_bishop_or_queen?(board, {file, rank}) || @@ -48,7 +52,9 @@ defmodule Chess.Moves.Piece do end defp match_piece(board, {file, rank}, piece_type) do - piece = board["#{file},#{rank}"] + piece = + board + |> Board.piece({file, rank}) piece["type"] == piece_type end diff --git a/lib/chess/moves/pieces/pawn.ex b/lib/chess/moves/pieces/pawn.ex index b2f7c47..b2c1527 100644 --- a/lib/chess/moves/pieces/pawn.ex +++ b/lib/chess/moves/pieces/pawn.ex @@ -1,20 +1,24 @@ defmodule Chess.Moves.Pieces.Pawn do @moduledoc false + alias Chess.Board + def moves(board, {file, rank}) do normal_moves(board, {file, rank}) ++ capture_moves(board, {file, rank}) end defp normal_moves(board, {file, rank}) do - board["#{file},#{rank}"] + board + |> Board.piece({file, rank}) |> Map.get("colour") |> _moves(board, {file, rank}) end defp capture_moves(board, {file, rank}) do colour = - board["#{file},#{rank}"] + board + |> Board.piece({file, rank}) |> Map.get("colour") colour @@ -62,7 +66,10 @@ defmodule Chess.Moves.Pieces.Pawn do end defp can_capture_piece?(colour, board, {file, rank}) do - piece = board["#{file},#{rank}"] + piece = + board + |> Board.piece({file, rank}) + piece && piece["colour"] != colour end