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

Pygame开发FNAF类游戏:敌场外移动逻辑及交互实现求助

针对FNAF风格游戏的实现方案

一、敌人随机移动逻辑

先实现两个核心函数:定位敌人位置、获取可行移动点位,再完成随机移动的逻辑:

def find_enemy_pos(map_grid, enemy_id):
    # 遍历地图找到对应敌人的坐标
    for y, row in enumerate(map_grid):
        for x, val in enumerate(row):
            if val == enemy_id:
                return (x, y)
    return None

def get_valid_moves(map_grid, x, y):
    # 定义上下左右四个移动方向
    directions = [(-1,0), (1,0), (0,-1), (0,1)]
    valid = []
    for dx, dy in directions:
        new_x = x + dx
        new_y = y + dy
        # 检查目标格子是否在地图范围内且为可行走的0
        if 0 <= new_x < len(map_grid[0]) and 0 <= new_y < len(map_grid):
            if map_grid[new_y][new_x] == 0:
                valid.append((new_x, new_y))
    return valid

移动敌人时,先获取当前位置,随机选择可行点后更新地图:

import random

def move_enemy(map_grid, enemy_id):
    pos = find_enemy_pos(map_grid, enemy_id)
    if not pos:
        return
    x, y = pos
    valid_moves = get_valid_moves(map_grid, x, y)
    if valid_moves:
        new_x, new_y = random.choice(valid_moves)
        # 更新地图数据:原位置置0,新位置设为敌人ID
        map_grid[y][x] = 0
        map_grid[new_y][new_x] = enemy_id

二、定时触发机制

用Pygame的时间戳实现定时,在主循环中判断是否到达移动间隔:

import pygame

pygame.init()
# 设定敌人移动间隔(单位:毫秒,示例为3秒)
MOVE_INTERVAL = 3000
last_move_time = pygame.time.get_ticks()

# 主游戏循环
running = True
while running:
    current_time = pygame.time.get_ticks()
    # 检查是否满足移动时间条件
    if current_time - last_move_time >= MOVE_INTERVAL:
        # 移动两个敌人
        move_enemy(map, 2)
        move_enemy(map, 3)
        last_move_time = current_time
    
    # 常规事件处理与渲染
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
    
    pygame.display.flip()

三、摄像头与敌人位置关联

提前给每个摄像头分配对应的地图区域,通过敌人位置匹配摄像头:

# 摄像头区域配置:key为摄像头ID,value为覆盖的矩形坐标范围(x1,y1,x2,y2)
camera_zones = {
    1: (1,1,3,1),   # 对应第一行第2-4列
    2: (5,1,7,1),   # 对应第一行第6-8列
    3: (1,2,3,4),   # 对应第2-4行第2-4列
    # 可根据你的地图扩展更多摄像头区域
}

def get_active_camera(map_grid):
    # 遍历所有敌人,检查所在区域对应的摄像头
    enemies = [2, 3]
    for enemy_id in enemies:
        pos = find_enemy_pos(map_grid, enemy_id)
        if pos:
            x, y = pos
            for cam_id, (x1, y1, x2, y2) in camera_zones.items():
                if x1 <= x <= x2 and y1 <= y <= y2:
                    return cam_id
    return None  # 敌人不在任何摄像头覆盖区域

在主循环中,每次敌人移动后更新当前摄像头:

current_camera = 0

if current_time - last_move_time >= MOVE_INTERVAL:
    move_enemy(map, 2)
    move_enemy(map, 3)
    last_move_time = current_time
    # 获取并切换到对应摄像头画面
    current_camera = get_active_camera(map)

四、地图与办公室的交互

监控敌人是否靠近办公室(地图中标记为5的位置),触发对应交互逻辑:

def check_office_proximity(map_grid):
    office_pos = find_enemy_pos(map_grid, 5)
    if not office_pos:
        return False
    ox, oy = office_pos
    # 检查办公室周围8个格子是否存在敌人
    directions = [(-1,-1), (-1,0), (-1,1), (0,-1), (0,1), (1,-1), (1,0), (1,1)]
    for dx, dy in directions:
        nx = ox + dx
        ny = oy + dy
        if 0 <= nx < len(map_grid[0]) and 0 <= ny < len(map_grid):
            val = map_grid[ny][nx]
            if val in [2, 3]:
                return True  # 敌人已靠近办公室
    return False

在主循环中调用该函数,联动你已实现的办公室功能:

if check_office_proximity(map):
    # 执行办公室交互逻辑,比如高亮门按钮、播放警告音效
    door_warning = True
    # 调用你已有的门开关相关函数,提示玩家操作

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 08:30:15