python基础之——飞机大战

本文详细介绍了一个基于Python的飞机大战游戏开发过程,利用Pygame库创建游戏界面,实现玩家控制的飞机与敌机的互动,包括敌机的随机生成、子弹的发射及碰撞检测等关键功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

""""
飞机大战
"""
import pygame
import pygame.locals  # 导入pygame本地策略# 窗体的状态返回值# 例如QUIT等
# from pygame.locals import *
import sys  # 导入系统模块

import random



# 图片地址,不变
APP_ICON = "res/app.jpg"  # 图标
IMG_BACKGROUND = "res/background.png"   # 游戏背景
# IMG_ENMY = 'res/enemy1.png'
IMG_ENEMYS = ('res/enemy1.png', 'res/enemy2.png', 'res/enemy3_n1.png', 'res/enemy3_n2.png')  # 敌机元组

IMG_PLAYER = 'res/me1.png'   # 本机

IMG_BULLET = 'res/bullet2.png'  # 子弹类

# 创建所有显示图形的父类Model
class Model:
    window = None
    def __init__(self, img_path, x, y):
        self.img = pygame.image.load (img_path)
        self.x = x
        self.y = y
    # 将模型window抽取到Model中
    def display(self):
        Model.window.blit ( self.img, (self.x, self.y) )  # 添加要显示再在窗体中的图片

# 背景类
class Background(Model):
    def mov(self):  # 背景移动
        if self.y <= Game.WINDOW_HEIGHT:
            self.y += 1 # TODO 纵坐标加一
        else:
            self.y = 0

    def display(self):
        Model.window.blit ( self.img, (self.x, self.y) )  # 添加要显示再在窗体中的图片
        Model.window.blit ( self.img, (self.x, self.y-Game.WINDOW_HEIGHT) )  # 在图片的正上方再添加一个一样的图片,视觉效果上不断层


#  2.玩家类
class PlayerPlane(Model):
    def __init__(self, img_path, x, y):
        super().__init__(img_path, x, y)  # 调用父类的构造函数
        self.bullets = []  # 子弹列表

    def display(self, enemys):
        # TODO 显示敌机
        super().display()
        remove_bullets= []
        for bullet in self.bullets:
            bullet.move()
            bullet.display() # 依次调用子弹的显示

            if self.y < 0-11 :
                remove_bullets.append(bullet) # 超出屏幕移进删除

            else:
                bullet_rect = pygame.locals.Rect( bullet.x, bullet.y, 5, 11 ) # TODO 画方框,粗略的碰撞检测 
            # TODO 使用子弹做外层循环,敌机做内层循环,以此来碰撞检测
                for enemy in enemys:# 碰撞检测
                    enemy_rect = pygame.locals.Rect(enemy.x, enemy.y, 100, 200)  # TODO 此处的框有问题,应该写个判断,根据敌机的不同来改变方框的大小
                    if pygame.Rect.colliderect(bullet_rect, enemy_rect): # 碰撞检测
                        enemy.img = pygame.image.load( IMG_ENEMYS[random.randint( 0, 3 )] )  # TODO 碰撞后就在敌机元组里随机
                        enemy.x = random.randint( 0, Game.WINDOW_WIDTH - 57 )  # 出现的位置
                        enemy.y = random.randint( -Game.WINDOW_HEIGHT, -43 )
                        remove_bullets.append(bullet)       # TODO 如果子弹碰到敌机泽删除
                        break


        for bullet in remove_bullets:
            self.bullets.remove(bullet)  # 依次释放子弹





#  3.敌机类
class EnemyPlane(Model):
    def __init__(self):
        self.img = pygame.image.load( IMG_ENEMYS[random.randint(0, 3)] ) # 随机出现敌机
        self.x = random.randint( 0, Game.WINDOW_WIDTH - 57 )
        self.y = random.randint( -Game.WINDOW_HEIGHT, -43 )




    def move(self):  # 敌机移动方法
        if self.y <= Game.WINDOW_HEIGHT:
            self.y += 4 # TODO 纵坐标加一
        else:
            # self.y = 0 - 43
            self.img = pygame.image.load( IMG_ENEMYS[random.randint( 0, 3 )] )
            self.x = random.randint( 0, Game.WINDOW_WIDTH - 57 )  # 每次返回都随机出现横纵变化
            self.y = random.randint( -Game.WINDOW_HEIGHT, -43 )


#  4.子弹类
class Bullet(Model):
    def move(self):   # TODO 子弹移动方法
        self.y -= 7   # 子弹速度


#  5.游戏类
class Game: 
    WINDOW_WIDTH = 480   # 窗体大小
    WINDOW_HEIGHT = 700  # 不会改变,用此表示

    # 1.主程序的入口
    def run(self):

        self.frame_init ()  # 4.执行初始化窗体
        self.model_init ()  # 初始化背景
        while True:
            self.background.mov()  # TODO 4.调用背景移动操作
            self.background.display()   # TODO 5.把移动后的图片加入窗体
            """
            self.enmy.move()
            self.enmy.display()
            """

            for enemy in self.enemys:
                enemy.move()
                enemy.display()

            self.player.display(self.enemys)
            pygame.display.update ()  # 刷新窗体
            self.event_init ()

    # 3.初始化窗体
    def frame_init(self):
        # self.window = pygame.display.set_mode ((480, 640))
        self.window = pygame.display.set_mode ((Game.WINDOW_WIDTH, Game.WINDOW_HEIGHT))  #
        # self.window = pygame.display.set_mode ((536, 1162))  # 小周 扩大变量范围
        Model.window = self.window
        # 窗口大小
        img = pygame.image.load (APP_ICON)  # 1.加载图标文件作为图标对象
        pygame.display.set_icon (img)  # 2.设置窗体图标为图片
        pygame.display.set_caption ("是我,你蝶打飞机")  # 3.设置窗体的标题

    def event_init(self):  # 1.定义事件处理的方法
        for event in pygame.event.get ():  # 当前窗体的事件,返回的一个List[]
            if event.type == pygame.locals.QUIT:  # 检测是否
                # if event.type == QUIT:  # 检测是否,导包不同,调用不同
                sys.exit()

            if event.type == pygame.locals.MOUSEMOTION : # TODO 设置监听鼠标
                pos = pygame.mouse.get_pos()  # TODO 获取坐标(元组)
                self.player.x = pos[0] - 51
                self.player.y = pos[1] - 58

        mouse_state = pygame.mouse.get_pressed()  # 获得鼠标状态(元组)(左,中,右)
        if mouse_state[0] == 1:  # TODO 使用左键发射子弹
            pos = pygame.mouse.get_pos()
            self.player.bullets.append(Bullet(IMG_BULLET,pos[0]-1.9, pos[1] - 60))

    def model_init(self):

        self.background = Background (IMG_BACKGROUND, 0, 0) # TODO 使用大写来表示变量的抽取 # 元组
      #  self.background.display()
      #  self.enmy = EnemyPlane(IMG_ENMY, 200,200)
        self.enemys = []
        for _ in range(5):
            self.enemys.append(EnemyPlane())
            """
            self.enemys.append(EnemyPlane(IMG_ENMY, random.randint(0,Game.WINDOW_WIDTH-57), random.randint(-Game.WINDOW_HEIGHT,-43)))
            """
        self.player = PlayerPlane(IMG_PLAYER, 200, 550)



# 2.设置测试类入口操作
if __name__ == "__main__":  # 如果当前的程序等于__main__就运行
    Game ().run ()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值