_(:3」∠❀)_714 2024-04-28 15:39 采纳率: 50%
浏览 8

飞机大战问题:敌方飞机持续出现


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

image_path = "level3 resource/resources/images/"
sound_path = "level3 resource/resources/sounds/"
data_path = "level3 resource/resources/data/"
RUN = 1
PAUSE = 2
FALURE = 3
ENEMY=USEREVENT


class Game:
    def __init__(self):
        pygame.init()
        pygame.display.set_caption("飞机大战")
        self.screen = pygame.display.set_mode((480, 640))
        self.background = pygame.image.load(image_path + "background2.png")
        self.plane = MyPlane(3)
        self.enemys=[]
        self.state = RUN

    def listen(self):
        for event in pygame.event.get():
            if event.type == QUIT:
                exit()
            elif event.type==ENEMY:
                self.enemys.append(Enemy(3))

    def control(self):
        if self.state == RUN:
            self.screen.blit(self.background, (0, 0))
            self.screen.blit(self.plane.image, self.plane.rect)
            self.plane.move()
            self.enemys.append(Enemy(3))
            for enemy in self.enemys:
                self.screen.blit(enemy.image,enemy.rect)
                enemy.move()
            pygame.display.update()
        elif self.state == PAUSE:
            pass

    def run(self):
        pygame.time.set_timer(ENEMY,1000)
        while True:
            self.listen()
            self.control()


class MyPlane:
    def __init__(self, speed):
        self.image = pygame.image.load(image_path + "myplane1.png")
        self.rect = self.image.get_rect()
        self.rect.midbottom = (240, 640)
        self.speed = speed

    def move(self):
        keys = pygame.key.get_pressed()
        if keys[K_UP]:
            if self.rect.top > 0:
                self.rect.top = self.rect.top - self.speed
        elif keys[K_DOWN]:
            if self.rect.bottom < 640:
                self.rect.bottom = self.rect.bottom + self.speed
        elif keys[K_LEFT]:
            if self.rect.left > 0:
                self.rect.left = self.rect.left - self.speed
        elif keys[K_RIGHT]:
            if self.rect.right < 480:
                self.rect.right = self.rect.right + self.speed
class Enemy:
    def __init__(self,speed):
        self.image=pygame.image.load(image_path+"small_enemy.png")
        self.rect=self.image.get_rect()
        self.rect.left=random.randint(0,480-self.image.get_width())
        self.speed=speed
    def move(self):
        self.rect.top=self.rect.top+self.speed

game = Game()
game.run()


敌方飞机一直持续出现,为啥加上等待的代码也没有用啊

  • 写回答

5条回答 默认 最新

  • 阿里嘎多学长 2024-04-28 15:39
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    【问题概括】:这个问题的目的是解决在Python使用pygame库编写的飞机大战游戏中,敌方飞机持续出现而不受控制的问题。

    【问题出现原因】:

    1. ENEMY 事件被设置为用户自定义事件,但是没有在事件监听部分正确处理。
    2. pygame.time.set_timer(ENEMY,1000) 这行代码意在每秒产生一个ENEMY事件,但事件监听部分并没有正确处理这个事件来生成新的敌人飞机。

    【问题解决方案】:

    1. 修改事件监听部分,以确保当ENEMY事件发生时,能够正确地创建新的敌方飞机实例。
    2. 将敌方飞机的生成逻辑从control方法中移出,改为在listen方法中处理,这样每当ENEMY事件发生时,就会创建一个新的敌方飞机。

    【提供代码】: 下面是修改后的代码:

    import pygame
    from pygame.locals import *
    from sys import exit
    import random
    
    image_path = "level3 resource/resources/images/"
    sound_path = "level3 resource/resources/sounds/"
    data_path = "level3 resource/resources/data/"
    RUN = 1
    PAUSE = 2
    FAILURE = 3
    ENEMY = USEREVENT + 1  # 确保ENEMY是一个唯一的事件ID
    
    class Game:
        # ... 省略其他部分以节省空间 ...
    
        def listen(self):
            for event in pygame.event.get():
                if event.type == QUIT:
                    exit()
                elif event.type == ENEMY:
                    self.enemys.append(Enemy(3))  # 在这里添加新的敌方飞机
    
        def control(self):
            if self.state == RUN:
                self.screen.blit(self.background, (0, 0))
                self.screen.blit(self.plane.image, self.plane.rect)
                self.plane.move()
                for enemy in self.enemys:
                    self.screen.blit(enemy.image, enemy.rect)
                    enemy.move()
                    self.check_collision(enemy)  # 假设你有一个检测碰撞的方法
                pygame.display.update()
            elif self.state == PAUSE:
                pass
    
        def run(self):
            pygame.time.set_timer(ENEMY, 1000)  # 设置每秒产生一个ENEMY事件
            while True:
                self.listen()
                self.control()
    
        # 假设的碰撞检测方法,实际中需要根据游戏逻辑实现
        def check_collision(self, enemy):
            pass
    
    # ... 省略其他部分以节省空间 ...
    
    game = Game()
    game.run()
    

    【代码运行方式】:

    1. 确保你的开发环境中安装了pygame库。
    2. 将上述代码保存为.py文件。
    3. 在支持Python的环境中运行这个.py文件。

    【代码预期运行结果】:

    • 游戏窗口打开,显示背景和玩家飞机。
    • 玩家可以使用键盘控制飞机上下左右移动。
    • 每秒会在屏幕上随机位置生成一个敌方飞机,并向屏幕顶部移动。

    【推荐相关链接】:

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月28日

悬赏问题

  • ¥15 Kylin-Desktop-V10-GFB-Release-JICAI_02- 2207-Build14-ARM64.iso有没有这个版本的系统啊
  • ¥15 能不能通过蓝牙将传感器数据传送到手机上
  • ¥20 100元python和数据科学实验项目
  • ¥15 根据时间在调用出列表
  • ¥15 FastReport.community 编辑,table只显示“每页”最顶部和底部横线
  • ¥15 R 包chipseeker 安装失败
  • ¥15 Veeam Backup & Replication 9.5 还原问题
  • ¥15 vue-print-nb
  • ¥15 winfrom的datagridview下拉框变成了黑色,渲染不成功
  • ¥20 利用ntfy实现短信推送