示例#1
0
    def shortestPath(self, gameState, isEnd):
        """
        find the shortest path from current position to destination defined by the function isEnd
        """
        pos = tuple(gameState.getPacmanPosition())

        # if there is not food left

        visited = []
        q = Queue()
        q.put((pos,0))
        visited.append(pos)
        while not q.empty():
            (pos,dis) =q.get()
            visited.append(pos)
            for (dx,dy) in [(0,1),(0,-1),(1,0),(-1,0)]:
                x = pos[0] + dx
                y = pos[1] + dy
                if (isEnd(x,y)):
                    return dis + 1

                if (not gameState.hasWall(x,y)) and (not (x,y) in visited):
                    q.put(((x,y),dis+1))
        
        raise Exception("should not reach here")
示例#2
0
    def get_all_social_paths(self, user_id: int):
        """
        Takes a user's user_id as an argument

        Returns a dictionary containing every user in that user's
        extended network with the shortest friendship path between them.

        The key is the friend's ID and the value is the path.
        """

        queue = Queue()
        queue.push([user_id])
        visited = {user_id}
        connections = {}

        while not queue.empty():
            path = queue.pop()
            user = path[-1]
            connections[user] = path
            for next_user in self.get_friends(user):
                if next_user not in visited:
                    visited.add(next_user)
                    queue.push([*path, next_user])

        return connections
示例#3
0
def solution(s):
    q = Queue(len(s))
    total = 0
    for token in s:
        if q.empty():
            q.put(token)
            total += 1
        else:
            if token > q.peek():
                q.put(token)
                total += 1
            else:
                while not q.empty() and token < q.peek():
                    q.get()
                if q.empty() or token != q.peek():
                    q.put(token)
                    total += 1
    return total
示例#4
0
def solution(s):
    q = Queue(len(s))
    for token in s:
        if token in '{[(':
            q.put(token)
        else:
            if q.empty():
                return 0
            if token == ')':
                if q.get() != '(':
                    return 0
            elif token == '}':
                if q.get() != '{':
                    return 0
            else:
                if q.get() != '[':
                    return 0

    if q.empty():
        return 1
    else:
        return 0
示例#5
0
def solution(S, D):
    assert (len(S) == len(D))
    q = Queue(len(S))

    total = 0
    for size, direction in zip(S, D):
        # print size, direction
        if direction == 1:
            q.put(size)
        else:
            if q.empty():
                total += 1
            else:
                while not q.empty():
                    upstream_size = q.get()
                    if upstream_size > size:
                        q.put(upstream_size)
                        break
                if q.empty():
                    total += 1

    # return total + q.size()
    return total + q.size()
示例#6
0
    def longest_path(self, starting_node: int):
        queue = Queue()
        queue.push([starting_node])
        visited = {starting_node}
        longest_path = []

        while not queue.empty():
            path = queue.pop()
            node = path[-1]
            longest_path = longest_path if len(longest_path) > len(
                path) else path
            for next_node in self.get_neighbors(node):
                if next_node not in visited:
                    visited.add(next_node)
                    queue.push([*path, next_node])

        return longest_path
示例#7
0
class Player(pygame.sprite.Sprite):

    # feet_walk = [pygame.image.load('PlayerSprites/Images/feet/walk/survivor-walk_0.png'), pygame.image.load('PlayerSprites/Images/feet/walk/survivor-walk_1.png'),pygame.image.load('PlayerSprites/Images/feet/walk/survivor-walk_2.png'),pygame.image.load('PlayerSprites/Images/feet/walk/survivor-walk_3.png'),pygame.image.load('PlayerSprites/Images/feet/walk/survivor-walk_4.png'),pygame.image.load('PlayerSprites/Images/feet/walk/survivor-walk_5.png'),pygame.image.load('PlayerSprites/Images/feet/walk/survivor-walk_6.png'),pygame.image.load('PlayerSprites/Images/feet/walk/survivor-walk_7.png'),pygame.image.load('PlayerSprites/Images/feet/walk/survivor-walk_8.png'),pygame.image.load('PlayerSprites/Images/feet/walk/survivor-walk_9.png'),pygame.image.load('PlayerSprites/Images/feet/walk/survivor-walk_10.png'),pygame.image.load('PlayerSprites/Images/feet/walk/survivor-walk_11.png'),pygame.image.load('PlayerSprites/Images/feet/walk/survivor-walk_12.png'),pygame.image.load('PlayerSprites/Images/feet/walk/survivor-walk_13.png'),pygame.image.load('PlayerSprites/Images/feet/walk/survivor-walk_14.png'),pygame.image.load('PlayerSprites/Images/feet/walk/survivor-walk_15.png'),pygame.image.load('PlayerSprites/Images/feet/walk/survivor-walk_16.png'),pygame.image.load('PlayerSprites/Images/feet/walk/survivor-walk_17.png'),pygame.image.load('PlayerSprites/Images/feet/walk/survivor-walk_18.png'),pygame.image.load('PlayerSprites/Images/feet/walk/survivor-walk_19.png')]
    # rifle_walk = [pygame.image.load('PlayerSprites/Images/rifle/move/survivor-move_rifle_0.png'), pygame.image.load('PlayerSprites/Images/rifle/move/survivor-move_rifle_1.png'),pygame.image.load('PlayerSprites/Images/rifle/move/survivor-move_rifle_2.png'),pygame.image.load('PlayerSprites/Images/rifle/move/survivor-move_rifle_3.png'),pygame.image.load('PlayerSprites/Images/rifle/move/survivor-move_rifle_4.png'),pygame.image.load('PlayerSprites/Images/rifle/move/survivor-move_rifle_5.png'),pygame.image.load('PlayerSprites/Images/rifle/move/survivor-move_rifle_6.png'),pygame.image.load('PlayerSprites/Images/rifle/move/survivor-move_rifle_7.png'),pygame.image.load('PlayerSprites/Images/rifle/move/survivor-move_rifle_8.png'),pygame.image.load('PlayerSprites/Images/rifle/move/survivor-move_rifle_9.png'),pygame.image.load('PlayerSprites/Images/rifle/move/survivor-move_rifle_10.png'),pygame.image.load('PlayerSprites/Images/rifle/move/survivor-move_rifle_11.png'),pygame.image.load('PlayerSprites/Images/rifle/move/survivor-move_rifle_12.png'),pygame.image.load('PlayerSprites/Images/rifle/move/survivor-move_rifle_13.png'),pygame.image.load('PlayerSprites/Images/rifle/move/survivor-move_rifle_14.png'),pygame.image.load('PlayerSprites/Images/rifle/move/survivor-move_rifle_15.png'),pygame.image.load('PlayerSprites/Images/rifle/move/survivor-move_rifle_16.png'),pygame.image.load('PlayerSprites/Images/rifle/move/survivor-move_rifle_17.png'),pygame.image.load('PlayerSprites/Images/rifle/move/survivor-move_rifle_18.png'),pygame.image.load('PlayerSprites/Images/rifle/move/survivor-move_rifle_19.png'),]

    # for image in feet_walk:
    #     pygame.transform.scale(image, (150, 99))
    # for image in rifle_walk:
    #     pygame.transform.scale(image, (150, 99))

    # feet_offset = rifle_walk[0].get_height() / 3

    def __init__(self, location):
        #  init
        pygame.sprite.Sprite.__init__(self)
        self.health = 100
        self.image = pygame.image.load(
            'PlayerSprites/Images/handgun/move/survivor-move_handgun_0.png')
        self.image = pygame.transform.scale(self.image, (50, 33))
        self.rect = self.image.get_rect()
        self.loc = location
        self.last_loc = location
        self.rect.center = self.loc.as_tuple()
        self._bot = False
        self._grid = None
        self.moving = False
        self.moves = Queue()
        self.frame_meta = {
            'frame': 0,
            'start': None,
            'end': None,
            'frames': range(settings.move_frames)
        }
        self.dirty = 0
        self.orig_image = self.image
        self.offset = Vector2(9.346,
                              -2.72)  # We shift the sprite 50 px to the right.
        self.direction = 0  # degrees: 0º is facing right
        self._last_dir = 0
        self.view_distance = 700
        self.fov = 65  # degrees
        self._resolved = True
        self.wcb = None
        self.ecb = None
        self.sensor_range = 150
        self.sensor_circle = pygame.Rect(0, 0, self.sensor_range,
                                         self.sensor_range)
        self.sensor_reset_time = 0
        self.shooting = False
        self.bullet_time = 5
        self.gun = Pistol(Loc(0, 0))
        self.prev_gun = None
        self.shoot_delay = self.gun.fire_delay

    def is_bot(self):
        return self._bot

    def set_grid(self, grid):
        self._grid = grid

    def cb(self, result):
        self._resolved = True
        self.wcb(result)

    def shoot(self, sprites, walls):
        if self.shoot_delay < 0 < self.gun.ammo:
            ray = Ray()
            collidables = [sprite.rect for sprite in sprites]
            ray.get_collider(self.loc, self.direction, collidables, walls)
            self.gun.ammo -= 1
            self.sensor_range = 400
            self.sensor_reset_time = 10
            self.shoot_delay = self.gun.fire_delay
            self.bullet_time = 5

    def rotate(self):
        self.image = pygame.transform.rotozoom(self.orig_image,
                                               -self.direction, 1)
        offset_rotated = self.offset.rotate(self.direction)
        self.rect = self.image.get_rect(center=self.loc.as_tuple() +
                                        offset_rotated)

    def scan(self, sprites, walls):
        if self._resolved:
            self._resolved = False
            collidables = [sprite.rect for sprite in sprites]
            # sprite_map = {s.rect: s for s in sprites}
            args = (self.loc, self.fov, self.direction, collidables, walls)
            Workers.delegate(in_sight,
                             args,
                             callback=self.cb,
                             error_callback=self.ecb)

    def move(self, action):
        if not self.moving:
            direction = directions[actions.index(action)]
            self.set_frames(direction)
            loc = self.loc.to_grid()
            end_loc = loc.add(direction)
            if not self._grid[end_loc].is_wall():
                self.init_move(end_loc.to_pixel())
            elif self.is_bot():
                self._recompute = True
            else:
                self.normalize_diagonal(loc, end_loc)
        elif self.frame_meta['frame'] == len(self.frame_meta['frames']):
            self.moves.push(action)

    def set_frames(self, direction):
        if direction.x and direction.y:
            self.frame_meta['frames'] = range(int(settings.move_frames * 1.6))
        else:
            self.frame_meta['frames'] = range(settings.move_frames)

    def init_move(self, end):
        self.moving = True
        self.dirty = 1
        self.frame_meta['start'] = self.loc
        self.frame_meta['end'] = end

    def normalize_diagonal(self, loc, end):
        loc1 = GridLoc(loc.x, end.y)
        loc2 = GridLoc(end.x, loc.y)
        node1 = self._grid[loc1]
        node2 = self._grid[loc2]
        if node1.is_wall() and (not node2.is_wall()):
            self.init_move(loc2.to_pixel())
        elif (not node1.is_wall()) and node2.is_wall():
            self.init_move(loc1.to_pixel())

    def update(self):
        self.handle_move_frame()

        if self.prev_gun is not self.gun:
            if self.gun is type(Pistol):
                self.image = pygame.image.load(
                    'PlayerSprites/Images/handgun/move/survivor-move_handgun_0.png'
                )
            elif self.gun is type(AssualtRifle1) or type(AssualtRifle2):
                self.image = pygame.image.load(
                    'PlayerSprites/Images/rifle/move/survivor-move_rifle_0.png'
                )
            elif self.gun is type(SubMachine2) or type(SubMachine1):
                self.image = pygame.image.load(
                    'PlayerSprites/Images/shotgun/move/survivor-move_shotgun_0.png'
                )
            self.image = pygame.transform.scale(self.image, (50, 33))
            self.rect = self.image.get_rect()
            self.rect.center = self.loc.as_tuple()
            self.prev_gun = self.gun

        self.sensor_reset_time -= 1
        self.bullet_time -= 1
        self.shoot_delay -= 1
        if self.sensor_reset_time < 0:
            self.sensor_range = 150
        self.last_loc = PixelLoc(self.rect.x, self.rect.y)
        self.rect.x, self.rect.y = self.loc.as_tuple()
        self.sensor_circle.center = self.loc.as_tuple()
        x, y = pygame.mouse.get_pos()

        if self.is_bot():
            if self.goal:
                self.direction = get_direction(self.loc, self.goal.to_pixel())
        else:
            self.direction = get_direction(self.loc, PixelLoc(x, y))
        self.dirty = 1
        self.rotate()

    def handle_move_frame(self):
        frame = self.frame_meta['frame']
        frames = self.frame_meta['frames']
        start = self.frame_meta['start']
        end = self.frame_meta['end']

        if frame == len(frames):
            self.end_move()

            if self.is_bot() and self.moving:
                self.draw_path = self.draw_path[1:] if len(
                    self.draw_path) > 1 else []
            if not self.moves.empty():
                self.move(self.moves.pop())
        elif self.moving and start and end:
            self.loc = lerp(frame, frames, start, end)
            self.frame_meta['frame'] += 1
        else:
            if not self.moves.empty():
                self.move(self.moves.pop())

    def end_move(self, flush_queue=False, finish_interpolation=False):
        if flush_queue:
            self.moves.clear()
        if not finish_interpolation:
            self.moving = False
            self.dirty = 0
            self.frame_meta['obj'] = self.frame_meta[
                'start'] = self.frame_meta['end'] = None
            self.frame_meta['frame'] = 0

    def draw(self, screen):

        if self.bullet_time > 0:
            pygame.draw.line(
                screen, Colors.YELLOW, (self.loc.x, self.loc.y), (end_points(
                    (self.loc.x, self.loc.y), self.direction, 1000)))