Skip to content

Commit

Permalink
Default moves
Browse files Browse the repository at this point in the history
changes the behaviour for default movement from "always go up" to repeat your
last move.
  • Loading branch information
Dylan Kendal committed Mar 4, 2017
1 parent 6563758 commit f915c73
Show file tree
Hide file tree
Showing 3 changed files with 66 additions and 5 deletions.
45 changes: 41 additions & 4 deletions lib/battle_snake/move.ex
Original file line number Diff line number Diff line change
Expand Up @@ -15,21 +15,43 @@ defmodule BattleSnake.Move do
snake_id: reference
}

@up %Point{x: 0, y: -1}
@spec up() :: Point.t
def up, do: %Point{x: 0, y: -1}
def up, do: @up

@down %Point{x: 0, y: 1}
@spec down() :: Point.t
def down, do: %Point{x: 0, y: 1}
def down, do: @down

@right %Point{x: 1, y: 0}
@spec right() :: Point.t
def right, do: %Point{x: 1, y: 0}
def right, do: @right

@left %Point{x: -1, y: 0}
@spec left() :: Point.t
def left, do: %Point{x: -1, y: 0}
def left, do: @left

@spec default_move() :: Point.t
def default_move(), do: %Move{move: "up"}

def default_move(snake) do
do_default_move(snake.coords)
end

defp do_default_move([v1, v2 | _]),
do: Point.sub(v1, v2)
|> from_point
|> do_default_move

defp do_default_move({:ok, move}),
do: move

defp do_default_move(:error),
do: default_move()

defp do_default_move(_),
do: do_default_move(:error)

@spec moves() :: [Point.t]
def moves do
[
Expand All @@ -53,4 +75,19 @@ defmodule BattleSnake.Move do
"right" -> right()
end
end

def from_point(point) do
case point do
@up ->
{:ok, %Move{move: "up"}}
@down ->
{:ok, %Move{move: "down"}}
@left ->
{:ok, %Move{move: "left"}}
@right ->
{:ok, %Move{move: "right"}}
_ ->
:error
end
end
end
2 changes: 1 addition & 1 deletion lib/battle_snake/movement.ex
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ defmodule BattleSnake.Movement do
#{inspect e, pretty: true}
"""

move = Move.default_move()
move = Move.default_move(snake)

{move, snake}
end
Expand Down
24 changes: 24 additions & 0 deletions test/battle_snake/move_test.exs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
defmodule BattleSnake.MoveTest do
use BattleSnake.Case, async: true
use BattleSnake.Point

alias BattleSnake.{
Move,
Expand All @@ -12,4 +13,27 @@ defmodule BattleSnake.MoveTest do
%Move{move: "up"} |> Move.to_point
end
end

describe "Move.default_move(snake) when the last move is undefined" do
test "goes up" do
s1 = build(:snake, coords: [p(0, 0), p(0, 0)])
s2 = build(:snake, coords: [p(0, 0), p(10, 10)])
s3 = build(:snake, coords: [])

for snake <- [s1, s2, s3] do
move = Move.default_move(snake)
assert move == %Move{move: "up"}
end
end
end

describe "Move.default_move(snake)" do
test "repeats the previous move" do
snake = build(:snake, coords: [p(5, 5), p(6, 5), p(7, 5)])
move = Move.default_move(snake)
assert move == %Move{move: "left"}
new_snake = BattleSnake.Snake.move(snake, move)
assert new_snake.coords == [p(4, 5), p(5, 5), p(6, 5)]
end
end
end

0 comments on commit f915c73

Please sign in to comment.