def test_angles(self): vector = Vector(1, 0) for _ in range(10): print( f'Vector({vector.x}, {vector.y}) -> {math.degrees(vector.angle)} / {vector.angle}' ) vector.rotate(math.radians(90))
def test_difference(self): alpha = Vector(1, 0) beta = Vector(1, 0) differences = [0, -45, -90, -135, 180, 135, 90, 45] for i in range(8): self.assertEqual(Vector.difference(alpha.angle, beta.angle), math.radians(differences[i])) beta.rotate(math.radians(-45))
def load(self, name): """Load a existing world from file.""" filename = f'{self._directory}/{name}.json' with open(filename, 'r') as file: world = json.load(file) self.size = world['size'] self._structure = copy.deepcopy(world['data']) if 'snake' in world.keys(): snake = world['snake'] position = Vector(snake['position']) direction = Vector(snake['direction']) length = snake['length'] self._snake = Snake(self, position, direction, length) else: self._snake = Snake(self) self._apple = Apple(self) self._create_surfaces() self._build_structure() self.reset()
def observe(self): def distance(x): return min(math.floor(round(x) / 2), 3) state = [] direction = self.world.snake.direction.inverted() snake = self.world.snake.position for _ in range(3): direction.rotate(math.radians(90)) value, position = self.world.raycast( snake, direction, (Apple.VALUE, Snake.VALUE, self.world.WALL_VALUE)) state.append( (value, distance(snake.distance(position)))) delta_vector = self.world.snake.position.inverted() + \ self.world.apple.position delta = math.degrees(Vector.difference( self.world.snake.direction.angle, delta_vector.angle)) state.append(( round(delta / 45) * 45, distance(snake.distance(self.world.apple.position)) )) return tuple(state)
def test_distance_diagonal_anti(self): vector_a = Vector(7, 3) vector_b = Vector(1, 2) distance = vector_a.distance(vector_b) self.assertAlmostEqual(distance, 6.082763, delta=0.001)
def test_distance_diagonal_main(self): vector_a = Vector(2, 3) vector_b = Vector(5, 7) distance = vector_a.distance(vector_b) self.assertAlmostEqual(distance, 5)
def test_distance_diagonal_origin(self): vector_a = Vector(0, 0) vector_b = Vector(2, 2) distance = vector_a.distance(vector_b) self.assertAlmostEqual(distance, 2.828427, delta=0.001)
def test_distance_same_points(self): vector_a = Vector(2, 2) vector_b = Vector(2, 2) distance = vector_a.distance(vector_b) self.assertEqual(distance, 0)
def test_distance_vertical_three_to_eight(self): vector_a = Vector(0, 3) vector_b = Vector(0, 8) distance = vector_a.distance(vector_b) self.assertEqual(distance, 5)
def test_rotation(self): vec = Vector(1, 0) vectors = [ Vector(1, 0), Vector(1, 1), Vector(0, 1), Vector(-1, 1), Vector(-1, 0), Vector(-1, -1), Vector(0, -1), Vector(1, -1) ] for i in range(8): self.assertEqual(vec, vectors[i]) vec = vec.rotated(math.radians(45))
def test_distance_vertical_zero_to_six(self): vector_a = Vector(0, 0) vector_b = Vector(0, 6) distance = vector_a.distance(vector_b) self.assertEqual(distance, 6)
def test_distance_horizontal_five_to_nine(self): vector_a = Vector(5, 0) vector_b = Vector(9, 0) distance = vector_a.distance(vector_b) self.assertEqual(distance, 4)
def test_distance_horizontal_zero_to_ten(self): vector_a = Vector(0, 0) vector_b = Vector(10, 0) distance = vector_a.distance(vector_b) self.assertEqual(distance, 10)