Python飞机大战

需求的描述:

存在四个对象:
我方飞机、敌方飞机、我方子弹、敌方子弹
功能:

背景音乐的添加

我方飞机可以移动【根据按键来控制的】
敌方飞机也可以移动【随机的自动移动】

双方飞机都可以发送子弹

步骤:
1.创建一个窗口
2.创建一个我方飞机 根据方向键左右的移动
3.给我方飞机添加发射子弹的功能【按下空格键去发送】
4.创建一个敌人飞机
5.敌人飞机可以自由的移动
6.敌人飞机可以自动的发射子弹

安装pygame过程中,使用命令pip install pygame -i Simple Index --trusted-host pypi.douban.com

问题:在安装第三方库时出现报错"These Packages Do Not Match The Hashes From The Requirements File."

原因:通常是因为网速问题导致的下载错误,导致对应的哈希值不匹配。

1.搭建界面

import pygame
from pygame import *


## *表示导入包里面所有的内容(方法/属性等)
def main():
    # 首先创建一个窗口来显示内容
    screen = pygame.display.set_mode((350, 500),depth=32)
    # 设定一个背景图片对象
    background = pygame.image.load('./feiji/background.png')
    ##设定要显示的内容
    while True:
        screen.blit(background, (0, 0))
        ##(0,0)表示窗口位置居中
        pygame.display.update()
        ##更新显示内容
    pass
if __name__=='__main__': ##
    main()

2.键盘检测

def main():
    # 首先创建一个窗口来显示内容
    screen = pygame.display.set_mode((350, 500), depth=32)
    # 设定一个背景图片对象
    background = pygame.image.load('./feiji/background.png')
    ##设定要显示的内容
    ##设置一个标题title
    pygame.mixer.init()
    pygame.mixer.music.load('./feiji/background.mp3')
    pygame.mixer.music.set_volume(0.2) ##设置音量大小
    pygame.mixer.music.play(-1) ##-1表示循环播放音乐
    ##载入玩家的飞机图片
    hero=pygame.image.load('./feiji.png')
    #初始化玩家的位置
    x,y=0,0
    while True:
        screen.blit(background,(0,0))
        ##显示玩家飞机的图片
        screen.blit(hero,(x,y))
        #显示玩家飞机的位置
        screen.blit(background, (0, 0))
        ##(0,0)表示窗口位置居中
        eventList = pygame.event.get()
        for event in eventList:
            if event.type == QUIT:
                print('退出')
                exit()
            elif event.type == KEYDOWN:
                if event.type == K_a or event.type == K_LEFT:
                    print('左键')
                elif event.type == K_d or event.type == K_RIGHT:
                    print('右键')
                    pass
                elif event.key == K_SPACE:
                    print('空格键')

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

接下来,通过面向对象来实现程序。

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.imageName='./feiji/hero.png'
        self.image=pygame.image.load(self.imageName)
        # 用来存放子弹的列表
        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.imgage=pygame.image.load('./feiji/bullet.png')
        pass
    def display(self):
        self.screen.blit(self.imgage,(self.x,self.y))
        pass
    def move(self):
        self.y-=2
        pass
    def judge(self):
        '''
        判断子弹是否越界
        :return:
        '''
        if self.y<0:
            return True
        else:
            return False
        pass
    pass

# 创建敌机类
class EnemyPlane:
    def __init__(self,screen):
        # 默认设置一个方向
        self.direction='right'
        # 飞机的默认位置
        self.x = 0
        self.y = 0
        # 设置要显示内容的窗口
        self.screen = screen
        self.bulletList=[]
        # 生成飞机的图片对象
        self.imageName = './feiji/enemy0.png'
        self.image = pygame.image.load(self.imageName)
        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
        pass
    def sheBullet(self):
        '''
        敌机随机的发射子弹
        :return:
        '''
        num=random.randint(1,50)
        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+=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

#敌机的子弹类
class EnemyBullet(object):
    def __init__(self,x,y,screen):
        '''
        :param x:
        :param y:
        :param screen:
        '''
        self.x=x
        self.y=y+10
        self.screen=screen
        self.imgage=pygame.image.load('./feiji/bullet1.png')
        pass
    def display(self):
        self.screen.blit(self.imgage,(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
    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() #调用函数实现左移动
                pass
            elif event.type == K_d or event.key == K_RIGHT:
                print('right')
                HeroObj.moveright() #调用函数实现右移动
                pass
            elif event.key == K_SPACE:
                print('按下了空格键 space 发射子弹')
                HeroObj.sheBullet()
    pass

def main():
    #首先创建一个窗口 用来显示内容
    screen=pygame.display.set_mode((350,500),depth=32)
    # 创建一个背景图片对象
    background=pygame.image.load('./feiji/background.png')
    # 设置一个title
    pygame.display.set_caption('阶段总结-飞机小游戏')

    # 添加背景音乐
    pygame.mixer.init()
    pygame.mixer.music.load('./feiji/background.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()
        # time.sleep(1) #休眠一秒钟
        pygame.time.Clock().tick(15)
    pass

if __name__=='__main__':
    main()

你可能感兴趣的:(Python,python)