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

求助:Python中Pygame敌人随机生成失效及非阻塞延时问题

解决Pygame敌人定时随机生成问题

原代码的核心问题

  • 未初始化显示窗口screen,也没定义running变量,主循环根本无法启动
  • 随机坐标仅在程序启动时生成一次,所有敌人都会固定在同一个位置
  • 用随机数概率控制生成逻辑,不符合“每隔0.1秒生成一个”的需求
  • 缺少Pygame事件处理,窗口会直接假死
  • 绘制敌人后没有刷新屏幕,图形无法显示
  • 若直接用time.sleep会阻塞整个主循环,导致窗口无法响应操作

修正后的代码

import random
import pygame
import sys
from pygame.locals import *

# 初始化Pygame
pygame.init()

# 设置窗口参数
screen_width, screen_height = 1280, 720
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption("敌人随机生成")

# 敌人管理变量
enemies = []  # 存储所有敌人的坐标
spawn_interval = 100  # 生成间隔(0.1秒=100毫秒)
last_spawn_time = pygame.time.get_ticks()  # 记录上次生成敌人的时间
clock = pygame.time.Clock()  # 控制帧率
running = True

def add_enemy():
    # 每次生成新的随机坐标
    ran_x = random.randint(260, 1160)
    ran_y = random.randint(260, 730)
    enemies.append((ran_x, ran_y))

while running:
    # 限制帧率为60FPS,避免循环过度占用资源
    clock.tick(60)
    
    # 获取当前运行时间(毫秒)
    current_time = pygame.time.get_ticks()
    
    # 处理窗口事件(必须保留,否则窗口会假死)
    for event in pygame.event.get():
        if event.type == QUIT:
            running = False
            pygame.quit()
            sys.exit()
    
    # 定时生成敌人:当时间差达到设定间隔时生成
    if current_time - last_spawn_time >= spawn_interval:
        add_enemy()
        last_spawn_time = current_time  # 更新上次生成时间
    
    # 清屏(黑色背景)
    screen.fill((0, 0, 0))
    
    # 绘制所有已生成的敌人
    for enemy_pos in enemies:
        pygame.draw.circle(screen, (255, 0, 255), enemy_pos, 20)
    
    # 刷新屏幕,显示所有绘制内容
    pygame.display.flip()

关键改进说明

  • 用pygame.time.get_ticks()计算时间差实现定时,完全不会阻塞主循环,保证窗口正常响应
  • 用enemies列表存储所有敌人坐标,每次刷新屏幕时重新绘制所有敌人,避免旧敌人消失
  • 加入事件处理逻辑,支持正常关闭窗口
  • 用clock.tick(60)控制循环帧率,平衡性能和流畅度
  • 遵循Pygame标准绘制流程:清屏→绘制元素→刷新屏幕

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 17:02:25