python项目(课设)——飞机大战小游戏项目源码(pygame)

主程序

import pygame

from plane_sprites import *

class PlaneGame:

"""

游戏类

"""

def init(self):

print("游戏初始化")

初始化字体模块

pygame.font.init()

创建游戏窗口

self.screen = pygame.display.set_mode(SCREEN_RECT.size)

常见游戏时钟

self.clock = pygame.time.Clock()

调用私有创建精灵的方法,创建精灵和精灵组

self.__create_sprites()

设置定时器事件,创建敌机,时间1s

pygame.time.set_timer(CREATE_ENEMY_EVENT,1000)

设置定时器事件,发射子弹

pygame.time.set_timer(HERO_FIRE_EVENT,500)

def __create_sprites(self):

创建精灵和精灵组

bg1 = Background()

bg2 = Background(True)

bg2.rect.y = -SCREEN_RECT.height

self.back_group = pygame.sprite.Group(bg1, bg2)

创建敌机的精灵组

self.enemy_group = pygame.sprite.Group()

建立英雄飞机精灵和精灵组

self.hero = Hero()

self.hero_groups = pygame.sprite.Group(self.hero)

def start_game(self):

print("游戏开始")

while True:

1.设置刷新帧率

self.clock.tick(FRAME_PER_SECTION)

2.事件监听

self.__event_handle()

3.碰撞检测

self.__check_collide()

4.更新/绘制精灵组

self.__update_sprites()

5.更新显示

pygame.display.update()

def __event_handle(self):

for event in pygame.event.get():

if event.type == pygame.QUIT:

PlaneGame.__game_over()

elif event.type == CREATE_ENEMY_EVENT:

print("敌机出现")

创建敌机精灵

enemy = Enemy()

将精灵添加到精灵组中

self.enemy_group.add(enemy)

elif event.type == pygame.KEYDOWN and event.key == pygame.K_RIGHT:

self.hero.rect.x += 5

elif event.type == pygame.KEYDOWN and event.key == pygame.K_LEFT:

self.hero.rect.x -= 5

elif event.type == HERO_FIRE_EVENT:

self.hero.fire()

使用键盘的方法获取按键

key_pressed = pygame.key.get_pressed() # 获取按键元组

判断元组中对应按键索引

if key_pressed[pygame.K_RIGHT]:

self.hero.speed_x = 2

self.hero.update()

self.hero.speed_x = 0

if key_pressed[pygame.K_LEFT]:

self.hero.speed_x = -2

self.hero.update()

self.hero.speed_x = 0

if key_pressed[pygame.K_UP]:

self.hero.speed_y = -3

self.hero.update()

self.hero.speed_y = 0

if key_pressed[pygame.K_DOWN]:

self.hero.speed_y = 3

self.hero.update()

self.hero.speed_y = 0

def __check_collide(self):

1.子弹打飞机

pygame.sprite.groupcollide(self.hero.bullets, self.enemy_group, True, True)

2.英雄飞机撞敌机

enemies = pygame.sprite.spritecollide(self.hero, self.enemy_group, True)

3.判断列表内容

if len(enemies) > 0:

#self.hero.kill()

结束游戏

PlaneGame.__game_over()

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_groups.update()

self.hero_groups.draw(self.screen)

self.hero.bullets.update()

self.hero.bullets.draw(self.screen)

@staticmethod

def __game_over():

print("游戏结束")

清屏

pygame.display.get_surface().fill((0, 0, 0))

设置字体

font = pygame.font.SysFont("arial", 72) # 字体和字号

渲染文本

text_surface = font.render("GAME_OVER", True, (255, 0, 0))

获取文本矩形

text_rect = text_surface.get_rect(center=(SCREEN_RECT.width // 2, SCREEN_RECT.height // 2))

将文本绘制到窗口

pygame.display.get_surface().blit(text_surface, text_rect)

更新显示

pygame.display.update()

等3秒

pygame.time.delay(3000)

pygame.quit() # 卸载所有模块

exit()

if name == "main":

print("游戏开始")

创建游戏对象

game = PlaneGame()

启动游戏

game.start_game()

辅助程序

复制代码
import pygame
import random
# 屏幕大小的常量
SCREEN_RECT = pygame.Rect(0, 0, 480, 700)
FRAME_PER_SECTION = 60
# 创建敌机定时器常量
CREATE_ENEMY_EVENT = pygame.USEREVENT
# 英雄发射子弹的事件
HERO_FIRE_EVENT = pygame.USEREVENT + 1


class GameSprite(pygame.sprite.Sprite):
    """
    游戏精灵类
    """
    def __init__(self, image_name, speed=1):
        # 调用父类的初始化方法
        super().__init__()
        self.image = pygame.image.load(image_name)
        self.speed = speed
        self.rect = self.image.get_rect() # 默认位置(0,0)

    def update(self):
        # 屏幕垂直方向移动
        self.rect.y += self.speed


class Background(GameSprite):
        """
        游戏背景
        """
        def __init__(self, is_alt = False):
            # 1.调用父类的初始方法,指定图片
            super().__init__("images/background.png")
            # 2.判断是否为第二张图片,如果是需要指定.
            if is_alt:
                self.rect.y = -self.rect.height

        def update(self):
            # 1.调用父类方法
            super().update()
            # 2.判断背景是否移出屏幕,如果移出屏幕则移动到屏幕的上方
            if self.rect.y >= SCREEN_RECT.height:
                self.rect.y = -SCREEN_RECT.height


class Enemy(GameSprite):
    """
    创建敌机类
    """
    def __init__(self):
    # 1.调用父类的初始方法,指定图片
        super().__init__("images/enemy1.png")
    # 2.指定敌机的初始随机速度
        self.speed = random.randint(1,3)
    # 3.指定敌机的初始随机位置
        self.rect.bottom = 0
        max_x = SCREEN_RECT.width - self.rect.width
        self.rect.x = random.randint(0,max_x)

    def update(self):
        # 1.调用父类方法,保证垂直移动
        super().update()
        # 2.判断是否飞出屏幕,飞出则从敌机精灵组删除
        if self.rect.y >= SCREEN_RECT.height:
            # print("飞出屏幕")
            # 飞出屏幕,kill来删除
            self.kill()

    def __del__(self):
        # print("飞机坠机了")
        pass


class Hero(GameSprite):
    """
    英雄飞机
    """
    def __init__(self):
        # 1.调用父类方法,竖直方向上不移动
        super().__init__("images/me1.png",speed = 0)
        # 2.设置初始位置
        self.rect.centerx = SCREEN_RECT.centerx
        self.rect.bottom = SCREEN_RECT.bottom - 120
        # 3.创建子弹精灵组
        self.bullets = pygame.sprite.Group()
        self.speed_x = 0
        self.speed_y = 0

    def update(self):
        # 水平移动
        self.rect.x += self.speed_x
        # 垂直移动
        self.rect.y += self.speed_y
        # 控制飞机飞出边界
        if self.rect.x <= 0 or self.rect.right >= SCREEN_RECT.width:
            self.rect.x -= self.speed_x
            self.rect.y -= self.speed_y

    def fire(self):
        print("发射子弹")
        for i in range(0, 3):

            # 1.创建子弹精灵
            bullet = Bullet()
            # 2.设置子弹精灵的位置
            bullet.rect.bottom = self.rect.y - i * 20
            bullet.rect.centerx = self.rect.centerx
            # 3.子弹加入到子弹精灵组
            self.bullets.add(bullet)


class Bullet(GameSprite):
    """
    子弹类
    """
    def __init__(self):
        # 调用父类方法设置子弹图片和位置
        super().__init__("images/bullet1.png", speed=-2)

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

    def __del__(self):
        print("子弹销毁")
相关推荐
stm 学习ing40 分钟前
FPGA 第十讲 避免latch的产生
c语言·开发语言·单片机·嵌入式硬件·fpga开发·fpga
湫ccc2 小时前
《Python基础》之字符串格式化输出
开发语言·python
mqiqe2 小时前
Python MySQL通过Binlog 获取变更记录 恢复数据
开发语言·python·mysql
AttackingLin2 小时前
2024强网杯--babyheap house of apple2解法
linux·开发语言·python
哭泣的眼泪4082 小时前
解析粗糙度仪在工业制造及材料科学和建筑工程领域的重要性
python·算法·django·virtualenv·pygame
Ysjt | 深3 小时前
C++多线程编程入门教程(优质版)
java·开发语言·jvm·c++
ephemerals__3 小时前
【c++丨STL】list模拟实现(附源码)
开发语言·c++·list
码农飞飞3 小时前
深入理解Rust的模式匹配
开发语言·后端·rust·模式匹配·解构·结构体和枚举