import pygame import random import math # 添加这行导入 # 初始化pygame pygame.init() # 设置屏幕 screen_width = 480 screen_height = 640 screen = pygame.display.set_mode((screen_width, screen_height)) pygame.display.set_caption("飞机大战") # 定义颜色 WHITE = (255, 255, 255) BLACK = (0, 0, 0) RED = (255, 0, 0) # 加载图像 player_img = pygame.image.load("player.png") enemy_img = pygame.image.load("enemy.png") boss_img = pygame.image.load("boss.png") bullet_img = pygame.image.load("bullet.png") enemy_bullet_img = pygame.image.load("bossbullet.png") if pygame.image.load("bossbullet.png") else pygame.Surface((10, 10)) bg_img = pygame.image.load("bg.png") # 定义飞机类 class Player(pygame.sprite.Sprite): def __init__(self): super().__init__() self.image = player_img self.rect = self.image.get_rect() self.rect.center = (screen_width // 2, screen_height - 60) self.speed = 8 def update(self): keys = pygame.key.get_pressed() if keys[pygame.K_LEFT] and self.rect.left > 0: self.rect.x -= self.speed if keys[pygame.K_RIGHT] and self.rect.right < screen_width: self.rect.x += self.speed # 定义普通敌机类 class Enemy(pygame.sprite.Sprite): def __init__(self): super().__init__() self.image = enemy_img self.rect = self.image.get_rect() self.rect.x = random.randint(0, screen_width - self.rect.width) self.rect.y = random.randint(-100, -40) self.speed = random.randint(1, 3) def update(self): self.rect.y += self.speed if self.rect.top > screen_height: self.rect.x = random.randint(0, screen_width - self.rect.width) self.rect.y = random.randint(-100, -40) # 定义精英敌机类 class Boss(Enemy): def __init__(self): super().__init__() self.image = boss_img self.shoot_delay = 1000 self.last_shot = pygame.time.get_ticks() def update(self): super().update() if pygame.time.get_ticks() - self.last_shot > self.shoot_delay: self.last_shot = pygame.time.get_ticks() self.shoot() def shoot(self): for angle in range(-45, 46, 15): bullet = EnemyBullet(self.rect.centerx, self.rect.bottom, angle) all_sprites.add(bullet) enemy_bullets.add(bullet) # 定义子弹类 class Bullet(pygame.sprite.Sprite): def __init__(self, x, y): super().__init__() self.image = bullet_img self.rect = self.image.get_rect() self.rect.center = (x, y) self.speed = -10 def update(self): self.rect.y += self.speed if self.rect.bottom < 0: self.kill() # 定义精英敌机子弹类 class EnemyBullet(pygame.sprite.Sprite): def __init__(self, x, y, angle): super().__init__() self.image = enemy_bullet_img self.rect = self.image.get_rect() self.rect.center = (x, y) self.speed = 5 self.angle = angle self.dx = self.speed * math.cos(math.radians(angle)) self.dy = self.speed * math.sin(math.radians(angle)) def update(self): self.rect.x += self.dx self.rect.y += self.dy if self.rect.top > screen_height or self.rect.left < 0 or self.rect.right > screen_width: self.kill() # 创建精灵组 all_sprites = pygame.sprite.Group() enemies = pygame.sprite.Group() bullets = pygame.sprite.Group() enemy_bullets = pygame.sprite.Group() # 创建玩家 player = Player() all_sprites.add(player) # 创建敌机 for _ in range(6): enemy = Enemy() all_sprites.add(enemy) enemies.add(enemy) # 创建精英敌机 boss = Boss() all_sprites.add(boss) enemies.add(boss) # 游戏主循环 scroll_speed = 1 bg_y = 0 running = True while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False elif event.type == pygame.KEYDOWN: if event.key == pygame.K_SPACE: bullet = Bullet(player.rect.centerx, player.rect.top) all_sprites.add(bullet) bullets.add(bullet) bg_y += scroll_speed if bg_y >= screen_height: bg_y = 0 all_sprites.update() # 检查子弹与敌机碰撞 hits = pygame.sprite.groupcollide(enemies, bullets, True, True) for hit in hits: if isinstance(hit, Boss): enemy = Boss() else: enemy = Enemy() all_sprites.add(enemy) enemies.add(enemy) # 填充背景 screen.blit(bg_img, (0, bg_y)) screen.blit(bg_img, (0, bg_y - screen_height)) all_sprites.draw(screen) pygame.display.flip() pygame.time.delay(30) pygame.quit()