其他分享
首页 > 其他分享> > 11.pygame飞机大战游戏整体代码

11.pygame飞机大战游戏整体代码

作者:互联网

主程序

# -*- coding: utf-8 -*-
# @Time:     2022/5/20 22:26
# @Author:   LiQi
# @Describe: 主程序

import pygame
from plane_sprites import *

"""飞机大战主程序"""


class PlaneGame(object):

    # 完成游戏的初始化动作
    def __init__(self):
        print('--游戏初始化--')
        # 创建游戏窗口 SCREEN_RECT是plane_sprites定义的常量,设定了窗口的大小,通过size获取窗口大小
        self.screen = pygame.display.set_mode(SCREEN_RECT.size)
        # 创建游戏时钟
        self.clock = pygame.time.Clock()
        # 调用私有方法 创建精灵和精灵组
        self.__create_sprites()

        # 设置定时器事件 - 创建敌机 1000毫秒
        pygame.time.set_timer(CREATE_ENEMY_EVENT, 1000)

        # 设置定时器事件 -- 发射子弹
        pygame.time.set_timer(HREO_FIRE_EVENT, 500)

    # 私有方法-创建精灵、精灵组
    def __create_sprites(self):
        # 创建两个背景精灵加入精灵组,实现循环滚动
        background_1 = Background()
        background_2 = Background(True)  # 设置True表示交替背景,设置位置
        self.back_group = pygame.sprite.Group(background_1, background_2)

        # 创建敌机精灵组
        self.enemy_group = pygame.sprite.Group()

        # 创建英雄精灵和精灵组
        self.hero = Hero()
        self.hero_group = pygame.sprite.Group(self.hero)

    # 私有方法-更新精灵组
    def __update_sprites(self):
        self.back_group.update()  # 更新背景精灵组所有精灵
        self.back_group.draw(self.screen)  # 绘制精灵组图像
        self.enemy_group.update()  # 更新敌机精灵组精灵
        self.enemy_group.draw(self.screen)
        self.hero_group.update()  # 更新英雄精灵组
        self.hero_group.draw(self.screen)
        # 更新绘制发射子弹精灵组
        self.hero.bullets.update()
        self.hero.bullets.draw(self.screen)

    # 私有方法-事件监听
    def __event_handler(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:  # 判断是否退出游戏
                self.__game_over()
            elif event.type == CREATE_ENEMY_EVENT:  # 判断敌机事件
                print('--敌机出场--')
                # 创建敌机精灵
                enemy = Enemy()
                # 通过精灵组.add方法,将敌机精灵添加到精灵组
                self.enemy_group.add(enemy)
            elif event.type == HREO_FIRE_EVENT:  # 判断是否发射子弹事件
                self.hero.fire()  #

        # 获取键盘元组
        kyes_pressed = pygame.key.get_pressed()
        # 判断键盘元组→方向键是否为1
        if kyes_pressed[pygame.K_RIGHT]:

            self.hero.speed = 2
        # 判断键盘元组←方向键是否为1
        elif kyes_pressed[pygame.K_LEFT]:
            self.hero.speed = -2


        else:
            self.hero.speed = 0

    # 私有方法-碰撞监测
    def __check_collide(self):
        # 子弹摧毁飞机
        pygame.sprite.groupcollide(self.hero.bullets, self.enemy_group, True, True)
        # 敌机撞毁英雄
        enemies = pygame.sprite.spritecollide(self.hero, self.enemy_group, True)
        # 判断enemies是否有内容
        if enemies:
            # 销毁英雄飞机
            self.hero.kill()
            self.__game_over()  # 游戏结束

    @staticmethod  # 私有方法-结束游戏
    def __game_over():
        print('--游戏结束--')
        pygame.quit()
        exit()

    # 游戏循环
    def start_game(self):
        print('--游戏开始--')
        while True:
            # 设置刷新帧率
            self.clock.tick(FRAME_PER_SEC)
            # 事件监听
            self.__event_handler()
            # 碰撞监测
            self.__check_collide()
            # 更新、绘制精灵组
            self.__update_sprites()
            # 更新显示
            pygame.display.update()


if __name__ == '__main__':
    # 创建游戏对象
    game = PlaneGame()

    # 启动游戏
    game.start_game()

精灵子类

# -*- coding: utf-8 -*-
# @Time:     2022/5/20 21:17
# @Author:   LiQi
# @Describe: 派生精灵子类

import random
import pygame

# 屏幕大小
SCREEN_RECT = pygame.Rect(0, 0, 480, 700)
# 刷新帧率
FRAME_PER_SEC = 60
# 创建敌机定时器事件常量
CREATE_ENEMY_EVENT = pygame.USEREVENT

# 英雄发射子弹事件,因为创建敌机已经用了,所以我们在基础上+1
HREO_FIRE_EVENT = pygame.USEREVENT + 1
"""飞机大战游戏精灵基类"""


class GameSprite(pygame.sprite.Sprite):

    def __init__(self, image_name, speed):
        super().__init__()  # 使用super调用父类的初始化方法

        self.image = pygame.image.load(image_name)  # 加载图片数据
        self.rect = self.image.get_rect()  # 获取图片对象
        self.speed = speed  # 定义移动速度

    def update(self):
        # 在屏幕的垂直方向向上移动
        # 位置的y += 移动速度,每次移动1
        self.rect.y += self.speed


"""游戏背景精灵"""


class Background(GameSprite):

    def __init__(self, is_alt=False):
        # 调用父类方法,完成精灵的创建

        super().__init__('./images/background.png', 1)

        # is_alt字段判断是否是交替图像,如果是,需要设置初始位置
        if is_alt:
            self.rect.y = -self.rect.height

    def update(self):
        # 调用父类的update方法实现移动
        super().update()
        # 重写父类update方法,判断是否移出屏幕
        if self.rect.y >= SCREEN_RECT.height:
            # 如果移出屏幕,将图像设置到屏幕上方
            self.rect.y = -self.rect.height


"""敌机精灵"""


class Enemy(GameSprite):
    def __init__(self):
        # 调用父类方法 创建敌机精灵,指定图片
        super().__init__('./images/enemy1.png', 1)

        # 指定敌机初始随机速度 1~3
        self.speed = random.randint(1, 3)
        # 指定敌机初始随机位置
        # bottom:矩形对象的下边缘,即左下顶点对应的y坐标(左上顶点的纵坐标+矩形对象的高)
        self.rect.bottom = 0
        max_x = SCREEN_RECT.width - self.rect.width
        self.rect.x = random.randint(0, max_x)

    def update(self):
        # 调用父类方法保持垂直方向的飞行
        super().update()
        # 判断是否飞出屏幕。如果是,从精灵组删除
        if self.rect.y >= SCREEN_RECT.height:
            self.kill()  # 调用kill方法,将精灵从所有精灵组删除


"""英雄精灵"""


class Hero(GameSprite):
    def __init__(self):
        # 调用父类方法,设置image
        super().__init__('./images/me1.png', 0)
        # 设置英雄的初始位置
        self.rect.centerx = SCREEN_RECT.centerx
        self.rect.bottom = SCREEN_RECT.bottom - 120

        # 创建子弹精灵组
        self.bullets = pygame.sprite.Group()

    # 重写父类方法,实现左右移动
    def update(self):
        # 英雄在水平方向移动
        self.rect.x += self.speed
        # 控制不能离开屏幕
        # 判断x 小于0 的时候,将x设为0
        if self.rect.x < 0:
            self.rect.x = 0
        # right = x + 窗口宽度 = 右侧
        elif self.rect.right > SCREEN_RECT.right:
            self.rect.right = SCREEN_RECT.right

    # 发射子弹
    def fire(self):
        for i in (0, 1, 2):
            # 创建子弹精灵
            bullet = Bullet()

            # 设置子弹精灵位置
            bullet.rect.bottom = self.rect.y - i * 20
            bullet.rect.centerx = self.rect.centerx
            # 添加精灵组
            self.bullets.add(bullet)


"""子弹精灵"""


class Bullet(GameSprite):
    def __init__(self):
        # 设置子弹图片和初始速度
        super().__init__('./images/bullet1.png', -2)

    def update(self):
        # 调用父类方法,让子弹垂直方向飞行
        super().update()
        # 判断子弹是否飞出屏幕
        if self.rect.bottom < 0:
            self.kill()

 

标签:11,__,self,def,精灵,大战,pygame,rect
来源: https://www.cnblogs.com/Mickey-7/p/16297627.html