Add collision detection, finish line and level up
Task: MIL-005#1 Task: MIL-005#2 Task: MIL-005#3 Task: MIL-005#4
This commit is contained in:
@@ -36,6 +36,9 @@ class FakeCar:
|
||||
def xcor(self) -> float:
|
||||
return self.x
|
||||
|
||||
def ycor(self) -> float:
|
||||
return self.y
|
||||
|
||||
def setx(self, x: float) -> None:
|
||||
self.x = x
|
||||
|
||||
@@ -99,6 +102,37 @@ def test_cars_past_the_left_edge_are_removed() -> None:
|
||||
assert manager.all_cars == [] and car.hidden
|
||||
|
||||
|
||||
class FakePlayer:
|
||||
"""Stands in for the player turtle."""
|
||||
|
||||
def __init__(self, x: float, y: float) -> None:
|
||||
self.x, self.y = x, y
|
||||
|
||||
def xcor(self) -> float:
|
||||
return self.x
|
||||
|
||||
def ycor(self) -> float:
|
||||
return self.y
|
||||
|
||||
|
||||
def test_is_hit_when_a_car_overlaps_the_player() -> None:
|
||||
manager = make_manager()
|
||||
manager.create_cars()
|
||||
car = manager.all_cars[0]
|
||||
assert manager.is_hit(FakePlayer(car.x, car.y))
|
||||
|
||||
|
||||
def test_is_not_hit_when_cars_are_far_away() -> None:
|
||||
manager = make_manager()
|
||||
manager.create_cars()
|
||||
car = manager.all_cars[0]
|
||||
assert not manager.is_hit(FakePlayer(car.x - 200, car.y))
|
||||
|
||||
|
||||
def test_is_not_hit_when_there_are_no_cars() -> None:
|
||||
assert not make_manager().is_hit(FakePlayer(0, 0))
|
||||
|
||||
|
||||
def test_level_up_increases_speed() -> None:
|
||||
manager = make_manager()
|
||||
manager.level_up()
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
"""Tests for the pure collision rule."""
|
||||
|
||||
from collision import is_colliding
|
||||
from constants import CAR_HEIGHT, CAR_LENGTH, PLAYER_HALF_SIZE
|
||||
|
||||
REACH_X = CAR_LENGTH / 2 + PLAYER_HALF_SIZE
|
||||
REACH_Y = CAR_HEIGHT / 2 + PLAYER_HALF_SIZE
|
||||
|
||||
|
||||
def test_hit_when_player_overlaps_car() -> None:
|
||||
assert is_colliding(5, 3, 0, 0)
|
||||
|
||||
|
||||
def test_no_hit_when_beyond_car_half_length_horizontally() -> None:
|
||||
assert not is_colliding(REACH_X + 1, 0, 0, 0)
|
||||
|
||||
|
||||
def test_no_hit_when_a_lane_away_vertically() -> None:
|
||||
assert not is_colliding(0, CAR_HEIGHT * 2, 0, 0)
|
||||
|
||||
|
||||
def test_no_hit_when_exactly_at_horizontal_boundary() -> None:
|
||||
assert not is_colliding(REACH_X, 0, 0, 0)
|
||||
|
||||
|
||||
def test_no_hit_when_exactly_at_vertical_boundary() -> None:
|
||||
assert not is_colliding(0, REACH_Y, 0, 0)
|
||||
|
||||
|
||||
def test_hit_just_inside_the_boundary() -> None:
|
||||
assert is_colliding(REACH_X - 1, REACH_Y - 1, 0, 0)
|
||||
+16
-1
@@ -2,7 +2,7 @@
|
||||
|
||||
import pytest
|
||||
|
||||
from constants import MOVE_DISTANCE, STARTING_POSITION
|
||||
from constants import FINISH_LINE_Y, MOVE_DISTANCE, STARTING_POSITION
|
||||
from player import Player
|
||||
|
||||
|
||||
@@ -27,6 +27,21 @@ def test_go_up_moves_forward_by_move_distance(player: Player) -> None:
|
||||
assert player.ycor() == start_y + MOVE_DISTANCE
|
||||
|
||||
|
||||
def test_player_is_not_at_finish_line_at_start(player: Player) -> None:
|
||||
assert not player.is_at_finish_line()
|
||||
|
||||
|
||||
def test_player_is_at_finish_line_above_finish_y(player: Player) -> None:
|
||||
player.goto(0, FINISH_LINE_Y + 1)
|
||||
assert player.is_at_finish_line()
|
||||
|
||||
|
||||
def test_go_to_start_returns_to_starting_position(player: Player) -> None:
|
||||
player.goto(0, FINISH_LINE_Y + 1)
|
||||
player.go_to_start()
|
||||
assert player.position() == STARTING_POSITION
|
||||
|
||||
|
||||
def test_go_up_never_moves_sideways(player: Player) -> None:
|
||||
for _ in range(5):
|
||||
player.go_up()
|
||||
|
||||
Reference in New Issue
Block a user