目录
一:背景
1. pygame 模块初识
二.项目设计内容
开发一款飞机大战游戏,要求:
(1)实现飞机的移动、子弹发射,对本次游戏有一个初步的编写及认识。
(2)飞机的持续按键移动和飞机自爆优化。
(3)进行基类的抽取,使代码更具有层次性和简化重复代码。
(4)对判断以及删除越界子弹、敌机发射子弹进行扩展优化。
三.附源代码
四.程序运行效果:
五. 扩展
这款游戏的名字叫《飞机大战》,是使用Python开发的纵版飞行射击类游戏.Python是一种面向对象的解释型计算机程序设计语言,具有简单易学,可移植,可拓展等特点.并且拥有丰富的资源.在图形处理,数字处理,网络编程等方面有广泛用途.这个游戏利用了Python的pygame模块,射击了子弹,飞机类的相关方法和属性,进行了背景贴图,实现了飞机大战游戏的功能。
此项目主要借助python的第三方库pygame以及面向对象思维进行开发。纯面向过程实现的简单操作可移步到之前发的文章:http://t.csdn.cn/w7dXf
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 )
编程思路:主要使用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/
最后:今天给大家分享的飞机大战小游戏到这里就结束了,源代码放在上面了,喜欢的小伙伴就拿去练练手吧。