代码:
import pygame
import random #导入随机数
import time #加入延时操作
from pygame.locals import *
'''
1、实现飞机的显示,并且可以控制飞机的移动【面向对象】
'''
class HeroPlane(object):
def __init__(self,screen):
#飞机默认位置
self.x=150
self.y=450
#设置要显示内容的窗口
self.screen=screen
#生成飞机的图片对象
self.imageName='./背景/我方.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
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):
self.x=x+13
self.y=y-20
self.screen=screen
self.imgage=pygame.image.load('./背景/我方武器.png')
pass
def display(self):
self.screen.blit(self.imgage,(self.x,self.y))
pass
# 发射子弹
def move(self):
self.y-=5
pass
def judge(self): #判断子弹是否越界
if self.y<0:
return True
else:
return False
pass
pass
class EnemyPlane: #创建敌机类
def __init__(self,screen):
#默认设置一个方向
self.direction='right'
# 飞机默认位置
self.x = 0
self.y = 0
# 设置要显示内容的窗口
self.screen = screen
self.bulletList=[]
# 生成飞机的图片对象
self.imageName = './背景/敌方.png'
self.image = pygame.image.load(self.imageName)
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
def sheBullet(self): #敌机随机的发射子弹
num=random.randint(1,400)
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.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
pass
class EnemyBullet(object): #敌机的子弹类
def __init__(self,x,y,screen):
self.x=x+30
self.y=y+50
self.screen=screen
self.imgage=pygame.image.load('./背景/敌方武器.jpg')
pass
def display(self):
self.screen.blit(self.imgage,(self.x,self.y))
pass
# 发射子弹
def move(self):
self.y+=2
pass
def judge(self): #判断子弹是否越界
if self.y>500:
return True
else:
return False
pass
pass
def key_control(HeroPlane): #用来实现键盘的检测
# 获取键盘事件
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')
HeroPlane.moveleft() #调用函数实现左移动
pass
elif event.type == K_d or event.key == K_RIGHT:
print('right')
HeroPlane.moveright() #调用函数实现右移动
pass
elif event.key == K_SPACE:
print('K_SPACE:发射子弹')
HeroPlane.sheBullet()
pass
pass
def main():
#首先创建一个窗口 用来显示内容
screen=pygame.display.set_mode((350,500),depth=32)
#设定一个背景图片对象
background=pygame.image.load('./背景/背景图.jpg')
#设置一个标题
pygame.display.set_caption('飞机游戏')
#设置背景音乐
pygame.mixer.init()
pygame.mixer.music.load('./背景/背景音乐.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()
#time.sleep(1) #休眠一秒钟再循环
#pygame.time.Clock().tick(5) #一秒钟循环五次
pass
if __name__=='__main__':
main()
运行结果
敌机会移动且发射子弹