飞机大战项目
本项目的优点就是,不需要你创建很多复杂的文件夹,单个操作台就可以完成飞机大战游戏的基础版本。如果你感兴趣,就快去试一试吧!素材链接也在下面喽,快去开启你的游戏之旅吧!
素材链接:链接:https://pan.baidu.com/s/1Mb5w-_I-oUi-W0n0jHFYXw
百度网盘提取码:2301
以下是项目代码:文章来源:https://www.toymoban.com/news/detail-846640.html
因为只是为了复习面相对象、函数、所以以下代码可以实现,玩家操控飞机,躲避敌机子弹并击落飞机,同时伴随着爆炸声音,在此我背景音乐选择的是《奇迹再现》,所有的东西,你理解后都可以自己更换,以及后期的功能拓展什么的,你都可以做。操控上下左右(w s a d),发射子弹,空格键。文章来源地址https://www.toymoban.com/news/detail-846640.html
import time
import random
import pygame
from pygame import *
class HeroPlane(pygame.sprite.Sprite):
#存放所有子弹的组
bullets=pygame.sprite.Group()
def __init__(self,screen):
#这个精灵类的初始方法,必须调用
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load("./feiji/hero1.png")
# 2.0创建一个飞机图片,当做玩家飞机
self.player = pygame.image.load("./feiji/hero1.png")
#根据图片的矩形对象
self.rect =self.image.get_rect() #rect 矩形
self.rect.topleft=[Manager.bg_size[0]/2-100/2,600]
# 飞机速度
self.speed = 15
self.screen=screen
#装子弹的列表
self.bullets=pygame.sprite.Group()
def key_control(self):
# 零时监听键盘事件
key_pressed = pygame.key.get_pressed()
if key_pressed[K_w] or key_pressed[K_UP]:
# print('上')
self.rect.top -= self.speed
if key_pressed[K_s] or key_pressed[K_DOWN]:
# print('下')
self.rect.bottom += self.speed
if key_pressed[K_a] or key_pressed[K_LEFT]:
# print('左')
self.rect.left -= self.speed
if key_pressed[K_d] or key_pressed[K_RIGHT]:
# print('右')
self.rect.right += self.speed
if key_pressed[K_SPACE]:
# print('空格')
#按下空格发射子弹
bullet=Bullet(self.screen,self.rect.left,self.rect.top)
#把子弹放在列表当中
self.bullets.add(bullet)
#存放所有飞机的子弹
HeroPlane.bullets.add(bullet)
def update(self):
self.key_control()
self.display()
def display(self):
# 3.0将飞机图片贴到窗口中
self.screen.blit(self.player, self.rect)
#更多子弹的坐标
self.bullets.update()
# 把所有的子弹全部添加到列表中
self.bullets.draw(self.screen)
@classmethod
def clear_bullets(cls):
#清空子弹
cls.bullets.empty()
class EnemyPlane(pygame.sprite.Sprite):
#敌方所有的子弹
enemy_bullets=pygame.sprite.Group()
def __init__(self,screen):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load("./feiji/enemy0.png")
# 2.0创建一个飞机图片,当做玩家飞机
self.player = pygame.image.load("./feiji/enemy0.png")
# 定义飞机坐标
self.rect=self.image.get_rect() # rect:矩形
x=random.randrange(1,Manager.bg_size[0],50)
self.rect.topleft=[x,0]
# 飞机速度
self.speed = 5
self.screen=screen
#装子弹的列表
self.bullets=pygame.sprite.Group()
#敌机移动方向
self.direction='right'
def display(self):
# 3.0将飞机图片贴到窗口中
self.screen.blit(self.player,self.rect)
#遍历所有的子弹
self.bullets.update()
#把子弹添加到屏幕上
self.bullets.draw(self.screen)
def update(self):
self.auto_move()
self.auto_fire()
self.display()
def auto_move(self):
if self.direction=='right':
self.rect.right+=self.speed
elif self.direction=='left':
self.rect.right-=self.speed
if self.rect.right>Manager.bg_size[0]-51:
self.direction='left'
elif self.rect.right<0:
self.direction='right'
self.rect.bottom+=self.speed #敌机移动位置改变
def auto_fire(self):
'''自动开火 创建子弹对象 添加进列表'''
random_num=random.randint(1,10) #通过更改10,值越大敌机发射子弹的密集程度越低
if random_num==8:
bullet=EnemyBullet(self.screen,self.rect.left,self.rect.top)
self.bullets.add(bullet)
#把子弹添加到类属性的子弹组里
EnemyPlane.enemy_bullets.add(bullet)
@classmethod
def clear_bullets(cls):
#清空子弹
cls.enemy_bullets.empty()
#子弹类
#属性
class Bullet(pygame.sprite.Sprite):
def __init__(self,screen,x,y):
#精灵类初始化
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load('./feiji/bullet.png')
#获得矩形对象
self.rect=self.image.get_rect()
self.rect.topleft=[x+100/2-22/2,y-22]
#窗口
self.screen=screen
#速度
self.speed=20
def update(self):
#修改子弹坐标
self.rect.top-=self.speed
#如果子弹移出屏幕上方 则销毁子弹对象
if self.rect.top<-22:
self.kill()
#敌方子弹类
#属性
class EnemyBullet(pygame.sprite.Sprite):
def __init__(self,screen,x,y):
# 精灵类初始化
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load('./feiji/bullet1.png')
# 获得矩形对象
self.rect = self.image.get_rect()
self.rect.topleft = [x + 50 / 2 - 8 / 2, y+39]
# 窗口
self.screen = screen
# 速度
self.speed = 20
def update(self):
# 修改子弹坐标
self.rect.top += self.speed
# 如果子弹移出屏幕上方 则销毁子弹对象
if self.rect.top >Manager.bg_size[1]:
self.kill()
class GameSound(object):
def __init__(self):
pygame.mixer.init() # 音乐模块初始化
pygame.mixer.music.load('./feiji/qjzx.mp3')
pygame.mixer.music.set_volume(0.5) #声音大小
self._bomb=pygame.mixer.Sound('./feiji/baozha.mp3')
def playBackgroundMusic(self):
pygame.mixer.music.play(-1) #开始播放音乐 -1是无限循环,括号里填多少就播放几次
def playBomeSound(self):
pygame.mixer.Sound.play(self._bomb)
class Bomb(object):
#初始化碰撞
def __init__(self,screen,type):
self.screen =screen
if type=='enemy':
#加载爆炸资源
self.mImage=[pygame.image.load('./feiji/enemy0_down'+str(v)+'.png')for v in range(1,5)]
else:
self.mImage=[pygame.image.load('./feiji/hero_blowup_n'+str(v)+'.png') for v in range(1,5)]
#设置爆炸索引
self.mIndex=0
#爆炸设置
self.mPos=[0,0]
#是否可见
self.mVisible=False
#设置位置
def action(self,rect):
#触发爆炸方法draw
#爆炸的坐标
self.mPos[0]=rect.left
self.mPos[1]=rect.top
#打开爆炸的开关
self.mVisible=True
def draw(self):
if not self.mVisible:
return
self.screen.blit(self.mImage[self.mIndex],(self.mPos[0],self.mPos[1]))
self.mIndex+=1
if self.mIndex>=len(self.mImage):
#如果下标已经最后,代表爆炸结束
#下标重置
self.mIndex=0
self.mVisible=False
#地图
class GameBackground(object):
#初始化地图
def __init__(self,screen):
self.mImage1=pygame.image.load('./feiji/b1.jpg')
self.mImage2 = pygame.image.load('./feiji/b1.jpg')
#窗口
self.screen=screen
#辅助移动地图
self.y1=0
self.y2=-Manager.bg_size[1] #-936
#移动地图
def move(self):
self.y1+=2
self.y2+=2
if self.y1>=Manager.bg_size[1]:
self.y1=0
if self.y2 >=0:
self.y2 = -Manager.bg_size[1]
#绘制地图
def draw(self):
self.screen.blit(self.mImage1,(0,self.y1))
self.screen.blit(self.mImage2, (0, self.y2))
class Manager(object):
bg_size=(624,830)
#创建敌机定时器的id
create_enemy_id=10
#游戏结束倒计时的id
game_over_id=11
#游戏是否结束
is_game_over=False
#创建倒计时
over_time=3
def __init__(self):
pygame.init()
#创建窗口
self.screen=pygame.display.set_mode(Manager.bg_size,0,32)
#创建背景图片
# self.background=pygame.image.load('./feiji/background.png')
self.map=GameBackground(self.screen)
#初始化一个装玩家精灵的group
self.player=pygame.sprite.Group()
# 初始化一个装敌机精灵的group
self.enemys = pygame.sprite.Group()
# 初始化一个装玩家爆炸的对象
self.player_bomb=Bomb(self.screen,'player')
# 初始化一个装敌机爆炸的对象
self.enemy_bomb = Bomb(self.screen, 'enemy')
# 初始化一个声音播放的对象
self.sound=GameSound()
def exit(self):
print('退出')
pygame.quit()
exit()
def show_over_text(self):
#游戏结束 倒计时后重新开始
self.drawText('gameover %d'% Manager.over_time,100,Manager.bg_size[1]/2,textHeight=50,fontColor=[255,0,0])
def game_over_timer(self):
self.show_over_text()
#倒计时-1
Manager.over_time-=1
if Manager.over_time==0:
#参数2改为0 定时间停止
pygame.time.set_timer(Manager.game_over_id,0)
#倒计时后重新开始
Manager.over_time=3
Manager.is_game_over=False
self.start_game()
def start_game(self):
#重新开始游戏 有些类属性要清空
EnemyPlane.clear_bullets()
HeroPlane.clear_bullets() #会调用之前的静态方法并清空
manager=Manager()
manager.main()
def new_player(self):
#创建飞机对象 添加玩家的组
player=HeroPlane(self.screen)
self.player.add(player)
def new_enemy(self):
#创建敌方飞机对象 添加敌机的组
enemy=EnemyPlane(self.screen)
self.enemys.add(enemy)
#绘制文字
def drawText(self,text,x,y,textHeight=30,fontColor=(255,0,0),backgroundColor=None):
#通过字体文件获取字体对象
font_obj=pygame.font.Font('./feiji/PlayfairDisplaySemibold.ttf',textHeight)
#配置要显示的文字
text_obj=font_obj.render(text,True,fontColor,backgroundColor)
#获取要显示的对象rect
text_rect=text_obj.get_rect()
#设置显示对象的坐标
text_rect.topleft=(x,y)
#绘制字到指定的位置区域
self.screen.blit(text_obj,text_rect)
def main(self):
#播放音乐
self.sound.playBackgroundMusic()
#创建一个玩家
self.new_player()
#开启创建敌机的定时器
pygame.time.set_timer(Manager.create_enemy_id,1000) #每隔1000毫秒创造一个敌机
while True:
#把背景图片贴到窗口
# self.screen.blit(self.background,(0,0))
#移动地图
self.map.move()
#把地图贴到窗口上
self.map.draw()
#绘制文字
self.drawText('hp:10000',0,0)
if Manager.is_game_over:
#判断游戏结束才显示文字
self.show_over_text()
#循环遍历所有的事件
for event in pygame.event.get():
# 判断事件类型
if event.type == QUIT:
self.exit()
elif event.type==Manager.create_enemy_id:
#创建一个敌机
self.new_enemy()
elif event.type==Manager.game_over_id:
#定时器触发事件
self.game_over_timer()
#调用爆炸对象
self.player_bomb.draw()
self.enemy_bomb.draw()
#玩家飞机和敌方子弹碰撞的判断
if self.player.sprites():
isover=pygame.sprite.spritecollide(self.player.sprites()[0],EnemyPlane.enemy_bullets,True)
if isover:
Manager.is_game_over=True #标志游戏结束
pygame.time.set_timer(Manager.game_over_id,1000) #开始游戏倒计时
print('中弹')
self.player_bomb.action(self.player.sprites()[0].rect)
#把玩家飞机从精灵组中移除
self.player.remove(self.player.sprites()[0])
#爆炸声音
self.sound.playBomeSound()
#判断碰撞
iscollide=pygame.sprite.groupcollide(self.player,self.enemys,True,True)
if iscollide:
Manager.is_game_over=True #标志游戏结束
pygame.time.set_timer(Manager.game_over_id,1000) #开启游戏倒计时
items=list(iscollide.items())[0]
print(items)
x=items[0]
y=items[1][0]
#玩家爆炸图片
self.player_bomb.action(x.rect)
#敌机爆炸图片
self.enemy_bomb.action(y.rect)
#爆炸的声音
self.sound.playBomeSound()
# 玩家子弹和所有敌机的碰撞判断
is_enemy=pygame.sprite.groupcollide(HeroPlane.bullets,self.enemys,True,True)
if is_enemy:
items=list(is_enemy.items())[0]
y=items[1][0]
#敌机爆炸的图片
self.enemy_bomb.action(y.rect)
#爆炸的声音
self.sound.playBomeSound()
#玩家飞机子弹数量的显示
self.player.update()
#敌机和子弹的显示
self.enemys.update()
#刷新窗口内容
pygame.display.update()
pygame.init()
clock = pygame.time.Clock()
# 在游戏循环中使用clock.tick()方法来替代time.sleep()函数
clock.tick(60)
if __name__ == '__main__':
manager=Manager()
manager.main()
到了这里,关于Python代码下的飞机大战的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!