简易飞机大战PYTHON版

实现简易的飞机大战需要设计并完成以下几个类,通过使用基础的Python语句以及对类进行封装,继承和资源管理就可以实现这个小游戏。

1.玩家飞机类

这是游戏的主角,负责接受玩家的指令并做出操作。

需要包含的属性有:

  1. 飞机图片
  2. 坐标
  3. 生命值
  4. 子弹发射频率

需要实现的方法有:

  • move():根据键盘输入改变坐标,必要的时候进行边界检测
  • shoot():产生子弹对象并加入子弹组。
  • reset():玩家死亡后的重置逻辑。

代码如下:

class Player(pygame.sprite.Sprite):
    def __init__(self, image_path, screen_width, screen_height):
        super().__init__()
        self.image = pygame.image.load(image_path).convert_alpha()
        self.rect = self.image.get_rect()
        # 初始位置
        self.rect.centerx = screen_width // 2
        self.rect.bottom = screen_height - 20
        self.speed = 5

    def moveUp(self):
        if self.rect.top > 0: self.rect.y -= self.speed
    def moveDown(self, screen_height):
        if self.rect.bottom < screen_height: self.rect.y += self.speed
    def moveLeft(self):
        if self.rect.left > 0: self.rect.x -= self.speed
    def moveRight(self, screen_width):
        if self.rect.right < screen_width: self.rect.x += self.speed

2.子弹类

通过这个类实现飞机发射子弹的行为。

需要包含的属性有:

  1. 子弹图片
  2. 坐标
  3. 飞行速度
  4. 伤害值

需要包含的方法有:

  • update():每一帧向上(如果是敌机的话则向下)移动。
  • kill()飞出屏幕边界时自动销毁子弹,防止内存泄漏。

代码如下:

class Bullet(pygame.sprite.Sprite):
    def __init__(self, bullet_img, init_pos):
        super().__init__() # 调用父类初始化
        self.image = bullet_img
        self.rect = self.image.get_rect()
        self.rect.midbottom = init_pos # 核心:子弹从飞机头部发射
        self.speed = 10

    def update(self):
        self.rect.top -= self.speed # 向上移动
        if self.rect.bottom < 0:    # 自动销毁逻辑
            self.kill()

3.敌机类

这个类与玩家类类似,作用是在这个类中实现与玩家的互动。

需要包含的属性有:

  1. 随机的初始坐标
  2. 不同的移动速度
  3. 随机的出现频率

需要实现的方法有:

  • update():向下移动。
  • reset():被击中或飞出底端后,回到顶端重新随机出现。

代码如下:

import random

class Enemy(pygame.sprite.Sprite):
    def __init__(self, image_path, screen_width):
        super().__init__()
        self.image = pygame.image.load(image_path).convert_alpha()
        self.rect = self.image.get_rect()
        # 随机位置出现在顶部外
        self.rect.left = random.randint(0, screen_width - self.rect.width)
        self.rect.bottom = 0 
        self.speed = random.randint(2, 5) # 随机速度

    def update(self):
        self.rect.top += self.speed # 向下移动
        if self.rect.top > 700:    # 飞出屏幕底端后销毁
            self.kill()

4.背景类

该类主要实现背景图片的交替,以呈现给玩家像在飞行的视觉效果。

  • 原理:通常使用两张完全相同的背景图拼接,交替向下滚动。实现无缝滚动的效果。
  • 属性:背景图片,滚动速度。
  • 方法:update()控制两张图片的坐标更替。

代码如下:

class Background():
    def __init__(self, screen):
        self.screen = screen
        self.image = pygame.Surface((480, 700)) # 或者是加载背景图
        self.image.fill((30, 30, 30))
        self.y1 = 0
        self.y2 = -700 # 第二张图接在第一张上面

    def update(self):
        # 两张背景图同时向下滚动
        self.y1 += 2
        self.y2 += 2
        if self.y1 >= 700: self.y1 = -700
        if self.y2 >= 700: self.y2 = -700

    def draw(self):
        self.screen.blit(self.image, (0, self.y1))
        self.screen.blit(self.image, (0, self.y2))

5.游戏主逻辑控制类

这个类负责调用其他类以实现目标效果。

代码如下:

import pygame
import sys

class GameApp:
    def __init__(self):
        pygame.init()
        self.screen = pygame.display.set_mode((480, 700))
        self.clock = pygame.time.Clock()
        self.running = True
        
        # 2. 创建精灵组
        self.player = Player() # 假设你已经定义了Player类
        self.enemies = pygame.sprite.Group()
        self.bullets = pygame.sprite.Group()
        
    def _check_events(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                self.running = False
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_SPACE:
                    self.player.shoot(self.bullets)

    def _update_sprites(self):
        self.player.update()
        self.enemies.update()
        self.bullets.update()
        
        # 核心逻辑:导演亲自检测碰撞
        # 如果子弹打中敌机,两者都消失
        pygame.sprite.groupcollide(self.bullets, self.enemies, True, True)
        
        # 如果敌机撞到玩家,游戏结束
        if pygame.sprite.spritecollideany(self.player, self.enemies):
            print("Game Over!")
            self.running = False

    def _draw_screen(self):
        self.screen.fill((0, 0, 0))
        self.screen.blit(self.player.image, self.player.rect)
        self.enemies.draw(self.screen)
        self.bullets.draw(self.screen)
        pygame.display.flip()

    def run_game(self):
        while self.running:
            self.clock.tick(60)   # 维持帧率
            self._check_events()   # 处理输入
            self._update_sprites() # 更新逻辑
            self._draw_screen()    # 绘制画面
        
        pygame.quit()
        sys.exit()


if __name__ == '__main__': # 启动游戏
    game = GameApp()
    game.run_game()

更多推荐