You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Pygame开发PacMan游戏:半智能幽灵移动实现求助

优化PacMan半智能幽灵移动的思路与代码调整

首先咱们先捋清楚你当前代码里导致幽灵撞墙的核心问题:完全没提前检查目标方向是否可通行,而且方向选择逻辑没过滤墙的位置,再加上move_list没有合理清理,导致幽灵可能选了撞墙的方向还在执行。下面是具体的优化方案,兼顾挑战性和合理性:

核心优化方向

  • 新增可通行方向检测:每次选方向前,先判断该方向对应的格子是不是墙,只从能走的方向里挑
  • 平衡追踪与随机的比例:70%概率追玩家,30%概率随机游走,既不会太傻也不会让玩家完全跑不掉
  • 简化状态管理:删掉容易混乱的move_list,直接维护当前有效方向,避免方向堆积
  • 修复左侧追踪的逻辑漏洞:原逻辑随机选左/上/下但没排除墙,现在结合可通行检测来筛选

调整后的代码示例

首先需要一个辅助函数判断方向是否可行(假设你的游戏里用game.map存储网格数据,1代表墙):

def is_direction_valid(self, direction):
    # 把像素坐标转成格子坐标,避免偏移导致判断错误
    tile_x = self.rect.x // TILESIZE
    tile_y = self.rect.y // TILESIZE
    
    # 计算目标格子位置
    if direction == 'right':
        target_tile = (tile_x + 1, tile_y)
    elif direction == 'left':
        target_tile = (tile_x - 1, tile_y)
    elif direction == 'up':
        target_tile = (tile_x, tile_y - 1)
    elif direction == 'down':
        target_tile = (tile_x, tile_y + 1)
    else:
        return False
    
    # 检查目标格子在地图范围内,且不是墙
    if 0 <= target_tile[0] < self.game.map_width and 0 <= target_tile[1] < self.game.map_height:
        return not self.game.map[target_tile[1]][target_tile[0]] == 1
    return False

然后修改get_direction方法,结合可通行检测和半智能逻辑:

def get_direction(self):
    current_time = pygame.time.get_ticks()
    
    # 先筛选出当前可通行的方向,排除当前方向的反向(避免幽灵来回晃)
    valid_directions = []
    for dir in self.list_of_directions:
        # 比如当前向右,就不直接选向左,让移动更流畅
        if (self.direction == 'right' and dir == 'left') or \
           (self.direction == 'left' and dir == 'right') or \
           (self.direction == 'up' and dir == 'down') or \
           (self.direction == 'down' and dir == 'up'):
            continue
        if self.is_direction_valid(dir):
            valid_directions.append(dir)
    
    # 极端情况:如果所有方向都被堵,允许反向移动
    if not valid_directions:
        valid_directions = [dir for dir in self.list_of_directions if self.is_direction_valid(dir)]
    
    # 半智能逻辑:70%概率追玩家,30%概率随机游走
    chase_chance = 0.7
    if random.random() < chase_chance:
        # 优先选朝向玩家的方向
        preferred_directions = []
        player_tile_x = self.game.player.rect.x // TILESIZE
        player_tile_y = self.game.player.rect.y // TILESIZE
        ghost_tile_x = self.rect.x // TILESIZE
        ghost_tile_y = self.rect.y // TILESIZE
        
        # 横向判断:玩家在左侧且左方向可行,加入优先列表
        if player_tile_x < ghost_tile_x and 'left' in valid_directions:
            preferred_directions.append('left')
        elif player_tile_x > ghost_tile_x and 'right' in valid_directions:
            preferred_directions.append('right')
        
        # 纵向判断:玩家在上侧且上方向可行,加入优先列表
        if player_tile_y < ghost_tile_y and 'up' in valid_directions:
            preferred_directions.append('up')
        elif player_tile_y > ghost_tile_y and 'down' in valid_directions:
            preferred_directions.append('down')
        
        # 有优先方向就选优先的,没有就随机选可行方向
        self.direction = random.choice(preferred_directions) if preferred_directions else random.choice(valid_directions)
    else:
        # 随机游走:从可行方向里随便选一个
        self.direction = random.choice(valid_directions)
    
    # 控制方向切换频率,到延迟时间再更新速度
    if current_time - self.direction_first_time > self.long_delay:
        self.direction_first_time = current_time
        # 更新速度向量
        self.vx, self.vy = 0, 0
        if self.direction == 'right':
            self.vx = self.game.speed
        elif self.direction == 'left':
            self.vx = -self.game.speed
        elif self.direction == 'up':
            self.vy = -self.game.speed
        elif self.direction == 'down':
            self.vy = self.game.speed

额外细节优化

  • 用格子坐标判断位置:避免精灵移动中的像素偏移导致追踪判断错误
  • 排除反向移动:让幽灵的移动更贴近原版PacMan的流畅感,减少无意义的来回晃
  • 容错处理:极端情况下允许反向移动,防止幽灵被困死

内容的提问来源于stack exchange,提问作者Addison

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:58:37