def __init__(self, body: list, speed: float = 14.0): """ :param body: list[SnakePart], перечисленный в порядке head -> tail """ self.speed = speed self.length_change = 0 self.body = Queue() for snake_part in body[::-1]: self.body.enqueue(snake_part)
def test_enqueue_dequeue(self): q = Queue() q.enqueue(1) self.assertEqual(1, q.dequeue()) q.enqueue(1) q.enqueue(4) self.assertEqual(1, q.dequeue()) self.assertEqual(4, q.dequeue())
class TestQueue(unittest.TestCase): def setUp(self): self.queue = Queue() for i in range(5): self.queue.enqueue(i) def test_get_head_and_tail(self): self.assertEqual(0, self.queue.head) self.assertEqual(4, self.queue.tail) q = Queue() self.assertTrue(q.head == q.tail is None) def test_enqueue(self): self.queue.enqueue(0) self.assertEqual(0, self.queue.tail) def test_dequeue(self): head = self.queue.head self.assertEqual(head, self.queue.dequeue()) q = Queue() self.assertRaises(ValueError, q.dequeue) def test_get_len(self): self.assertEqual(5, len(self.queue)) q = Queue() self.assertEqual(0, len(q)) def test_iter(self): i = 0 for item in self.queue: self.assertEqual(i, item) i += 1 def test_enqueue_dequeue(self): q = Queue() q.enqueue(1) self.assertEqual(1, q.dequeue()) q.enqueue(1) q.enqueue(4) self.assertEqual(1, q.dequeue()) self.assertEqual(4, q.dequeue())
class Snake: def __init__(self, body: list, speed: float = 14.0): """ :param body: list[SnakePart], перечисленный в порядке head -> tail """ self.speed = speed self.length_change = 0 self.body = Queue() for snake_part in body[::-1]: self.body.enqueue(snake_part) def _get_direction_for_step(self, proposed_direction: Direction = None ) -> Direction: if proposed_direction is None: return self.head.direction if proposed_direction == TranslateDirection.opposite_dir[ self.head.direction]: return self.head.direction return proposed_direction def step(self, direction: Direction = None, size_field: tuple = None): direction = self._get_direction_for_step(direction) new_head_location = self.head.location + TranslateDirection.dir_offset[ direction] if size_field is not None: new_head_location.x %= size_field[0] new_head_location.y %= size_field[1] self.body.enqueue(SnakePart(new_head_location, direction)) if self.length_change > 0: self.length_change -= 1 return if self.length_change < 0: self.length_change += 1 self.body.dequeue() self.body.dequeue() def check_intersection(self, points: set = None) -> bool: if points is None: points = set() count = len(points) _points = copy(points) for part in self: count += 1 _points.add(part.location) return count != len(_points) def eat_food(self, food: Food): self.speed *= food.speed_change self.length_change += food.length_change @property def head(self) -> SnakePart: return self.body.tail @property def tail(self) -> SnakePart: return self.body.head def __iter__(self): """Итератор для змейки пробегающий от головы до хвоста""" snake = [] for part in self.body: snake.append(part) return iter(snake[::-1]) def __len__(self): return len(self.body)
def test_get_len(self): self.assertEqual(5, len(self.queue)) q = Queue() self.assertEqual(0, len(q))
def test_dequeue(self): head = self.queue.head self.assertEqual(head, self.queue.dequeue()) q = Queue() self.assertRaises(ValueError, q.dequeue)
def test_get_head_and_tail(self): self.assertEqual(0, self.queue.head) self.assertEqual(4, self.queue.tail) q = Queue() self.assertTrue(q.head == q.tail is None)
def setUp(self): self.queue = Queue() for i in range(5): self.queue.enqueue(i)