栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

python笔记33 作业:飞机大战

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

python笔记33 作业:飞机大战

复习内容:

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()

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/325805.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号