python笔记33 作业:飞机大战

该博客详细介绍了如何使用Python的Pygame库构建一个简单的飞机大战游戏。从创建游戏窗口、背景图片到实现玩家飞机的键盘控制移动,再到发射子弹和敌机的自动移动及随机发射子弹功能,博主逐步展示了游戏的实现过程。代码经过优化,实现了面向对象的设计,包括飞机和子弹的基类以及敌我飞机的子类,提高了代码的复用性和可维护性。
摘要由CSDN通过智能技术生成

复习内容:
在这里插入图片描述
python设计游戏的方法:
步骤:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
第一步:
搭建界面和键盘检测

plane pro需求描述
存在四个对象:
我放飞机 敌方飞机 我方子弹 敌方子弹
功能:
我方飞机可以移动[通过键盘来操作]
敌方飞机可以移动[随机的自动移动]
双方飞机都可以发送子弹
步骤:
创建一个窗口
创建一个我方 根据方向键左右的移动
给我方飞机添加发射子弹的功能[按下空格键去发送]
创建一个敌机 敌人飞机可以自由移动 还可以自动发射子弹

在这里插入图片描述

pygame是一个利用SDL库写的游戏库 安装库
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
库安装成功

在这里插入图片描述

# 显示背景图片
import pygame
from pygame.locals import *
def main():
    #     首先创建一个窗口 用来显示内容
    screen=pygame.display.set_mode((350,500))  #设置图片显示
    # 设定一个背景图片对象
    background=pygame.image.load('./飞机大战图片音乐素材/background.jpg')
    # 设定一个标题title
    pygame.display.set_caption('阶段总结 飞机游戏')
    #设定要显示的图片
    while True:
        screen.blit(background,(0,0)) #居中显示图片
        #更新显示的内容
        pygame.display.update()
    pass
main()

在这里插入图片描述

# 添加背景音乐
pygame.mixer.init()
pygame.mixer.music.load('./飞机大战图片音乐素材/music1.mp3')
pygame.mixer.music.set_volume((0.2))
pygame.mixer.music.play(-1)  #循环次数 -1表示无限循环
#设定要显示的图片
while True:
    screen.blit(background,(0,0)) #居中显示图片
    # 获取键盘事件
    eventlist=pygame.event.get()
    for event in eventlist:
        if event.type==QUIT:
            print('退出')
            exit()
            pass
        elif event.type==KEYDOWN:
            if event.type==K_a or event.key==K_LEFT:
                print('left')
            elif event.type==K_d or event.key==K_RIGHT:
                print('right')
            elif event.type==K_SPACE:
                print('space')
    #更新显示的内容
    pygame.display.update()
pass

实现图片显示,音乐,键盘控制功能

mport pygame
from pygame.locals import *

'''
1.实现飞机的显示 并且可以控制飞机的移动【面向对象】
'''
class HeroPlane(object):
    def __init__(self,screen):
        '''
        初始化函数
        主窗体对象 :param screen:
        '''
        # 飞机的默认位置
        self.x=150
        self.y=450
        # 设置要显示的窗口
        self.screen=screen
        # 生成飞机的图片对象
        self.image=pygame.image.load('./飞机大战图片音乐素材/ship.png')
        pass
    def moveleft(self):
        '''
        左移
        :return:
        '''
        if self.x>0:
            self.x-=10
        pass
    def moveright(self):
        '''
        右移
        :return:
        '''
        if self.x<350-40:
            self.x+=10
        pass
    def display(self):
        '''
        飞机主窗口处的显示
        :return:
        '''
        self.screen.blit(self.image,(self.x,self.y))
        pass
    pass

def key_control(HeroObj):
    '''
    定义普通的参数 实现键盘的检测
    :param HeroObj: 可检测的对象
    :return:
    '''

    eventlist = pygame.event.get()
    for event in eventlist:
        if event.type == QUIT:
            print('退出')
            exit()
            pass
        elif event.type == KEYDOWN:
            if event.type == K_a or event.key == K_LEFT:
                print('left')
                HeroObj.moveleft()
            elif event.type == K_d or event.key == K_RIGHT:
                print('right')
                HeroObj.moveright()
            elif event.type == K_SPACE:
                print('按下了空格键')
    # 更新显示的内容
    pygame.display.update()

def main():
    #     首先创建一个窗口 用来显示内容
    screen=pygame.display.set_mode((350,500),depth=32)  #设置图片显示
    # 设定一个背景图片对象
    background=pygame.image.load('./飞机大战图片音乐素材/background.jpg')
    # 设定一个标题title
    pygame.display.set_caption('阶段总结 飞机游戏')

    # 添加背景音乐
    pygame.mixer.init()
    pygame.mixer.music.load('./飞机大战图片音乐素材/music1.mp3')
    pygame.mixer.music.set_volume((0.2))
    pygame.mixer.music.play(-1)  #循环次数 -1表示无限循环
    # 创建一个飞机对象
    hero=HeroPlane(screen)

    #设定要显示的图片
    while True:
        screen.blit(background,(0,0)) #居中显示图片
        # 显示玩家飞机的图片
        hero.display()  #显示玩家图片
        # 获取键盘事件
        key_control(hero)
        #更新显示的内容
        pygame.display.update()
    pass
if __name__=='__main__':
    main()

在这里插入图片描述

在这里插入图片描述
继续完善代码
在这里插入图片描述
实现发射子弹功能

import pygame
from pygame.locals import *

'''
1.实现飞机的显示 并且可以控制飞机的移动【面向对象】
'''
class HeroPlane(object):
    def __init__(self,screen):
        '''
        初始化函数
        主窗体对象 :param screen:
        '''
        # 飞机的默认位置
        self.x=150
        self.y=450
        # 设置要显示的窗口
        self.screen=screen
        # 生成飞机的图片对象
        self.image=pygame.image.load('./飞机大战图片音乐素材/ship.png')
        # 用来存放子弹的列表
        self.bulletlist=[]
        pass
    def moveleft(self):
        '''
        左移
        :return:
        '''
        if self.x>0:
            self.x-=10
        pass
    def moveright(self):
        '''
        右移
        :return:
        '''
        if self.x<350-40:
            self.x+=10
        pass
    def display(self):
        '''
        飞机主窗口处的显示
        :return:
        '''
        self.screen.blit(self.image,(self.x,self.y))
        # 完善子弹的展示逻辑
        needDelItemLIst=[]
        for item in self.bulletlist:
            if item.judge():
                needDelItemLIst.append(item)
                pass
            pass
        # 重新遍历
        for i in needDelItemLIst:  #删除
            self.bulletlist.remove(i)
            pass
        for bullet in self.bulletlist:
            bullet.display()  #显示子弹的位置
            bullet.move() #移动子弹 下次在显示就会看到子弹再修改的位置了
        pass
    # 发射子弹
    def shebullet(self):
        # 创建一个新的子弹对象
        newBullet=Bullet(self.x,self.y,self.screen)
        self.bulletlist.append(newBullet)
        pass
    pass

'''
创建子弹类
'''
class Bullet(object):
    def __init__(self,x,y,screen):
        '''

        :param x:
        :param y:
        :param screen:
        '''
        self.x=x+13
        self.y=y-20
        self.screen=screen
        self.image=pygame.image.load('./飞机大战图片音乐素材/bullet1.png')
        pass
    def display(self):
        self.screen.blit(self.image,(self.x,self.y))
        pass
    def move(self):
        self.y-=1
        pass
    def judge(self):
        '''
        判断子弹是否越界
        :return:
        '''
        if self.y<0:
            return True
        else:
            return False
    pass

def key_control(HeroObj):
    '''
    定义普通的参数 实现键盘的检测
    :param HeroObj: 可检测的对象
    :return:
    '''
    eventlist = pygame.event.get()
    for event in eventlist:
        if event.type == QUIT:
            print('退出')
            exit()
            pass
        elif event.type == KEYDOWN:
            if event.type == K_a or event.key == K_LEFT:
                print('left')
                HeroObj.moveleft()
            elif event.type == K_d or event.key == K_RIGHT:
                print('right')
                HeroObj.moveright()
            elif event.key == K_SPACE:
                print('按下了空格键 space 发射子弹')
                HeroObj.shebullet()
    # 更新显示的内容
    pygame.display.update()

def main():
    #     首先创建一个窗口 用来显示内容
    screen=pygame.display.set_mode((350,500),depth=32)  #设置图片显示
    # 设定一个背景图片对象
    background=pygame.image.load('./飞机大战图片音乐素材/background.jpg')
    # 设定一个标题title
    pygame.display.set_caption('阶段总结 飞机游戏')

    # 添加背景音乐
    pygame.mixer.init()
    pygame.mixer.music.load('./飞机大战图片音乐素材/music1.mp3')
    pygame.mixer.music.set_volume((0.2))
    pygame.mixer.music.play(-1)  #循环次数 -1表示无限循环
    # 创建一个飞机对象
    hero=HeroPlane(screen)

    #设定要显示的图片
    while True:
        screen.blit(background,(0,0)) #居中显示图片
        # 显示玩家飞机的图片
        hero.display()  #显示玩家图片
        # 获取键盘事件
        key_control(hero)
        #更新显示的内容
        pygame.display.update()
    pass
if __name__=='__main__':
    main()

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
未优化版本 实现敌机发射子弹

import pygame
import random ##随机产生数据
import time
from pygame.locals import *

'''
1.实现飞机的显示 并且可以控制飞机的移动【面向对象】
'''
class HeroPlane(object):
    def __init__(self,screen):
        '''
        初始化函数
        主窗体对象 :param screen:
        '''
        # 飞机的默认位置
        self.x=150
        self.y=450
        # 设置要显示的窗口
        self.screen=screen
        # 生成飞机的图片对象
        self.image=pygame.image.load('./飞机大战图片音乐素材/ship.png')
        # 用来存放子弹的列表
        self.bulletlist=[]
        pass
    def moveleft(self):
        '''
        左移
        :return:
        '''
        if self.x>0:
            self.x-=10
        pass
    def moveright(self):
        '''
        右移
        :return:
        '''
        if self.x<350-40:
            self.x+=10
        pass
    def display(self):
        '''
        飞机主窗口处的显示
        :return:
        '''
        self.screen.blit(self.image,(self.x,self.y))
        # 完善子弹的展示逻辑
        needDelItemLIst=[]
        for item in self.bulletlist:
            if item.judge():
                needDelItemLIst.append(item)
                pass
            pass
        # 重新遍历
        for i in needDelItemLIst:  #删除
            self.bulletlist.remove(i)
            pass
        for bullet in self.bulletlist:
            bullet.display()  #显示子弹的位置
            bullet.move() #移动子弹 下次在显示就会看到子弹再修改的位置了
        pass
    # 发射子弹
    def shebullet(self):
        # 创建一个新的子弹对象
        newBullet=Bullet(self.x,self.y,self.screen)
        self.bulletlist.append(newBullet)
        pass
    pass

'''
创建子弹类
'''
class Bullet(object):
    def __init__(self,x,y,screen):
        '''

        :param x:
        :param y:
        :param screen:
        '''
        self.x=x+13
        self.y=y-20
        self.screen=screen
        self.image=pygame.image.load('./飞机大战图片音乐素材/bullet1.png')
        pass
    def display(self):
        self.screen.blit(self.image,(self.x,self.y))
        pass
    def move(self):
        self.y-=0.1
        pass
    def judge(self):
        '''
        判断子弹是否越界
        :return:
        '''
        if self.y<0:
            return True
        else:
            return False
    pass

# 创建敌机类
class EnemyPlane:
    def __init__(self,screen):
        # 默认设置一个方向 左右移动
        self.direction='right'
        self.x = 0
        self.y = 0
        # 设置要显示的窗口
        self.screen = screen
        self.bulletList=[]
        # 生成飞机的图片对象
        self.image = pygame.image.load('./飞机大战图片音乐素材/enemy.png')
    def display(self):
        '''
        显示敌机以及子弹位置的信息
        :return:
        '''
        self.screen.blit(self.image,(self.x,self.y))

        # 完善子弹的展示逻辑
        needDelItemLIst = []
        for item in self.bulletList:
            if item.judge():
                needDelItemLIst.append(item)
                pass
            pass
        # 重新遍历
        for i in needDelItemLIst:  # 删除
            self.bulletList.remove(i)
            pass
        for bullet in self.bulletList:
            bullet.display()  # 显示子弹的位置
            bullet.move()  # 移动子弹 下次在显示就会看到子弹再修改的位置了
        pass
    def sheBullet(self):
        '''
        敌机随机的发射子弹
        :return:
        '''
        num=random.randint(1,100)
        if num==3:
            newBullet=EnemyBullet(self.x,self.y,self.screen)
            self.bulletList.append(newBullet)
        pass
    def move(self):
        '''
        敌机移动 随机进行
        :return:
        '''
        if self.direction=='right':
            self.x+=0.05
            pass
        elif self.direction == 'left':
            self.x-=0.05
            pass
        if self.x>350-20:
            self.direction='left'
            pass
        elif self.x<0:
            self.direction='right'
        pass
    pass

# 敌机的子弹
class EnemyBullet(object):
    def __init__(self,x,y,screen):
        '''

        :param x:
        :param y:
        :param screen:
        '''
        self.x=x+13
        self.y=y+10
        self.screen=screen
        self.image=pygame.image.load('./飞机大战图片音乐素材/bullet1.png')
        pass
    def display(self):
        self.screen.blit(self.image,(self.x,self.y))
        pass
    def move(self):
        self.y+=2
        pass
    def judge(self):
        '''
        判断子弹是否越界
        :return:
        '''
        if self.y>500:
            return True
        else:
            return False
    pass

def key_control(HeroObj):
    '''
    定义普通的参数 实现键盘的检测
    :param HeroObj: 可检测的对象
    :return:
    '''
    eventlist = pygame.event.get()
    for event in eventlist:
        if event.type == QUIT:
            print('退出')
            exit()
            pass
        elif event.type == KEYDOWN:
            if event.type == K_a or event.key == K_LEFT:
                print('left')
                HeroObj.moveleft()
            elif event.type == K_d or event.key == K_RIGHT:
                print('right')
                HeroObj.moveright()
            elif event.key == K_SPACE:
                print('按下了空格键 space 发射子弹')
                HeroObj.shebullet()
    # 更新显示的内容
    pygame.display.update()

def main():
    #     首先创建一个窗口 用来显示内容
    screen=pygame.display.set_mode((350,500),depth=32)  #设置图片显示
    # 设定一个背景图片对象
    background=pygame.image.load('./飞机大战图片音乐素材/background.jpg')
    # 设定一个标题title
    pygame.display.set_caption('阶段总结 飞机游戏')

    # 添加背景音乐
    pygame.mixer.init()
    pygame.mixer.music.load('./飞机大战图片音乐素材/music1.mp3')
    pygame.mixer.music.set_volume((0.2))
    pygame.mixer.music.play(-1)  #循环次数 -1表示无限循环
    # 创建一个飞机对象
    hero=HeroPlane(screen)
    # 创建一个敌机对象
    enemyplane=EnemyPlane(screen)
    #设定要显示的图片
    while True:
        screen.blit(background,(0,0)) #居中显示图片
        # 显示玩家飞机的图片
        hero.display()  #显示玩家图片
        enemyplane.display() #敌机图片显示
        enemyplane.move()  #敌机移动
        enemyplane.sheBullet() #敌机随即发射子弹
        # 获取键盘事件
        key_control(hero)
        #更新显示的内容
        pygame.display.update()
        pygame.time.Clock().tick(100)  #pygame时钟一分钟刷新多少次
    pass
if __name__=='__main__':
    main()

在这里插入图片描述
代码优化完成

import pygame
import random ##随机产生数据
import time
from pygame.locals import *

'''
1.实现飞机的显示,并且可以控制飞机的移动【面向对象】
'''
# 抽象出一个飞机的基类
class BasePlane:
    def __init__(self,screen,imagePath):
        '''
        初始化基类函数
        :param screen: 主窗体对象
        :param imageName: 加载的图片
        '''
        self.screen=screen
        self.image=pygame.image.load(imagePath)
        self.bulletlist=[] #存储所有的子弹
        pass
    def display(self):
        self.screen.blit(self.image,(self.x,self.y))
        # 完善子弹的展示逻辑
        needDelItemLIst = []
        for item in self.bulletlist:
            if item.judge():
                needDelItemLIst.append(item)
                pass
            pass
        # 重新遍历
        for i in needDelItemLIst:  # 删除
            self.bulletlist.remove(i)
            pass
        for bullet in self.bulletlist:
            bullet.display()  # 显示子弹的位置
            bullet.move()  # 移动子弹 下次在显示就会看到子弹再修改的位置了
        pass

# 抽象出子弹的基类
class CommonBullet(object):
    '''
    公共的子弹类
    '''
    def __init__(self,x,y,screen,bulletType):
        self.type=bulletType
        self.screen=screen
        if self.type=='hero':
            self.x=x+20
            self.y=y-20
            self.imagePath='./飞机大战图片音乐素材/bullet1.png'
        elif self.type=='enemy':
            self.x = x
            self.y =y+10
            self.imagePath = './飞机大战图片音乐素材/bullet2.jpg'
            pass
        self.image=pygame.image.load(self.imagePath)
        pass
    def move(self):
        '''
        子弹的移动
        :return:
        '''
        if self.type=='hero':
            self.y-=2
        elif self.type=='enemy':
            self.y+=2
            pass
        pass
    def display(self):
        self.screen.blit(self.image,(self.x,self.y))
        pass
    def judge(self):
        '''
        判断子弹是否越界
        :return:
        '''
        if self.y>500 or self.y<0:
            return True
        else:
            return False
        pass

'''
1.实现飞机的显示 并且可以控制飞机的移动【面向对象】
'''
class HeroPlane(BasePlane):
    def __init__(self,screen):
        '''
        初始化函数
        主窗体对象 :param screen:
        '''
        super().__init__(screen,'./飞机大战图片音乐素材/ship.png')
        # 飞机的默认位置
        self.x=150
        self.y=450
        pass
    def moveleft(self):
        '''
        左移
        :return:
        '''
        if self.x>0:
            self.x-=10
        pass
    def moveright(self):
        '''
        右移
        :return:
        '''
        if self.x<350-40:
            self.x+=10
        pass
    # 发射子弹
    def shebullet(self):
        # 创建一个新的子弹对象
        newBullet=CommonBullet(self.x,self.y,self.screen,'hero')
        self.bulletlist.append(newBullet)
        pass
    pass

# 创建敌机类
class EnemyPlane(BasePlane):
    def __init__(self,screen):
        super().__init__(screen,'./飞机大战图片音乐素材/enemy.png')
        # 默认设置一个方向 左右移动
        self.direction='right'
        self.x = 0
        self.y = 0
    def sheBullet(self):
        '''
        敌机随机的发射子弹
        :return:
        '''
        num=random.randint(1,50)
        if num==3:
            newBullet=CommonBullet(self.x,self.y,self.screen,'enemy')
            self.bulletlist.append(newBullet)
        pass
    def move(self):
        '''
        敌机移动 随机进行
        :return:
        '''
        if self.direction=='right':
            self.x+=2
            pass
        elif self.direction == 'left':
            self.x-=2
            pass
        if self.x>350-20:
            self.direction='left'
            pass
        elif self.x<0:
            self.direction='right'
        pass
    pass

def key_control(HeroObj):
    '''
    定义普通的参数 实现键盘的检测
    :param HeroObj: 可检测的对象
    :return:
    '''
    eventlist = pygame.event.get()
    for event in eventlist:
        if event.type == QUIT:
            print('退出')
            exit()
            pass
        elif event.type == KEYDOWN:
            if event.type == K_a or event.key == K_LEFT:
                print('left')
                HeroObj.moveleft()
            elif event.type == K_d or event.key == K_RIGHT:
                print('right')
                HeroObj.moveright()
            elif event.key == K_SPACE:
                print('按下了空格键 space 发射子弹')
                HeroObj.shebullet()
    # 更新显示的内容
    pygame.display.update()

def main():
    #     首先创建一个窗口 用来显示内容
    screen=pygame.display.set_mode((350,500),depth=32)  #设置图片显示
    # 设定一个背景图片对象
    background=pygame.image.load('./飞机大战图片音乐素材/background.jpg')
    # 设定一个标题title
    pygame.display.set_caption('阶段总结 飞机游戏')

    # 添加背景音乐
    pygame.mixer.init()
    pygame.mixer.music.load('./飞机大战图片音乐素材/music1.mp3')
    pygame.mixer.music.set_volume((0.2))
    pygame.mixer.music.play(-1)  #循环次数 -1表示无限循环
    # 创建一个飞机对象
    hero=HeroPlane(screen)
    # 创建一个敌机对象
    enemyplane=EnemyPlane(screen)
    #设定要显示的图片
    while True:
        screen.blit(background,(0,0)) #居中显示图片
        # 显示玩家飞机的图片
        hero.display()  #显示玩家图片
        enemyplane.display() #敌机图片显示
        enemyplane.move()  #敌机移动
        enemyplane.sheBullet() #敌机随即发射子弹
        # 获取键盘事件
        key_control(hero)
        #更新显示的内容
        pygame.display.update()
        pygame.time.Clock().tick(100)  #pygame时钟一分钟刷新多少次
    pass
if __name__=='__main__':
    main()

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值