飞机大战boss入场代码_1.3 Python飞机大战之代码优化

56dadd63544d28da4b264f752b48f62e.png

木 头 课 堂

a56f3d801a53612e8a711b17c4f793fb.png

小 木 前 言

上一章节我们完成了敌机移动的操作,下面这章节我们继续让敌机也可以发射子弹,并完成整体代码的优化,抽象出基类操作。

a56f3d801a53612e8a711b17c4f793fb.png

小 木 正 文

——————————————

❶敌机发射子弹

——————————————

#-*- coding:utf-8 -*-##-------------------------------------------------------------------------#ProjectName:       Python2020#FileName:          fly-敌机发射子弹.py#Author:            mutou#Date:              2020/8/12 18:23#Description:#--------------------------------------------------------------------------import pygamefrom pygame.locals import *import timeimport random'''    9. 让敌机发射子弹'''class HeroPlane(object):    def __init__(self,screen):        #设置飞机默认的位置        self.x = 230        self.y = 700        #设置要显示内容的窗口        self.screen = screen        self.imageName = "hero.png"        self.image = pygame.image.load(self.imageName).convert()        #用来存储英雄飞机发射的所有子弹        self.bulletList = []    def display(self):        self.screen.blit(self.image,(self.x,self.y))        #判断一下子弹的位置是否越界,如果是,那么就要删除这颗子弹        #        #这种方法会漏掉很多需要删除的数据        # for i in self.bulletList:        #     if i.y<0:        #         self.bulletList.remove(i)        #用来存放需要删除的对象引用        needDelItemList = []        #保存需要删除的对象        for i in self.bulletList:            if i.judge():                needDelItemList.append(i)        #删除self.bulletList中需要删除的对象        for i in needDelItemList:            self.bulletList.remove(i)        #因为needDelItemList也保存了刚刚删除的对象的引用,所以可以删除整个列表,那么        #整个列表中的引用就不存在了,也可以不调用下面的代码,因为needDelItemList是局部变量        #当这个方法的调用结束时,这个局部变量也就不存在了        # del needDelItemList        for bullet in self.bulletList:            bullet.display()#显示一个子弹的位置            bullet.move()#让这个子弹进行移动,下次再显示的时候就会看到子弹在修改后的位置    def moveLeft(self):        self.x -= 10    def moveRight(self):        self.x += 10    def sheBullet(self):        newBullet = Bullet(self.x, self.y, self.screen)        self.bulletList.append(newBullet)class Bullet(object):    def __init__(self,x,y,screen):        self.x = x+40        self.y = y-20        self.screen = screen        self.image = pygame.image.load("buttle.png").convert()    def move(self):        self.y -= 5    def display(self):        self.screen.blit(self.image,(self.x,self.y))    def judge(self):        if self.y<0:            return True        else:            return Falseclass EnemyPlane(object):    def __init__(self,screen):        #设置飞机默认的位置        self.x = 0        self.y = 0        #设置要显示内容的窗口        self.screen = screen        self.imageName = "em.png"        self.image = pygame.image.load(self.imageName).convert()        self.direction = "right"        #用来存储敌人飞机发射的所有子弹        self.bulletList = []    def display(self):        self.screen.blit(self.image,(self.x,self.y))        #判断一下子弹的位置是否越界,如果是,那么就要删除这颗子弹        #        #这种方法会漏掉很多需要删除的数据        # for i in self.bulletList:        #     if i.y<0:        #         self.bulletList.remove(i)        #存放需要删除的对象信息        needDelItemList = []        for i in self.bulletList:            if i.judge():                needDelItemList.append(i)        for i in needDelItemList:            self.bulletList.remove(i)        # del needDelItemList        #更新及这架飞机发射出的所有子弹的位置        for bullet in self.bulletList:            bullet.display()            bullet.move()    def move(self):        #如果碰到了右边的边界,那么就往左走,如果碰到了左边的边界,那么就往右走        if self.direction == "right":            self.x += 4        elif self.direction == "left":            self.x -= 4        if self.x>480-50:            self.direction = "left"        elif self.x<0:            self.direction = "right"    def sheBullet(self):        num = random.randint(1,100)        if num == 88:            newBullet = EnemyBullet(self.x,self.y,self.screen)            self.bulletList.append(newBullet)class EnemyBullet(object):    def __init__(self,x,y,screen):        self.x = x+30        self.y = y+30        self.screen = screen        self.image = pygame.image.load("buttle.png").convert()    def move(self):        self.y += 4    def display(self):        self.screen.blit(self.image,(self.x,self.y))    def judge(self):        if self.y>852:            return True        else:            return Falsedef key_control(heroPlane):    #判断是否是点击了退出按钮    for event in pygame.event.get():        # print(event.type)        if event.type == QUIT:            print("exit")            exit()        elif event.type == KEYDOWN:            if event.key == K_a or event.key == K_LEFT:                print('left')                heroPlane.moveLeft()                #控制飞机让其向左移动            elif event.key == K_d or event.key == K_RIGHT:                print('right')                heroPlane.moveRight()            elif event.key == K_SPACE:                print('space')                heroPlane.sheBullet()def main():    #1. 创建一个窗口,用来显示内容    screen = pygame.display.set_mode((480,852),0,32)    #2. 创建一个和窗口大小的图片,用来充当背景    background = pygame.image.load("background.jfif").convert()    #3.1 创建一个飞机对象    heroPlane = HeroPlane(screen)    #3.2 创建一个敌人飞机    enemyPlane = EnemyPlane(screen)    #4. 把背景图片放到窗口中显示    while True:        screen.blit(background,(0,0))        heroPlane.display()        enemyPlane.move()        enemyPlane.display()        enemyPlane.sheBullet()        key_control(heroPlane)        pygame.display.update()        #通过延时的方式,来降低这个while循环的循环速度,从而降低了cpu占用率        time.sleep(0.01)if __name__ == "__main__":    main()
执行后的效果如下,当然我现在敌机的子弹与主机的子弹使用同一图片素材,大家自己替换吧,实在不愿意找素材,小编太懒了~~~

e2679561302a11491e45767689913226.gif

——————————————

❷代码优化-抽象出基类

——————————————

#-*- coding:utf-8 -*-##-------------------------------------------------------------------------#ProjectName:       Python2020#FileName:          fly-抽出基类.py#Author:            mutou#Date:              2020/8/12 18:26#Description:#--------------------------------------------------------------------------import pygamefrom pygame.locals import *import timeimport random'''    代码优化:抽出基类'''class Plane(object):    def __init__(self, screen, imageName):        #设置要显示内容的窗口        self.screen = screen        self.image = pygame.image.load(imageName).convert()        #用来存储英雄飞机发射的所有子弹        self.bulletList = []    def display(self):        self.screen.blit(self.image,(self.x,self.y))        #用来存放需要删除的对象引用        needDelItemList = []        #保存需要删除的对象        for i in self.bulletList:            if i.judge():                needDelItemList.append(i)        #删除self.bulletList中需要删除的对象        for i in needDelItemList:            self.bulletList.remove(i)        for bullet in self.bulletList:            bullet.display()#显示一个子弹的位置            bullet.move()#让这个子弹进行移动,下次再显示的时候就会看到子弹在修改后的位置class HeroPlane(Plane):    def __init__(self, screen):        super(HeroPlane, self).__init__(screen, "hero.png")        #设置飞机默认的位置        self.x = 230        self.y = 700    def moveLeft(self):        self.x -= 10    def moveRight(self):        self.x += 10    def sheBullet(self):        newBullet = Bullet(self.x, self.y, self.screen, "hero")        self.bulletList.append(newBullet)class EnemyPlane(Plane):    def __init__(self, screen):        super(EnemyPlane, self).__init__(screen, "em.png")        #设置飞机默认的位置        self.x = 0        self.y = 0        self.direction = "right"    def move(self):        #如果碰到了右边的边界,那么就往左走,如果碰到了左边的边界,那么就往右走        if self.direction == "right":            self.x += 4        elif self.direction == "left":            self.x -= 4        if self.x>480-50:            self.direction = "left"        elif self.x<0:            self.direction = "right"    def sheBullet(self):        num = random.randint(1,100)        if num == 88:            newBullet = Bullet(self.x,self.y,self.screen, "enemy")            self.bulletList.append(newBullet)class Bullet(object):    def __init__(self,x,y,screen,planeName):        self.name = planeName        self.screen = screen        if self.name == "hero":            self.x = x+40            self.y = y-20            imageName = "buttle.png"        elif self.name == "enemy":            self.x = x+30            self.y = y+30            imageName = "buttle.png"        self.image = pygame.image.load(imageName).convert()    def move(self):        if self.name == "hero":            self.y -= 4        elif self.name == "enemy":            self.y += 4    def display(self):        self.screen.blit(self.image,(self.x,self.y))    def judge(self):        if self.y>852 or self.y<0:            return True        else:            return Falsedef key_control(heroPlane):    #判断是否是点击了退出按钮    for event in pygame.event.get():        # print(event.type)        if event.type == QUIT:            print("exit")            exit()        elif event.type == KEYDOWN:            if event.key == K_a or event.key == K_LEFT:                print('left')                heroPlane.moveLeft()                #控制飞机让其向左移动            elif event.key == K_d or event.key == K_RIGHT:                print('right')                heroPlane.moveRight()            elif event.key == K_SPACE:                print('space')                heroPlane.sheBullet()def main():    #1. 创建一个窗口,用来显示内容    screen = pygame.display.set_mode((480,852),0,32)    #2. 创建一个和窗口大小的图片,用来充当背景    background = pygame.image.load("background.jfif").convert()    #3.1 创建一个飞机对象    heroPlane = HeroPlane(screen)    #3.2 创建一个敌人飞机    enemyPlane = EnemyPlane(screen)    #4. 把背景图片放到窗口中显示    while True:        screen.blit(background,(0,0))        heroPlane.display()        enemyPlane.move()        enemyPlane.display()        enemyPlane.sheBullet()        key_control(heroPlane)        pygame.display.update()        #通过延时的方式,来降低这个while循环的循环速度,从而降低了cpu占用率        time.sleep(0.01)if __name__ == "__main__":    main()
大家可以对比没有抽出基类之前的代码和抽出基类的代码,有没有发现,面向对象进行管理代码以及实现功能更加的灵活,更加的好用。所以大家还是要理解面向对象的思想哦。当然这个还没写敌机中弹的效果,大家可以尝试完成此功能哦~~~

a56f3d801a53612e8a711b17c4f793fb.png

无  成 本 赞 赏

生活不易,还请小伙伴多多支持889db0f2e0742b449ec45671627a7fff.png889db0f2e0742b449ec45671627a7fff.png889db0f2e0742b449ec45671627a7fff.png,顺手给小编加个鸡腿,万分感谢~~~

END

— — — — — — — — — — — — —

 82bf2ebecf2fe22fa7cb4c60188e7ea5.png

更多信息,扫码关注我们哦!

9c5aa3a994fb0604ba971698b7c1f48e.gif

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值