python小游戏开发(飞机大战)

目录

一:背景      

1. pygame 模块初识

二.项目设计内容

开发一款飞机大战游戏,要求:

(1)实现飞机的移动、子弹发射,对本次游戏有一个初步的编写及认识。

(2)飞机的持续按键移动和飞机自爆优化。

(3)进行基类的抽取,使代码更具有层次性和简化重复代码。

(4)对判断以及删除越界子弹、敌机发射子弹进行扩展优化。

三.附源代码

四.程序运行效果:

五. 扩展


一:背景      

        这款游戏的名字叫《飞机大战》,是使用Python开发的纵版飞行射击类游戏.Python是一种面向对象的解释型计算机程序设计语言,具有简单易学,可移植,可拓展等特点.并且拥有丰富的资源.在图形处理,数字处理,网络编程等方面有广泛用途.这个游戏利用了Python的pygame模块,射击了子弹,飞机类的相关方法和属性,进行了背景贴图,实现了飞机大战游戏的功能。

此项目主要借助python的第三方库pygame以及面向对象思维进行开发。纯面向过程实现的简单操作可移步到之前发的文章:http://t.csdn.cn/w7dXf

1. pygame 模块初识

1.1游戏的初始化和退出:

方法 含义
pygame.init() 导入并初始化所有pygame模块,使用其他模块之前,必须先调用init方法
pygame.quit() 卸载所有pygame模块,在游戏结束之前调用

1.2补充知识(使用rect 描述飞机大战英雄机的位置)

        1.2.1Rect是用于存储矩形坐标的pygame对象,rect对象有一些虚拟属性,比如top,left,bottom,right这些是用来固定矩形的位置的,还有size,width,height,这些是描述矩形大小,宽高分别是多大。
center为矩形的中心点,其实就是关于横纵坐标的二元组,因此又有centerx,centery两个属性。此外,还有x,y。

1.2.2Rect构造方法:
rect = pygame.Rect( left , top, width, height )

二.项目设计内容

开发一款飞机大战游戏,要求:

(1)实现飞机的移动、子弹发射,对本次游戏有一个初步的编写及认识。
(2)飞机的持续按键移动和飞机自爆优化。
(3)进行基类的抽取,使代码更具有层次性和简化重复代码。
(4)对判断以及删除越界子弹、敌机发射子弹进行扩展优化。

三.附源代码

编程思路:主要使用pygame库,类的创建,函数的调用等等来实现;相关代码如下:

import pygame
from pygame.locals import *
import random

#面向对象实现
#创建玩家英雄飞机
class HeroPlane(object):
    def __init__(self,create):
        '''
        初始化函数
        :param create:创建一个窗口界面
        '''
        #设置飞机的默认位置
        self.x=250
        self.y=625

        #设置要显示内容的窗口
        self.create=create

        #生成玩家飞机图片
        self.imageName='./sucai/飞机_英雄.gif'
        self.image=pygame.image.load(self.imageName)

        #存放子弹列表
        self.bulletList=[]
        pass
    pass
    def moveleft(self):
        '''
        左移动
        :return:
        '''
        if self.x>=0:
            self.x-=30
        pass
    def moveright(self):
        '''
        又移动
        :return:
        '''
        if self.x<=535:
            self.x+=30
            pass
        pass
    def dispaly(self):
        '''
        在主窗口显示飞机
        :return:
        '''
        self.create.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 FaSheBullet(self):
        # 创建一个新的子弹对象(获取子弹并进行追加到列表)
        NewBullet = Bullet(self.x, self.y, self.create)
        self.bulletList.append(NewBullet)
        pass
    pass

#创建玩家飞机发射的子弹对象类
class Bullet(object):
    def __init__(self,x,y,create):
        '''
        :param x: 子弹默认位置
        :param y:  子弹默认位置
        :param create:   窗口
        '''
        self.x=x+15       #基于飞机的位置对发射的飞机原始位置进行定位调整
        self.y=y-10
        self.create=create
        self.image=pygame.image.load('./sucai/飞机子弹.png')
        pass
    def display(self):
        self.create.blit(self.image,(self.x,self.y))
        pass
    def move(self):
        self.y-=0.5       #控制飞机子弹发射的速度
        pass
    def judge(self):
        '''
        判断子弹是否越界  TRUE为真
        :return:
        '''
        if self.y<0:
            return True
        else:
            return False
        pass
    pass

#创建敌机对象
class EnemyPlane(object):
    def __init__(self,create):
        # 设置敌方飞机的默认位置
        self.x =30
        self.y =-110

        # 设置要显示内容的窗口
        self.create = create

        # 设置一个默认的敌方飞机子弹方向
        self.direction = 'right'

        # 生成敌人飞机图片
        self.imageName = './sucai/敌人.png'
        self.image = pygame.image.load(self.imageName)
        pass
    def display(self):
        self.create.blit(self.image,(self.x,self.y))
        # 存放敌方子弹列表
        self.bulletList=[]
        # 完善子弹的展示逻辑(对于越界的子弹进行捕获删除)
        NeedDelItemList = []
        for item in self.bulletList:
            if item.judge():  # 如果为真(越界)捕获
                NeedDelItemList.append(item)
                pass
            pass
        pass
        # 双重遍历
        for i in NeedDelItemList:
            self.bulletList.remove(i)  # 将捕获到的子弹进行删除
            pass
        for bullet in self.bulletList:
            bullet.display()  # 展示子弹
            bullet.move()  # 调用子弹移动的函数
            pass
        pass
    # 定义一个发射子弹函数(行为 动作)
    def FaSheBullet(self):
        '''
        创建一个敌方发射子弹的函数(行为、动作)
        :return:
        '''
        num = random.randint(1, 5)       #随机发射
        if num == 3:
            newBullet=EnemyBullet(self.x,self.y,self.create)
            # self.bulletList.append(NewBullet)
            self.bulletList.append(newBullet)
        pass
    pass
    def move(self):
        # self.y += 0.5  # 控制敌人飞机子弹发射的速度
        if self.direction == 'right':  # 敌方随机移动
            self.x += 0.2
            pass
        elif self.direction=='left':
            self.x -= 0.2
            pass
        # 越界情况处理
        if self.x > 300:
            self.direction ='left'       #对于越界情况 进行坐标的赋值   而不是判断==
            pass
        elif self.x < -200:
            self.direction ='right'
        pass
    pass

#创建敌方飞机子弹对象
class EnemyBullet(object):
    def __init__(self,x,y,create):
        '''
        :param x: 子弹默认位置
        :param y:  子弹默认位置
        :param create:   窗口
        '''
        self.x =0  # 基于敌方飞机的位置对发射的飞机原始位置进行定位调整
        self.y =0
        self.create = create
        # self.image = pygame.image.load('./sucai/敌人子弹.png')
        self.image=pygame.image.load('./sucai/敌人子弹.png')
        pass
    def display(self):
        # self.create.blit(self.image,(self.x, self.y))
        self.create.blit(self.image,(self.x,self.y))
        pass
    def judge(self):
        '''
        判断子弹是否越界  TRUE为真
        :return:
        '''
        if self.y>700:
            return True
        else:
            return False
        pass
        pass
    pass

#控制键盘的检测
def key_control(HeroPlane):
    #创建键盘事件
    # 获取键盘事件
    eventlist=pygame.event.get()
    # 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:
                # A D 键盘按钮为大写
                print('left')  # 左键
                HeroPlane.moveleft()      #直接调用继承的父类中的方法(函数)从而实现对加键盘事件的控制
            elif event.key == K_d or event.key == K_RIGHT:
                print('right')  # 右键
                HeroPlane.moveright()
                pass
            elif event.key == K_SPACE:
                print('空格键:发射飞机子弹')  # 空键
                HeroPlane.FaSheBullet()
            pass
    pass


#面向过程
def main():
    # 创建一个窗口
    create=pygame.display.set_mode((600,700),depth=100)

    # 设定一个背景图
    background=pygame.image.load('./sucai/背景图.jpg')
    # 设计一个小标题
    pygame.display.set_caption('全民飞机大战')

    # 创建一个飞机对象
    hero = HeroPlane(create)

    #创建一个敌人飞机对象
    enemyplane=EnemyPlane(create)


    # 设计背景音乐
    pygame.mixer.init()
    pygame.mixer.music.load('./sucai/全民飞机大战游戏音乐.mp3')
    pygame.mixer.music.set_volume(0.3)       #自定义设置音量
    pygame.mixer.music.play(-1)   #-1表示无限循环

    # 显示玩家对象
    # 循环刷新
    while True:
        #显示背景图片
        create.blit(background,(0,0))

        #显示玩家对象
        # create.blit(hero,(x,y))
        hero.dispaly()

        #显示敌人飞机对象
        enemyplane.display()
        #调用函数
        enemyplane.move()      #随机移动敌机

        enemyplane.FaSheBullet()    #发射子弹
        #获取键盘事件
        key_control(hero)
        # 更新显示内容
        pygame.display.update()
        pass
    # pass
if __name__ == '__main__':
    main()

四.程序运行效果:

五. 扩展

本文只针对 pygame 模块中一些简单的功能进行介绍,实际上 pygame 还拥有很多强大的功能,若有兴趣学习的可以参考下述文章:

pygame官网:https://www.pygame.org/news

pygame官网文档:https://www.pygame.org/docs/

最后:今天给大家分享的飞机大战小游戏到这里就结束了,源代码放在上面了,喜欢的小伙伴就拿去练练手吧。

 

你可能感兴趣的:(玩转python,pygame,python)