飞机大战功能实现需要安装pygame
安装方法:
win + R 输入cmd,打开如下窗口:
输入 pip install pygame /pip3 install pygame(根据具体版本而定,现在一般是pip3 install pygame)
安装完成后可以查看:输入pip list 即可
我这次编程使用的是pycharm工具,所以在pycharm里也要安装一遍pygame
在Terminal底下的local窗口执行一遍同样操作即可
安装完可以用pip list 查看是否安装成功
目前仅实现了飞机的控制作用移动和发射子弹,敌机的随机移动和随机发射子弹
创建新的项目时,先添加五个图片[背景图片,玩家飞机图片,敌机图片,子弹图片,敌机子弹图片]和一段背景音乐到文件中,以方便后续使用
具体实现过程如下:
import pygame #引用第三方模块
import random
from pygame.locals import *
import time
'''
实现飞机的显示,并控制飞机的移动
'''
class UserPlane(object):
def __init__(self,screen):
'''
初始化函数
:param screen:主窗体对象
'''
#飞机的默认位置
self.x=150
self.y=470
#设置要显示内容的窗口
self.screen=screen
#载入飞机图片
self.imageName='./飞机/user.png'#存放飞机的图片
self.image=pygame.image.load(self.imageName)
#用来存放子弹
self.bulletlist=[]
pass
def moveleft(self):
'''
左移动
:return:
'''
if self.x>=0:
self.x-=10
pass
pass
def moveright(self):
'''
右移动
:return:
'''
if self.x<=330:
self.x+=10
pass
pass
def display(self):
'''
飞机在屏幕显示
:return:
'''
self.screen.blit(self.image,(self.x,self.y))
#完善子弹的展示逻辑
needDellList=[]
for item in self.bulletlist:
if item.judge():
needDellList.append(item)
pass
pass
#生成新的子弹列表
for i in needDellList:
self.bulletlist.remove(i)
pass
for bullet in self.bulletlist:
bullet.display()#显示子弹位置
bullet.move()#子弹移动
def shoot(self):
#创建一个新的子弹对象
newbullet=Bullet(self.x,self.y,self.screen)
self.bulletlist.append(newbullet)
pass
class EnemyPlane(object):
def __init__(self,screen):
# 设置一个方向
self.directuion='rignt'
self.x = 0
self.y = 0
# 设置要显示内容的窗口
self.screen = screen
# 载入敌机图片
self.imageName = './敌机/user.png'#存放敌机的图片
self.image = pygame.image.load(self.imageName)
self.bulletlist=[]
def display(self):
self.screen.blit(self.image,(self.x,self.y))
# 完善子弹的展示逻辑
needDellList = []
for item in self.bulletlist:
if item.judge():
needDellList.append(item)
pass
pass
# 生成新的子弹列表
for i in needDellList:
self.bulletlist.remove(i)
pass
for bullet in self.bulletlist:
bullet.display() # 显示子弹位置
bullet.move() # 子弹移动
pass
def shoot(self):
num=random.randint(0,50000)
if num==3:
newbullet = EnemyBullet(self.x, self.y, self.screen)
self.bulletlist.append(newbullet)
pass
def move(self):
if self.directuion=='right':
self.x+=0.01
pass
elif self.directuion=='left':
self.x-=0.01
pass
if self.x>310:
self.directuion='left'
pass
elif self.x<20:
self.directuion='right'
pass
'''
控制键盘
'''
def key_control(obj):
'''
用来实现键盘检测
:param obj: 控制对象
:return:
'''
eventList=pygame.event.get()
for event in eventList:
if event.type==QUIT:
print('退出')
exit()
pass
elif event.type==KEYDOWN:
if event.key==K_d or event.key==K_RIGHT:
print('right')
obj.moveright()#左移
elif event.key==K_a or event.key==K_LEFT:
print('left')
obj.moveleft()#右移
elif event.key==K_SPACE:
print('SPACE,发射子弹')
obj.shoot()
'''
创建子弹类对象
'''
class Bullet(object):
def __init__(self,x,y,screen):
self.x=x
self.y=y-20
self.screen=screen
self.image=pygame.image.load('./子弹/user.png')#存放子弹的图片
pass
def display(self):
self.screen.blit(self.image,(self.x,self.y))
pass
def move(self):
self.y-=0.05
pass
def judge(self):
'''
判断是否越界
:return:
'''
if self.y<0:
return True
else:
return False
pass
class EnemyBullet(object):
def __init__(self,x,y,screen):
self.x=x
self.y=y+20
self.screen=screen
self.image=pygame.image.load('./敌机子弹/user.png')#存放敌机子弹的图片
pass
def display(self):
self.screen.blit(self.image, (self.x, self.y))
pass
def move(self):
self.y+=0.05
def judge(self):
'''
判断是否越界
:return:
'''
if self.y>480:
return True
else:
return False
pass
def main():
# 首先创建一个窗口,用来显示内容
screen=pygame.display.set_mode((350,500))
# 设定一个背景图片
background=pygame.image.load('./飞机/plane.jpg')#选择背景图片
# 设定一个title
pygame.display.set_caption('飞机大战')
# 添加背景音乐
pygame.mixer.init()
pygame.mixer.music.load('./飞机/派克特 - Home.mp3')#选择你要添加的BGM
pygame.mixer.music.set_volume(0.2)
pygame.mixer.music.play(-1)#循环次数-1,表示无限循环
# 创建一个飞机对象
user=UserPlane(screen)
# 创建一个敌机对象
enemy=EnemyPlane(screen)
# 设定要显示的内容
while True:
screen.blit(background,(0,0))
# 显示玩家飞机图片
user.display()
# 显示敌机图片
enemy.display()
enemy.move()
enemy.shoot()
# 获取键盘事件
key_control(user)
# 更新显示内容
pygame.display.update()
pass
if __name__=='__main__':
main()
本次编程的核心是面向对象编程,当然目前代码仍有许多冗余,后续可以进行更多的优化