def move_head(direction): global head, tail, head_x, head_y, facing, opposite, snake_head_img if direction == opposite: direction = head['facing'] if facing != direction: snake_head_img = orientate_snake(snake_head_img, head, direction.value) if direction == Directions.UP: head['rect'].top -= SEG_DIM head['facing'] = Directions.UP opposite = Directions.get_opposite(direction) elif direction == Directions.RIGHT: head['rect'].left += SEG_DIM head['facing'] = Directions.RIGHT opposite = Directions.get_opposite(direction) elif direction == Directions.DOWN: head['rect'].top += SEG_DIM head['facing'] = Directions.DOWN opposite = Directions.get_opposite(direction) elif direction == Directions.LEFT: head['rect'].left -= SEG_DIM head['facing'] = Directions.LEFT opposite = Directions.get_opposite(direction)
def act(self, state): head_pos = state[0] apple_pos = state[1] step_size = state[2] facing = state[3] tail = state[4] shortest = None action = action_space[0] for i in range(0, len(action_space)): if Directions.get_opposite(facing) == directions[i]: continue direction = directions[i] opposite = Directions.get_opposite(direction) x, y = self.pred_position(head_pos.left, head_pos.top, direction, opposite, step_size) if not self.will_avoid_oneself(x, y, tail): continue distance = math.sqrt((apple_pos.top - y)**2 + (apple_pos.left - x)**2) if shortest == None or distance < shortest: shortest = distance action = action_space[i] return action
def reset(settings, first_play=False): global head, tail, facing, opposite, direction, apple, snake_head_img, snake_body_img direction = settings['starting_direction'] opposite = Directions.get_opposite(facing) head['rect'] = get_segment() head['facing'] = settings['starting_direction'] apple = spawn_apple() snake_head_img = pygame.image.load("snake head.png") snake_head_img = pygame.transform.scale(snake_head_img, (settings['block_dim'], settings['block_dim'])) snake_body_img = pygame.image.load("snake body.png") snake_body_img = pygame.transform.scale(snake_body_img, (settings['block_dim'], settings['block_dim'])) if settings['autostart']: direction = facing if first_play: if settings['walls_on']: generate_walls() if settings['tunnels_on']: generate_tunnels() else: tail = [] for _ in range(settings['starting_tail']): move_head(head['facing']) tail.append(get_segment())