目录
1.搭建界面和键盘检测
2.添加背景音乐
3.运行优化
4.控制玩具飞机-面向过程
5.控制玩具飞机-面向对象
6.玩家飞机发射子弹
7.显示敌机
8.敌机发射子弹
9.抽象基类
飞机大战-要实现的效果
控制玩具飞机-面向过程
控制玩具飞机-面向对象
玩家飞机发射子弹
显示敌机
敌机发射子弹
控制玩具飞机
显示敌机
敌机发送子弹
1.搭建界面和键盘检测
街机游戏相信很多人玩过,比如图中的恐龙快打、飞机游戏,但是之前我们一直玩别人做的游戏,不知道大家有没有想过,这种游戏是怎么做出来的,使用什么样语言做出来的,Python能做游戏开发吗?答案是肯定的,接下来我就带领大家来一起使用python开发一个飞机大战的游戏
import pygame
from pygame.locals import *
'''
1.搭建界面,主要完成窗口和背景图的显示
'''
def main():
#1.创建一个窗口,用来显示内容
screen=pygame.display.set_mode((350,500),0,32)
#2.加载一张和窗口大小一样的图片,用来充当背景
background=pygame.image.load("./feiji/background.png")
#3.把背景图片放到窗口中显示
#设置一个title
pygame.display.set_caption('阶段总结-飞机小游戏')
while True:
#设定需要显示的背景图
screen.blit(background,(0,0))
#更新需要显示的内容
pygame.display.update()
if __name__=='__main__':
main()
运行结果
键盘检测
#获取事件,比如按键等
for event in pygame.event.get():
#判断是否点击了退出按钮
if event.type==QUIT:
print('exit')
exit()
#判断是否按下了键
elif event.type == KEYDOWN:
# 检测按键是否是a或者left,左键
if event.key == K_a or event.key == K_LEFT:
print('left')
# 检测按键是否是d或者right 右键
elif event.key == K_d or event.key == K_RIGHT:
print('right')
# 检测按键是否是空格键
elif event.key == K_SPACE:
print('space')
输出结果
pygame介绍
Pygame是一个利用SDL库的写的游戏库,SDL呢,全名Simple DirectMedia Layer,是一位叫做Sam Lantinga的大牛写的
SDL是用C写的,不过它也可以使用C++进行开发,当然还有很多其它的语言,Pygame就是Python中使用它的一个库
pygame安装
安装命令:pip install pygame
pygame 使用
Pygame有很多的模块,下面是一张一览表:
具体教程可参考官网:https://www.pygame.org/docs/
2.添加背景音乐
import pygame
from pygame.locals import *
'''
1.搭建界面,主要完成窗口和背景图的显示
'''
def main():
#1.创建一个窗口,用来显示内容
screen=pygame.display.set_mode((350,500),0,32)
#2.加载一张和窗口大小一样的图片,用来充当背景
background=pygame.image.load("./feiji/background.png")
#3.把背景图片放到窗口中显示
#4.设置一个title
pygame.display.set_caption('阶段总结-飞机小游戏')
#5.添加背景音乐
pygame.mixer.init()
pygame.mixer.music.load("./feiji/background.mp3")
pygame.mixer.music.set_volume(0.2)
pygame.mixer.music.play(-1) #循环次数,-1表示无限循环
#6.载入玩家的飞机图片
hero=pygame.image.load("./feiji/hero.png")
#6.1初始化玩家图标的位置
x,y=0,0
while True:
#设定需要显示的背景图/显示玩家图片
screen.blit(background,(0,0))
#显示玩家飞机的图片
screen.blit(hero, (x, y))
#更新需要显示的内容
pygame.display.update()
#获取事件,比如按键等
for event in pygame.event.get():
#判断是否点击了退出按钮
if event.type==QUIT:
print('exit')
exit()
#判断是否按下了键
elif event.type == KEYDOWN:
# 检测按键是否是a或者left,左键
if event.key == K_a or event.key == K_LEFT:
print('left')
if x>0:
x-=5
# 检测按键是否是d或者right 右键
elif event.key == K_d or event.key == K_RIGHT:
print('right')
if x<310:
x+=5
# 检测按键是否是空格键
elif event.key == K_SPACE:
print('space')
if __name__=='__main__':
main()
3.运行优化,玩家飞机--面向对象
import pygame
from pygame.locals import *
'''
1.实现飞机的显示,并且可以控制飞机的移动【面向对象】
'''
class HeroPlane(object):
def __init__(self,screen):
#设定飞机的默认位置
self.x=150
self.y=450
#设置要显示内容的窗口
self.screen=screen
self.imageName="./feiji/hero.png"
self.image=pygame.image.load(self.imageName)
pass
def moveLeft(self): #左移动
if self.x>0:
self.x-=10
pass
def moveRight(self): #右移动
if self.x<<310:
self.x+=10
pass
def display(self): #飞机在主窗口的显示
self.screen.blit(self.image,(self.x,self.y))
pass
'''
2.键盘控制
'''
def key_control(HeroObj):
for event in pygame.event.get():
# 判断是否点击了退出按钮
if event.type == QUIT:
print('exit')
exit()
# 判断是否按下了键
elif event.type == KEYDOWN:
# 检测按键是否是a或者left,左键
if event.key == K_a or event.key == K_LEFT:
print('left')
HeroObj.moveLeft() #调用函数实现左移动
elif event.key == K_d or event.key == K_RIGHT:
print('right')
HeroObj.moveRight() #调用函数实现左移动
# 检测按键是否是空格键
elif event.key == K_SPACE:
print('space')
'''
3.搭建界面,主要完成窗口和背景图的显示
'''
def main():
#1.创建一个窗口,用来显示内容
screen=pygame.display.set_mode((350,500),0,32)
#2.加载一张和窗口大小一样的图片,用来充当背景
background=pygame.image.load("./feiji/background.png")
#3.把背景图片放到窗口中显示
#4.设置一个title
pygame.display.set_caption('阶段总结-飞机小游戏')
#5.添加背景音乐
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)
while True:
#设定需要显示的背景图/显示玩家图片
screen.blit(background,(0,0))
#显示玩家飞机的图片
hero.display()
key_control(hero)
#更新需要显示的内容
pygame.display.update()
if __name__=='__main__':
main()
4.效果完成
import time
import pygame
import random
from pygame.locals import *
'''
1.实现飞机的显示,并且可以控制飞机的移动【面向对象】
'''
class HeroPlane(object):
def __init__(self,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): #左移动
if self.x>0:
self.x-=10
pass
def moveRight(self): #右移动
if self.x<<310:
self.x+=10
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
#重新遍历
for i in needDelItemList:
self.bulletList.remove(i)
for bullet in self.bulletList:
bullet.display() #显示子弹的位置
bullet.move() #让子弹移动
def sheBullet(self):
#创建一个新的子弹对象
newbullet=Bullet(self.x,self.y,self.screen)
self.bulletList.append(newbullet)
'''
2.创建敌人飞机
'''
class EnemyPlane():
def __init__(self,screen):
#默认设定一个子弹的方向
self.direction='right'
# 设定飞机的默认位置
self.x = 0
self.y = 0
# 设置要显示内容的窗口
self.screen = screen
self.imageName = "./feiji/enemy0.png"
self.image = pygame.image.load(self.imageName)
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
# 重新遍历
for i in needDelItemList:
self.bulletList.remove(i)
for bullet in self.bulletList:
bullet.display() # 显示子弹的位置
bullet.move() # 让子弹移动
def sheBullet(self):
num=random.randint(1,100)
if num==3:
newBullet=EnemyBullet(self.x,self.y,self.screen)
self.bulletList.append(newBullet)
pass
def move(self):
if self.direction=='right':
self.x+=0.1
elif self.direction=='left':
self.x-=0.1
if self.x>350-20:
self.direction='left'
elif self.x<0:
self.direction='right'
'''
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("./feiji/bullet.png")
pass
def display(self):
self.screen.blit(self.image,(self.x,self.y))
pass
def move(self):
self.y-=3
pass
#判断子弹是否越界
def judge(self):
if self.y<0:
return True
else:
return False
pass
'''
4.创建敌人飞机子弹
'''
class EnemyBullet(object):
def __init__(self,x,y,screen):
self.x=x
self.y=y+10
self.screen=screen
self.image=pygame.image.load("./feiji/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):
if self.y>500:
return True
else:
return False
pass
'''
4..键盘控制
'''
def key_control(HeroObj):
for event in pygame.event.get():
# 判断是否点击了退出按钮
if event.type == QUIT:
print('exit')
exit()
# 判断是否按下了键
elif event.type == KEYDOWN:
# 检测按键是否是a或者left,左键
if event.key == K_a or event.key == K_LEFT:
print('left')
HeroObj.moveLeft() #调用函数实现左移动
elif event.key == K_d or event.key == K_RIGHT:
print('right')
HeroObj.moveRight() #调用函数实现左移动
# 检测按键是否是空格键
elif event.key == K_SPACE:
print('按下空格键,发射子弹')
HeroObj.sheBullet()
'''
5.搭建界面,主要完成窗口和背景图的显示
'''
def main():
#1.创建一个窗口,用来显示内容
screen=pygame.display.set_mode((350,500),0,32)
#2.加载一张和窗口大小一样的图片,用来充当背景
background=pygame.image.load("./feiji/background.png")
#3.把背景图片放到窗口中显示
#4.设置一个title
pygame.display.set_caption('阶段总结-飞机小游戏')
#5.添加背景音乐
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()
if __name__=='__main__':
main()
5.结构优化
import time
import pygame
import random
from pygame.locals import *
class basePlane():
def __init__(self,screen,imageName):
self.screen=screen
self.image=pygame.image.load(imageName)
self.bulletList=[]
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
# 重新遍历
for i in needDelItemList:
self.bulletList.remove(i)
for bullet in self.bulletList:
bullet.display() # 显示子弹的位置
bullet.move() # 让子弹移动
pass
'''
1.实现飞机的显示,并且可以控制飞机的移动【面向对象】
'''
class HeroPlane(basePlane):
def __init__(self,screen):
#设定飞机的默认位置
self.x=150
self.y=450
#设置要显示内容的窗口
super().__init__(screen,"./feiji/hero.png") #调用父类的构造方法
def moveLeft(self): #左移动
if self.x>0:
self.x-=10
pass
def moveRight(self): #右移动
if self.x<310:
self.x+=10
pass
def sheBullet(self):
#创建一个新的子弹对象
newbullet=CommonBullet(self.x,self.y,self.screen,'hero')
self.bulletList.append(newbullet)
'''
2.创建敌人飞机
'''
class EnemyPlane(basePlane):
def __init__(self,screen):
super().__init__(screen,"./feiji/enemy0.png")
#默认设定一个子弹的方向
self.direction='right'
# 设定飞机的默认位置
self.x = 0
self.y = 0
pass
def sheBullet(self):
num=random.randint(1,100)
if num==3:
newBullet=CommonBullet(self.x,self.y,self.screen,'enemy')
self.bulletList.append(newBullet)
pass
def move(self):
if self.direction=='right':
self.x+=0.1
elif self.direction=='left':
self.x-=0.1
if self.x>350-20:
self.direction='left'
elif self.x<0:
self.direction='right'
class CommonBullet():
def __init__(self,x,y,screen,bulletType):
self.type=bulletType
self.screen=screen
if self.type=='hero':
self.x = x + 13
self.y = y - 20
self.imagePath="./feiji/bullet.png"
elif self.type=='enemy':
self.x = x
self.y = y + 10
self.imagePath="./feiji/bullet1.png"
self.image=pygame.image.load(self.imagePath)
def move(self):
if self.type=='hero':
self.y-=1
elif self.type=='enemy':
self.y+=1
def display(self):
self.screen.blit(self.image,(self.x,self.y))
pass
def judge(self):
if self.y>500 or self.y<0:
return True
else:
return False
'''
5..键盘控制
'''
def key_control(HeroObj):
for event in pygame.event.get():
# 判断是否点击了退出按钮
if event.type == QUIT:
print('exit')
exit()
# 判断是否按下了键
elif event.type == KEYDOWN:
# 检测按键是否是a或者left,左键
if event.key == K_a or event.key == K_LEFT:
print('left')
HeroObj.moveLeft() #调用函数实现左移动
elif event.key == K_d or event.key == K_RIGHT:
print('right')
HeroObj.moveRight() #调用函数实现左移动
# 检测按键是否是空格键
elif event.key == K_SPACE:
print('按下空格键,发射子弹')
HeroObj.sheBullet()
'''
5.搭建界面,主要完成窗口和背景图的显示
'''
def main():
#1.创建一个窗口,用来显示内容
screen=pygame.display.set_mode((350,500),0,32)
#2.加载一张和窗口大小一样的图片,用来充当背景
background=pygame.image.load("./feiji/background.png")
#3.把背景图片放到窗口中显示
#4.设置一个title
pygame.display.set_caption('阶段总结-飞机小游戏')
#5.添加背景音乐
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()
if __name__=='__main__':
main()
import time
import pygame
import random
from pygame.locals import *
'''
1.实现飞机的显示,并且可以控制飞机的移动【面向对象】
'''
class HeroPlane(object):
def __init__(self,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): #左移动
if self.x>0:
self.x-=10
pass
def moveRight(self): #右移动
if self.x<<310:
self.x+=10
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
#重新遍历
for i in needDelItemList:
self.bulletList.remove(i)
for bullet in self.bulletList:
bullet.display() #显示子弹的位置
bullet.move() #让子弹移动
def sheBullet(self):
#创建一个新的子弹对象
newbullet=Bullet(self.x,self.y,self.screen)
self.bulletList.append(newbullet)
'''
2.创建敌人飞机
'''
class EnemyPlane():
def __init__(self,screen):
#默认设定一个子弹的方向
self.direction='right'
# 设定飞机的默认位置
self.x = 0
self.y = 0
# 设置要显示内容的窗口
self.screen = screen
self.imageName = "./feiji/enemy0.png"
self.image = pygame.image.load(self.imageName)
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
# 重新遍历
for i in needDelItemList:
self.bulletList.remove(i)
for bullet in self.bulletList:
bullet.display() # 显示子弹的位置
bullet.move() # 让子弹移动
def sheBullet(self):
num=random.randint(1,100)
if num==3:
newBullet=EnemyBullet(self.x,self.y,self.screen)
self.bulletList.append(newBullet)
pass
def move(self):
if self.direction=='right':
self.x+=0.1
elif self.direction=='left':
self.x-=0.1
if self.x>350-20:
self.direction='left'
elif self.x<0:
self.direction='right'
'''
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("./feiji/bullet.png")
pass
def display(self):
self.screen.blit(self.image,(self.x,self.y))
pass
def move(self):
self.y-=3
pass
#判断子弹是否越界
def judge(self):
if self.y<0:
return True
else:
return False
pass
'''
4.创建敌人飞机子弹
'''
class EnemyBullet(object):
def __init__(self,x,y,screen):
self.x=x
self.y=y+10
self.screen=screen
self.image=pygame.image.load("./feiji/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):
if self.y>500:
return True
else:
return False
pass
'''
4..键盘控制
'''
def key_control(HeroObj):
for event in pygame.event.get():
# 判断是否点击了退出按钮
if event.type == QUIT:
print('exit')
exit()
# 判断是否按下了键
elif event.type == KEYDOWN:
# 检测按键是否是a或者left,左键
if event.key == K_a or event.key == K_LEFT:
print('left')
HeroObj.moveLeft() #调用函数实现左移动
elif event.key == K_d or event.key == K_RIGHT:
print('right')
HeroObj.moveRight() #调用函数实现左移动
# 检测按键是否是空格键
elif event.key == K_SPACE:
print('按下空格键,发射子弹')
HeroObj.sheBullet()
'''
5.搭建界面,主要完成窗口和背景图的显示
'''
def main():
#1.创建一个窗口,用来显示内容
screen=pygame.display.set_mode((350,500),0,32)
#2.加载一张和窗口大小一样的图片,用来充当背景
background=pygame.image.load("./feiji/background.png")
#3.把背景图片放到窗口中显示
#4.设置一个title
pygame.display.set_caption('阶段总结-飞机小游戏')
#5.添加背景音乐
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()
if __name__=='__main__':
main()



