• python实践——飞机大战


    需求:   我方飞机,敌方飞机,我方子弹,敌方子弹

    功能:   我方飞机根据按键移动,敌方飞机也可以随机自动移动

        双方飞机都可以发送子弹

        背景音乐的添加

    步骤:

    创建一个窗口

    创建一个玩家飞机,根据方向键左右的移动

    给我方飞机添加发射子弹的功能【按空格键发送】

    创建一个敌人飞机,敌人飞机可以自由的移动

    敌人飞机可以自动的发射子弹

    import pygame
    from pygame.locals import *   ##导入所有东西
    
    def main ():
        screen=pygame.display.set_mode((700,400),0,32)    ##创建一个窗口
        backgrond=pygame.image.load('./feiji/background.jpg') #设定一个背景图
        pygame.display.set_caption('cz大战zwt')
        ###添加背景音乐
        pygame.mixer.init()
        pygame.mixer.music.load('./feiji/background.mp3')
        pygame.mixer.music.set_volume(0.2)  #设置音量
        pygame.mixer.music.play(-1)  ##无限循环
        ##载入玩家飞机图片
        zwt=pygame.image.load('./feiji/zwt.png')
        x,y=0,0
    
        while True:
            screen.blit(backgrond,(0,0))  ##居中显示背景图
            screen.blit(zwt, (x, y))  ##显示玩家zwt图片
            ##获取键盘事件
            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')
                        if x>0:
                            x-=30
                    elif event.type==K_d or event.key==K_RIGHT:
                        print('right')
                        if x<620:
                            x+=30
                    elif event.key == K_SPACE:
                        print('k_SPACE')
            pygame.display.update()  ##更新显示内容
        pass
    if __name__=='__main__':
        main()
    面向过程

    面向过程,代码臃肿,不易修改

    import  pygame
    import random
    import time
    from  pygame.locals import *
    '''
    实现飞机的显示,控制飞机的移动
    '''
    class HeroPlane(object):
        def __init__(self,screen):
            ##飞机的默认位置
            self.x=225
            self.y=510
            ##设置显示内容窗口
            self.screen=screen
            ##生成飞机的图片对象
            #elf.imageName='./feiji/zwt.png'
            self.image=pygame.image.load('./feiji/zwt.png')
            ##存放子弹列表
            self.bulletList=[]
            #self.image=pygame.image.load(self.imageName)
            pass
        def moveleft(self):
            if self.x>0:
                self.x-=30
            pass
        def moveright(self):
            if self.x<380:
                self.x+=30
            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)
            ###重新遍历
            for i in needDelItemList:
                self.bulletList.remove(i)
            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):
            self.x=x+13
            self.y=y-20
            self.screen=screen
            self.imgage=pygame.image.load('./feiji/Bullet.png')
            pass
        def display(self):
            self.screen.blit(self.imgage,(self.x,self.y))
        def move(self):
            self.y-=8
    
        def judge(self):
            ##判断子弹越界
            if self.y<0:
                return True
            else:
                return False
    ##敌人子弹
    class EnemyBullet(object):
        def __init__(self,x,y,screen):
            self.x=x
            self.y=y+60
            self.screen=screen
            self.imgage=pygame.image.load('./feiji/Bullet2.png')
            pass
        def display(self):
            self.screen.blit(self.imgage,(self.x,self.y))
        def move(self):
            self.y+=2
    
        def judge(self):
            ##判断子弹越界
            if self.y>550:
                return True
            else:
                return False
    
    ##创建敌人
    class EnemyPlane:
        def __init__(self, screen):
            ##m默认设置一个方向
            self.direction='right'
            ##飞机的默认位置
            self.x = 0
            self.y = 0
            ##设置显示内容窗口
            self.screen = screen
            ##生成飞机的图片对象
            # elf.imageName='./feiji/zwt.png'
            self.image = pygame.image.load('./feiji/cz.png')
            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)
            ###重新遍历
            for i in needDelItemList:
                self.bulletList.remove(i)
            for bullet in self.bulletList:
                bullet.display()  ##显示子弹的位置
                bullet.move()  ##让子弹进行移动,下次再显示的时候就会看到子弹修改后的位置
        def sheBullet(self):
            ###敌人随机发射子弹
            num=random.randint(1,20)
            if num==3:
                newBullet=EnemyBullet(self.x,self.y,self.screen)
                self.bulletList.append(newBullet)
        def move(self):
            ##随机移动
            if self.direction=='right':
                self.x+=2
            elif self.direction=='left':
                self.x-=2
    
            if self.x>410:
                self.direction='left'
            elif self.x<0:
                self.direction='right'
    ##控制键盘
    def key_control(HeroObj):
        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('k_SPACE')
                    HeroObj.sheBullet()
        pass
    ##主函数
    def main ():
        screen=pygame.display.set_mode((450,550),0,32)    ##创建一个窗口
        backgrond=pygame.image.load('./feiji/background.jpg') #设定一个背景图
        pygame.display.set_caption('cz大战zwt')
        ###添加背景音乐
        pygame.mixer.init()
        pygame.mixer.music.load('./feiji/background.mp3')
        pygame.mixer.music.set_volume(0.1)  #设置音量
        pygame.mixer.music.play(-1)  ##无限循环
        ##创建飞机对象
        hero=HeroPlane(screen)
        ##创建敌人
        enemyplane=EnemyPlane(screen)
        while True:
                screen.blit(backgrond,(0,0))  ##居中显示背景图
                hero.display()  ##显示我方飞机
                enemyplane.display() ##显示敌人
                enemyplane.move()##敌人移动
                enemyplane.sheBullet()##敌人发射子弹
                key_control(hero)
                pygame.display.update()  ##更新显示内容
                pygame.time.Clock().tick(15)##一秒执行多少次
    
    if __name__=='__main__':
        main()
    面向对象
    import  pygame
    import random
    import time
    from  pygame.locals import *
    
    ##抽象出来一个飞机的基类
    class BasePlane(object):
        def __init__(self,screen,imagePath):
            self.screen=screen
            self.image=pygame.image.load(imagePath)
            self.bulletList=[]
        def display(self):
            self.screen.blit(self.image, (self.x, self.y))
            ##完善子弹展示逻辑
            needDelItemList = []
            for item in self.bulletList:
                if item.judge():
                    needDelItemList.append(item)
            ###重新遍历
            for i in needDelItemList:
                self.bulletList.remove(i)
            for bullet in self.bulletList:
                bullet.display()  ##显示子弹的位置
                bullet.move()  ##让子弹进行移动,下次再显示的时候就会看到子弹修改后的位置
    class CommonBullet(object):
        def __init__(self,x,y,screen,bulletType):
            self.type=bulletType
            self.screen=screen
            if self.type=='hero':
                self.x=x+13
                self.y=y-20
                self.imagePath='./feiji/Bullet.png'
            elif self.type=='enemy':
                self.x=x
                self.y=y+60
                self.imagePath='./feiji/Bullet2.png'
            self.image=pygame.image.load(self.imagePath)
        def move(self):
            if self.type=='hero':
                self.y-=2
            elif self.type=='enemy':
                self.y+=2
        def display(self):
            self.screen.blit(self.image,(self.x,self.y))
        def judge(self):
            if self.y>550 or self.y<0:
                return True
            else:
                return False
    class HeroPlane(BasePlane):
        def __init__(self,screen):
            ##飞机的默认位置
            self.x=225
            self.y=510
            super().__init__(screen,'./feiji/zwt.png')
        def moveleft(self):
            if self.x>0:
                self.x-=30
            pass
        def moveright(self):
            if self.x<380:
                self.x+=30
            pass
        def sheBullet(self):
            newBullet=CommonBullet(self.x,self.y,self.screen,'hero')
            self.bulletList.append(newBullet)
            pass
    ##创建敌人
    class EnemyPlane(BasePlane):
        def __init__(self, screen):
            ##m默认设置一个方向
            self.direction='right'
            ##飞机的默认位置
            self.x = 0
            self.y = 0
            super().__init__(screen,'./feiji/cz.png')
            pass
        def sheBullet(self):
            ###敌人随机发射子弹
            num=random.randint(1,20)
            if num==3:
                newBullet=CommonBullet(self.x,self.y,self.screen,'enemy')
                self.bulletList.append(newBullet)
        def move(self):
            ##随机移动
            if self.direction=='right':
                self.x+=2
            elif self.direction=='left':
                self.x-=2
    
            if self.x>410:
                self.direction='left'
            elif self.x<0:
                self.direction='right'
    def key_control(HeroObj):
        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('k_SPACE')
                    HeroObj.sheBullet()
        pass
    def main ():
        screen=pygame.display.set_mode((450,550),0,32)    ##创建一个窗口
        backgrond=pygame.image.load('./feiji/background.jpg') #设定一个背景图
        pygame.display.set_caption('cz大战zwt')
        ###添加背景音乐
        pygame.mixer.init()
        pygame.mixer.music.load('./feiji/background.mp3')
        pygame.mixer.music.set_volume(0.1)  #设置音量
        pygame.mixer.music.play(-1)  ##无限循环
        ##创建飞机对象
        hero=HeroPlane(screen)
        ##创建敌人
        enemyplane=EnemyPlane(screen)
        while True:
                screen.blit(backgrond,(0,0))  ##居中显示背景图
                hero.display()  ##显示我方飞机
                enemyplane.display() ##显示敌人
                enemyplane.move()##敌人移动
                enemyplane.sheBullet()##敌人发射子弹
                key_control(hero)
                pygame.display.update()  ##更新显示内容
                pygame.time.Clock().tick(15)##一秒执行多少次
    
    if __name__=='__main__':
        main()
    优化结构后
  • 相关阅读:
    java学习之成员内部类
    上海 炉石面试题及解析
    利用RALL机制来事项String类的赋值操作
    关于信号打断正在读取终端的read与select来监视0文件描述符的问题
    ubuntu16.04开机花屏蓝屏解决方案
    gcc 中__thread 关键字的示例代码
    成长、责任和公司的关系
    团队贡献分
    团队如何做决定
    分析app的NABCD
  • 原文地址:https://www.cnblogs.com/yilia-er/p/14107895.html
Copyright © 2020-2023  润新知