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()
优化结构后
原文地址:https://www.cnblogs.com/yilia-er/p/14107895.html