开发步骤:
1.创建一个窗口
2.创建我方飞机 根据方向键左右移动
3.给我方飞机天机发射子弹功能【空格键】
4.创建敌方飞机
5.敌方飞机随机移动且发射子弹
开发工具包–pygame
导包:
import pygame#导包
from pygame.locals import *
- 搭建界面与键盘检测 :
#首先创建一个窗口,用来显示内容
screen = pygame.display.set_mode((350,500))
#设定背景图片对象
background = pygame.image.load('./Plane/bg.jpg')
#设置一个title
pygame.display.set_caption('飞机大战')
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.key == K_a or event.key==K_LEFT:
print('left')
elif event.key==K_d or event.key==K_RIGHT:
print('right')
elif event.key==K_SPACE:
print('shoot')
#更新显示内容
pygame.display.update()
pass
- 添加背景音乐
#添加背景音乐
pygame.mixer.init()
pygame.mixer.music.load('./Plane/bgm.mp3')
pygame.mixer.music.set_volume(0.2)#设置音乐 0-1
pygame.mixer.music.play(-1)#设置循环播放,-1表示无限循环
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('./Plane/bullet.JPG')
pass
def display(self):
self.screen.blit(self.image,(self.x,self.y))
pass
def move(self):
self.y-=2
pass
def judge(self):
#判断子弹是否越界
if self.y<0:
return True
else:
return False
pass
#飞机类
class HeroPlane(object):
def __init__(self,screen):
#飞机的默认位置
self.x = 150
self.y = 450
#设置要显示内容的窗口
self.screen = screen
#生成飞机图片对象
self.imageName = './Plane/hero.JPG'
self.image = pygame.image.load(self.imageName)
#用来存放子弹的列表
self.bullet=[]
pass
def display(self):
self.screen.blit(self.image,(self.x,self.y))
#完善子弹逻辑,若子弹越界则删除对应子弹
DeleteItem = []
for item in self.bullet:
if item.judge():
DeleteItem.append(item)
pass
pass
for i in DeleteItem:
self.bullet.remove(i)#删除
pass
#删除后,重新展示没有越界的子弹
for j in self.bullet:
j.display()#显示子弹
j.move()#子弹移动
def moveleft(self):
if self.x>0:
self.x-=10
pass
def moveright(self):
if self.x<350-40:
self.x+=10
def movedown(self):
if self.y<460:
self.y+=15
def moveup(self):
if self.y>60:
self.y-=15
def shoot(self):
newBullet = Bullet(self.x,self.y,self.screen)
#把新发射子弹装到列表中
self.bullet.append(newBullet)
pass
pass
#键盘方法
#键盘控制检查方法
def key_control(HeroObj):
# 获取键盘事件
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:
print('left')
# 左移
HeroObj.moveleft()
pass
elif event.key == K_d or event.key == K_RIGHT:
print('right')
# 右移
HeroObj.moveright()
pass
elif event.key == K_s or event.key==K_DOWN:
print('down')
HeroObj.movedown()
elif event.key == K_w or event.key==K_UP:
print('up')
HeroObj.moveup()
elif event.key == K_SPACE:
print('shoot')
HeroObj.shoot()
4.显示敌机
#敌机类
class EnemyPlane(basePlane):
def __init__(self,screen):
#默认设置方向给予敌机移动
self.direction = 'right'
# 飞机的默认位置
self.x = 0
self.y = 0
super().__init__(screen,'./Plane/enemy.JPG')
pass
def shoot(self):
#敌机随机发射子弹
num = random.randint(1,100)
if num==3:
newBullet = EnemyBullet(self.x,self.y,self.screen)
self.bullet.append(newBullet)
pass
def move(self):
if self.direction == 'right':
self.x+=1
pass
elif self.direction == 'left':
self.x -= 1
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):
self.x = x+6
self.y = y+20
self.screen = screen
self.image = pygame.image.load('./Plane/bullet2.JPG')
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
5.完整代码
import pygame#导包
from pygame.locals import *
import random
import time
#键盘控制检查方法
def key_control(HeroObj):
# 获取键盘事件
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:
print('left')
# 左移
HeroObj.moveleft()
pass
elif event.key == K_d or event.key == K_RIGHT:
print('right')
# 右移
HeroObj.moveright()
pass
elif event.key == K_s or event.key==K_DOWN:
print('down')
HeroObj.movedown()
elif event.key == K_w or event.key==K_UP:
print('up')
HeroObj.moveup()
elif event.key == K_SPACE:
print('shoot')
HeroObj.shoot()
#抽象出来一个飞机的基类
class basePlane(object):
def __init__(self,screen,imagePath):
self.screen = screen
self.image = pygame.image.load(imagePath)
self.bullet = []
pass
def display(self):
self.screen.blit(self.image, (self.x, self.y))
# 完善子弹逻辑,若子弹越界则删除对应子弹
DeleteItem = []
for item in self.bullet:
if item.judge():
DeleteItem.append(item)
pass
pass
for i in DeleteItem:
self.bullet.remove(i) # 删除
pass
# 删除后,重新展示没有越界的子弹
for j in self.bullet:
j.display() # 显示子弹
j.move() # 子弹移动
pass
class HeroPlane(basePlane):
def __init__(self,screen):
# 调用父类的构造函数
super().__init__(screen, './Plane/hero.JPG')
#飞机的默认位置
self.x = 150
self.y = 450
pass
def moveleft(self):
if self.x>0:
self.x-=10
pass
def moveright(self):
if self.x<350-40:
self.x+=10
def movedown(self):
if self.y<460:
self.y+=15
def moveup(self):
if self.y>60:
self.y-=15
def shoot(self):
newBullet = Bullet(self.x,self.y,self.screen)
#把新发射子弹装到列表中
self.bullet.append(newBullet)
pass
pass
#子弹类
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('./Plane/bullet.JPG')
pass
def display(self):
self.screen.blit(self.image,(self.x,self.y))
pass
def move(self):
self.y-=2
pass
def judge(self):
#判断子弹是否越界
if self.y<0:
return True
else:
return False
pass
#敌机类
class EnemyPlane(basePlane):
def __init__(self,screen):
#默认设置方向给予敌机移动
self.direction = 'right'
# 飞机的默认位置
self.x = 0
self.y = 0
super().__init__(screen,'./Plane/enemy.JPG')
pass
def shoot(self):
#敌机随机发射子弹
num = random.randint(1,100)
if num==3:
newBullet = EnemyBullet(self.x,self.y,self.screen)
self.bullet.append(newBullet)
pass
def move(self):
if self.direction == 'right':
self.x+=1
pass
elif self.direction == 'left':
self.x -= 1
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):
self.x = x+6
self.y = y+20
self.screen = screen
self.image = pygame.image.load('./Plane/bullet2.JPG')
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
def main():
#首先创建一个窗口,用来显示内容
screen = pygame.display.set_mode((350,500))
#设定背景图片对象
background = pygame.image.load('./Plane/bg.jpg')
#设置一个title
pygame.display.set_caption('飞机大战')
#添加背景音乐
pygame.mixer.init()
pygame.mixer.music.load('./Plane/bgm.mp3')
pygame.mixer.music.set_volume(0.2)#设置音乐 0-1
pygame.mixer.music.play(-1)#设置循环播放,-1表示无限循环
#创建飞机对象
hero = HeroPlane(screen)
enemy = EnemyPlane(screen)
while True:
#设定要显示的内容
screen.blit(background,(0,0))#显示图片
hero.display()
enemy.display()
enemy.move()
enemy.shoot()
#获取键盘事件
key_control(hero)
#更新显示内容
pygame.display.update()
pass
pass
main()