开发步骤:
1.创建一个窗口
2.创建我方飞机 根据方向键左右移动
3.给我方飞机天机发射子弹功能【空格键】
4.创建敌方飞机
5.敌方飞机随机移动且发射子弹

开发工具包–pygame

python飞机大战的文档介绍 python飞机大战功能介绍_显示图片


python飞机大战的文档介绍 python飞机大战功能介绍_显示图片_02

导包:

import pygame#导包
				from pygame.locals import *
  1. 搭建界面与键盘检测 :
#首先创建一个窗口,用来显示内容
    screen = pygame.display.set_mode((350,500))
    #设定背景图片对象
    background = pygame.image.load('./Plane/bg.jpg')
    #设置一个title
    pygame.display.set_caption('飞机大战')
    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.key == K_a or event.key==K_LEFT:
                    print('left')
                elif event.key==K_d or event.key==K_RIGHT:
                    print('right')
                elif event.key==K_SPACE:
                    print('shoot')
        #更新显示内容
        pygame.display.update()
        pass
  1. 添加背景音乐
#添加背景音乐
    pygame.mixer.init()
    pygame.mixer.music.load('./Plane/bgm.mp3')
    pygame.mixer.music.set_volume(0.2)#设置音乐  0-1
    pygame.mixer.music.play(-1)#设置循环播放,-1表示无限循环

3.创建飞机类,子弹类,键盘方法

#子弹类
class Bullet(object):
    def __init__(self,x,y,screen):
        self.x = x+13
        self.y = y-20
        self.screen = screen
        self.image = pygame.image.load('./Plane/bullet.JPG')
        pass
    def display(self):
        self.screen.blit(self.image,(self.x,self.y))
        pass
    def move(self):
        self.y-=2
        pass
    def judge(self):
        #判断子弹是否越界
        if self.y<0:
            return True
        else:
            return False
    pass
#飞机类
class HeroPlane(object):
    def __init__(self,screen):
        #飞机的默认位置
        self.x = 150
        self.y = 450
        #设置要显示内容的窗口
        self.screen = screen
        #生成飞机图片对象
        self.imageName = './Plane/hero.JPG'
        self.image = pygame.image.load(self.imageName)
        #用来存放子弹的列表
        self.bullet=[]
        pass
    def display(self):
        self.screen.blit(self.image,(self.x,self.y))
        #完善子弹逻辑,若子弹越界则删除对应子弹
        DeleteItem = []
        for item in self.bullet:
            if item.judge():
                DeleteItem.append(item)
                pass
            pass
        for i in DeleteItem:
            self.bullet.remove(i)#删除
            pass
        #删除后,重新展示没有越界的子弹
        for j in self.bullet:
            j.display()#显示子弹
            j.move()#子弹移动

    def moveleft(self):
        if self.x>0:
            self.x-=10
            pass
    def moveright(self):
        if self.x<350-40:
            self.x+=10
    def movedown(self):
        if self.y<460:
            self.y+=15
    def moveup(self):
        if self.y>60:
            self.y-=15
    def shoot(self):
        newBullet = Bullet(self.x,self.y,self.screen)
        #把新发射子弹装到列表中
        self.bullet.append(newBullet)
        pass
    pass
#键盘方法
#键盘控制检查方法
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.key == K_a or event.key == K_LEFT:
                print('left')
                # 左移
                HeroObj.moveleft()
                pass
            elif event.key == K_d or event.key == K_RIGHT:
                print('right')
                # 右移
                HeroObj.moveright()
                pass
            elif event.key == K_s or event.key==K_DOWN:
                print('down')
                HeroObj.movedown()
            elif event.key == K_w or event.key==K_UP:
                print('up')
                HeroObj.moveup()
            elif event.key == K_SPACE:
                print('shoot')
                HeroObj.shoot()

4.显示敌机

#敌机类
class EnemyPlane(basePlane):
    def __init__(self,screen):
        #默认设置方向给予敌机移动
        self.direction = 'right'
        # 飞机的默认位置
        self.x = 0
        self.y = 0

        super().__init__(screen,'./Plane/enemy.JPG')
        pass
    def shoot(self):
        #敌机随机发射子弹
        num = random.randint(1,100)
        if num==3:
            newBullet = EnemyBullet(self.x,self.y,self.screen)
            self.bullet.append(newBullet)
            pass
    def move(self):
        if self.direction == 'right':
            self.x+=1
            pass
        elif self.direction == 'left':
            self.x -= 1
            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):
        self.x = x+6
        self.y = y+20
        self.screen = screen
        self.image = pygame.image.load('./Plane/bullet2.JPG')
        pass
    def display(self):
        self.screen.blit(self.image,(self.x,self.y))
        pass
    def move(self):
        self.y+=1
        pass
    def judge(self):
        #判断子弹是否越界
        if self.y>500:
            return True
        else:
            return False
    pass

5.完整代码

import pygame#导包
from pygame.locals import *
import random
import time

#键盘控制检查方法
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.key == K_a or event.key == K_LEFT:
                print('left')
                # 左移
                HeroObj.moveleft()
                pass
            elif event.key == K_d or event.key == K_RIGHT:
                print('right')
                # 右移
                HeroObj.moveright()
                pass
            elif event.key == K_s or event.key==K_DOWN:
                print('down')
                HeroObj.movedown()
            elif event.key == K_w or event.key==K_UP:
                print('up')
                HeroObj.moveup()
            elif event.key == K_SPACE:
                print('shoot')
                HeroObj.shoot()

#抽象出来一个飞机的基类
class basePlane(object):
    def __init__(self,screen,imagePath):
        self.screen = screen
        self.image = pygame.image.load(imagePath)
        self.bullet = []
        pass
    def display(self):
        self.screen.blit(self.image, (self.x, self.y))
        # 完善子弹逻辑,若子弹越界则删除对应子弹
        DeleteItem = []
        for item in self.bullet:
            if item.judge():
                DeleteItem.append(item)
                pass
            pass
        for i in DeleteItem:
            self.bullet.remove(i)  # 删除
            pass
        # 删除后,重新展示没有越界的子弹
        for j in self.bullet:
            j.display()  # 显示子弹
            j.move()  # 子弹移动
        pass



class HeroPlane(basePlane):
    def __init__(self,screen):

        # 调用父类的构造函数
        super().__init__(screen, './Plane/hero.JPG')

        #飞机的默认位置
        self.x = 150
        self.y = 450


        pass

    def moveleft(self):
        if self.x>0:
            self.x-=10
            pass
    def moveright(self):
        if self.x<350-40:
            self.x+=10
    def movedown(self):
        if self.y<460:
            self.y+=15
    def moveup(self):
        if self.y>60:
            self.y-=15
    def shoot(self):
        newBullet = Bullet(self.x,self.y,self.screen)
        #把新发射子弹装到列表中
        self.bullet.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.image = pygame.image.load('./Plane/bullet.JPG')
        pass
    def display(self):
        self.screen.blit(self.image,(self.x,self.y))
        pass
    def move(self):
        self.y-=2
        pass
    def judge(self):
        #判断子弹是否越界
        if self.y<0:
            return True
        else:
            return False
    pass

#敌机类
class EnemyPlane(basePlane):
    def __init__(self,screen):
        #默认设置方向给予敌机移动
        self.direction = 'right'
        # 飞机的默认位置
        self.x = 0
        self.y = 0

        super().__init__(screen,'./Plane/enemy.JPG')
        pass
    def shoot(self):
        #敌机随机发射子弹
        num = random.randint(1,100)
        if num==3:
            newBullet = EnemyBullet(self.x,self.y,self.screen)
            self.bullet.append(newBullet)
            pass
    def move(self):
        if self.direction == 'right':
            self.x+=1
            pass
        elif self.direction == 'left':
            self.x -= 1
            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):
        self.x = x+6
        self.y = y+20
        self.screen = screen
        self.image = pygame.image.load('./Plane/bullet2.JPG')
        pass
    def display(self):
        self.screen.blit(self.image,(self.x,self.y))
        pass
    def move(self):
        self.y+=1
        pass
    def judge(self):
        #判断子弹是否越界
        if self.y>500:
            return True
        else:
            return False
    pass



def main():
    #首先创建一个窗口,用来显示内容
    screen = pygame.display.set_mode((350,500))
    #设定背景图片对象
    background = pygame.image.load('./Plane/bg.jpg')
    #设置一个title
    pygame.display.set_caption('飞机大战')
    #添加背景音乐
    pygame.mixer.init()
    pygame.mixer.music.load('./Plane/bgm.mp3')
    pygame.mixer.music.set_volume(0.2)#设置音乐  0-1
    pygame.mixer.music.play(-1)#设置循环播放,-1表示无限循环

    #创建飞机对象
    hero = HeroPlane(screen)
    enemy = EnemyPlane(screen)


    while True:
        #设定要显示的内容
        screen.blit(background,(0,0))#显示图片
        hero.display()
        enemy.display()
        enemy.move()
        enemy.shoot()
        #获取键盘事件
        key_control(hero)

        #更新显示内容
        pygame.display.update()


        pass
    pass

main()