复习内容:
python设计游戏的方法:
步骤:
第一步:
搭建界面和键盘检测
plane pro需求描述
存在四个对象:
我放飞机 敌方飞机 我方子弹 敌方子弹
功能:
我方飞机可以移动[通过键盘来操作]
敌方飞机可以移动[随机的自动移动]
双方飞机都可以发送子弹
步骤:
创建一个窗口
创建一个我方 根据方向键左右的移动
给我方飞机添加发射子弹的功能[按下空格键去发送]
创建一个敌机 敌人飞机可以自由移动 还可以自动发射子弹
pygame是一个利用SDL库写的游戏库 安装库
库安装成功
# 显示背景图片
import pygame
from pygame.locals import *
def main():
# 首先创建一个窗口 用来显示内容
screen=pygame.display.set_mode((350,500)) #设置图片显示
# 设定一个背景图片对象
background=pygame.image.load('./飞机大战图片音乐素材/background.jpg')
# 设定一个标题title
pygame.display.set_caption('阶段总结 飞机游戏')
#设定要显示的图片
while True:
screen.blit(background,(0,0)) #居中显示图片
#更新显示的内容
pygame.display.update()
pass
main()
# 添加背景音乐
pygame.mixer.init()
pygame.mixer.music.load('./飞机大战图片音乐素材/music1.mp3')
pygame.mixer.music.set_volume((0.2))
pygame.mixer.music.play(-1) #循环次数 -1表示无限循环
#设定要显示的图片
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.type==K_a or event.key==K_LEFT:
print('left')
elif event.type==K_d or event.key==K_RIGHT:
print('right')
elif event.type==K_SPACE:
print('space')
#更新显示的内容
pygame.display.update()
pass
实现图片显示,音乐,键盘控制功能
mport pygame
from pygame.locals import *
'''
1.实现飞机的显示 并且可以控制飞机的移动【面向对象】
'''
class HeroPlane(object):
def __init__(self,screen):
'''
初始化函数
主窗体对象 :param screen:
'''
# 飞机的默认位置
self.x=150
self.y=450
# 设置要显示的窗口
self.screen=screen
# 生成飞机的图片对象
self.image=pygame.image.load('./飞机大战图片音乐素材/ship.png')
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))
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()
elif event.type == K_d or event.key == K_RIGHT:
print('right')
HeroObj.moveright()
elif event.type == K_SPACE:
print('按下了空格键')
# 更新显示的内容
pygame.display.update()
def main():
# 首先创建一个窗口 用来显示内容
screen=pygame.display.set_mode((350,500),depth=32) #设置图片显示
# 设定一个背景图片对象
background=pygame.image.load('./飞机大战图片音乐素材/background.jpg')
# 设定一个标题title
pygame.display.set_caption('阶段总结 飞机游戏')
# 添加背景音乐
pygame.mixer.init()
pygame.mixer.music.load('./飞机大战图片音乐素材/music1.mp3')
pygame.mixer.music.set_volume((0.2))
pygame.mixer.music.play(-1) #循环次数 -1表示无限循环
# 创建一个飞机对象
hero=HeroPlane(screen)
#设定要显示的图片
while True:
screen.blit(background,(0,0)) #居中显示图片
# 显示玩家飞机的图片
hero.display() #显示玩家图片
# 获取键盘事件
key_control(hero)
#更新显示的内容
pygame.display.update()
pass
if __name__=='__main__':
main()
继续完善代码
实现发射子弹功能
import pygame
from pygame.locals import *
'''
1.实现飞机的显示 并且可以控制飞机的移动【面向对象】
'''
class HeroPlane(object):
def __init__(self,screen):
'''
初始化函数
主窗体对象 :param screen:
'''
# 飞机的默认位置
self.x=150
self.y=450
# 设置要显示的窗口
self.screen=screen
# 生成飞机的图片对象
self.image=pygame.image.load('./飞机大战图片音乐素材/ship.png')
# 用来存放子弹的列表
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.image=pygame.image.load('./飞机大战图片音乐素材/bullet1.png')
pass
def display(self):
self.screen.blit(self.image,(self.x,self.y))
pass
def move(self):
self.y-=1
pass
def judge(self):
'''
判断子弹是否越界
:return:
'''
if self.y<0:
return True
else:
return False
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()
elif event.type == K_d or event.key == K_RIGHT:
print('right')
HeroObj.moveright()
elif event.key == K_SPACE:
print('按下了空格键 space 发射子弹')
HeroObj.shebullet()
# 更新显示的内容
pygame.display.update()
def main():
# 首先创建一个窗口 用来显示内容
screen=pygame.display.set_mode((350,500),depth=32) #设置图片显示
# 设定一个背景图片对象
background=pygame.image.load('./飞机大战图片音乐素材/background.jpg')
# 设定一个标题title
pygame.display.set_caption('阶段总结 飞机游戏')
# 添加背景音乐
pygame.mixer.init()
pygame.mixer.music.load('./飞机大战图片音乐素材/music1.mp3')
pygame.mixer.music.set_volume((0.2))
pygame.mixer.music.play(-1) #循环次数 -1表示无限循环
# 创建一个飞机对象
hero=HeroPlane(screen)
#设定要显示的图片
while True:
screen.blit(background,(0,0)) #居中显示图片
# 显示玩家飞机的图片
hero.display() #显示玩家图片
# 获取键盘事件
key_control(hero)
#更新显示的内容
pygame.display.update()
pass
if __name__=='__main__':
main()
未优化版本 实现敌机发射子弹
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.image=pygame.image.load('./飞机大战图片音乐素材/ship.png')
# 用来存放子弹的列表
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.image=pygame.image.load('./飞机大战图片音乐素材/bullet1.png')
pass
def display(self):
self.screen.blit(self.image,(self.x,self.y))
pass
def move(self):
self.y-=0.1
pass
def judge(self):
'''
判断子弹是否越界
:return:
'''
if self.y<0:
return True
else:
return False
pass
# 创建敌机类
class EnemyPlane:
def __init__(self,screen):
# 默认设置一个方向 左右移动
self.direction='right'
self.x = 0
self.y = 0
# 设置要显示的窗口
self.screen = screen
self.bulletList=[]
# 生成飞机的图片对象
self.image = pygame.image.load('./飞机大战图片音乐素材/enemy.png')
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):
'''
敌机随机的发射子弹
:return:
'''
num=random.randint(1,100)
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+=0.05
pass
elif self.direction == 'left':
self.x-=0.05
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+13
self.y=y+10
self.screen=screen
self.image=pygame.image.load('./飞机大战图片音乐素材/bullet1.png')
pass
def display(self):
self.screen.blit(self.image,(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
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()
elif event.type == K_d or event.key == K_RIGHT:
print('right')
HeroObj.moveright()
elif event.key == K_SPACE:
print('按下了空格键 space 发射子弹')
HeroObj.shebullet()
# 更新显示的内容
pygame.display.update()
def main():
# 首先创建一个窗口 用来显示内容
screen=pygame.display.set_mode((350,500),depth=32) #设置图片显示
# 设定一个背景图片对象
background=pygame.image.load('./飞机大战图片音乐素材/background.jpg')
# 设定一个标题title
pygame.display.set_caption('阶段总结 飞机游戏')
# 添加背景音乐
pygame.mixer.init()
pygame.mixer.music.load('./飞机大战图片音乐素材/music1.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()
pygame.time.Clock().tick(100) #pygame时钟一分钟刷新多少次
pass
if __name__=='__main__':
main()
代码优化完成
import pygame
import random ##随机产生数据
import time
from pygame.locals import *
'''
1.实现飞机的显示,并且可以控制飞机的移动【面向对象】
'''
# 抽象出一个飞机的基类
class BasePlane:
def __init__(self,screen,imagePath):
'''
初始化基类函数
:param screen: 主窗体对象
:param imageName: 加载的图片
'''
self.screen=screen
self.image=pygame.image.load(imagePath)
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)
pass
pass
# 重新遍历
for i in needDelItemLIst: # 删除
self.bulletlist.remove(i)
pass
for bullet in self.bulletlist:
bullet.display() # 显示子弹的位置
bullet.move() # 移动子弹 下次在显示就会看到子弹再修改的位置了
pass
# 抽象出子弹的基类
class CommonBullet(object):
'''
公共的子弹类
'''
def __init__(self,x,y,screen,bulletType):
self.type=bulletType
self.screen=screen
if self.type=='hero':
self.x=x+20
self.y=y-20
self.imagePath='./飞机大战图片音乐素材/bullet1.png'
elif self.type=='enemy':
self.x = x
self.y =y+10
self.imagePath = './飞机大战图片音乐素材/bullet2.jpg'
pass
self.image=pygame.image.load(self.imagePath)
pass
def move(self):
'''
子弹的移动
:return:
'''
if self.type=='hero':
self.y-=2
elif self.type=='enemy':
self.y+=2
pass
pass
def display(self):
self.screen.blit(self.image,(self.x,self.y))
pass
def judge(self):
'''
判断子弹是否越界
:return:
'''
if self.y>500 or self.y<0:
return True
else:
return False
pass
'''
1.实现飞机的显示 并且可以控制飞机的移动【面向对象】
'''
class HeroPlane(BasePlane):
def __init__(self,screen):
'''
初始化函数
主窗体对象 :param screen:
'''
super().__init__(screen,'./飞机大战图片音乐素材/ship.png')
# 飞机的默认位置
self.x=150
self.y=450
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 shebullet(self):
# 创建一个新的子弹对象
newBullet=CommonBullet(self.x,self.y,self.screen,'hero')
self.bulletlist.append(newBullet)
pass
pass
# 创建敌机类
class EnemyPlane(BasePlane):
def __init__(self,screen):
super().__init__(screen,'./飞机大战图片音乐素材/enemy.png')
# 默认设置一个方向 左右移动
self.direction='right'
self.x = 0
self.y = 0
def sheBullet(self):
'''
敌机随机的发射子弹
:return:
'''
num=random.randint(1,50)
if num==3:
newBullet=CommonBullet(self.x,self.y,self.screen,'enemy')
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
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()
elif event.type == K_d or event.key == K_RIGHT:
print('right')
HeroObj.moveright()
elif event.key == K_SPACE:
print('按下了空格键 space 发射子弹')
HeroObj.shebullet()
# 更新显示的内容
pygame.display.update()
def main():
# 首先创建一个窗口 用来显示内容
screen=pygame.display.set_mode((350,500),depth=32) #设置图片显示
# 设定一个背景图片对象
background=pygame.image.load('./飞机大战图片音乐素材/background.jpg')
# 设定一个标题title
pygame.display.set_caption('阶段总结 飞机游戏')
# 添加背景音乐
pygame.mixer.init()
pygame.mixer.music.load('./飞机大战图片音乐素材/music1.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()
pygame.time.Clock().tick(100) #pygame时钟一分钟刷新多少次
pass
if __name__=='__main__':
main()