空调网站模版,太原网站制作报价,网址查询服务器地址,成都高端建设网站飞机大战 1.main类2.配置类3.游戏主类4.游戏资源类5.资源下载6.游戏效果 1.main类
启动游戏。
from MainWindow import MainWindow
if __name__ __main__:appMainWindow()app.run()2.配置类
该类主要存放游戏的各种设置参数。
#窗口尺寸
#窗口尺寸
import random
import p… 飞机大战 1.main类2.配置类3.游戏主类4.游戏资源类5.资源下载6.游戏效果 1.main类
启动游戏。
from MainWindow import MainWindow
if __name__ __main__:appMainWindow()app.run()2.配置类
该类主要存放游戏的各种设置参数。
#窗口尺寸
#窗口尺寸
import random
import pygame
WINDOWpygame.Rect(0,0,512,768)
#窗口名字
WINDOW_NAME飞机大战v1.0#地图索引
MAP_INDEXrandom.randint(1,5)#英雄子弹类型
HERO_BULLET_INDEX1
#敌人子弹类型
ENEMY_BULLET_INDEX3#敌机事件
ENEMY_EVENTpygame.USEREVENT#pygame用户事件整型有多个事件可以在后面1以区分#英雄子弹事件
BULLET_EVENTpygame.USEREVENT1#1区分事件
#敌机子弹事件
BULLET_ENEMY_EVENTpygame.USEREVENT2#2区分事件#英雄移动速度
HERO_MOVE_SPEED4
#英雄子弹移动速度
HERO_BULLET_MOVE_SPEED4
#英雄生命值
HERO_HP103.游戏主类
游戏主类主要由游戏窗口创建、精灵和精灵组的创建、游戏启动函数1.碰撞检测、2.事件处理、3.精灵组更新、4.窗口刷新等构成。
import pygame
from Config import *
from GameSprite import *
class MainWindow:def __init__(self):pygame.init()#游戏窗口初始化self.windowpygame.display.set_mode([WINDOW.width,WINDOW.height])pygame.display.set_caption(WINDOW_NAME)#背景音乐pygame.mixer.music.load(./source/music/bg.wav)pygame.mixer.music.set_volume(0.1)pygame.mixer.music.play(-1)#爆炸音效self.bombpygame.mixer.Sound(./source/music/bomb.wav)self.bomb.set_volume(0.2)#游戏分数self.score0self.hpHERO_HPself.pause_flag False # 暂停标志#FPS时钟self.clockpygame.time.Clock()#激活敌机定时器,参数事件、间隔时间mspygame.time.set_timer(ENEMY_EVENT,500)# 激活英雄子弹定时器,参数事件、间隔时间mspygame.time.set_timer(BULLET_EVENT,500)pygame.time.set_timer(BULLET_ENEMY_EVENT,2000)#创建精灵组self.create_sprite_group()#精灵组创建def create_sprite_group(self):#地图精灵组map1GameMap()map2GameMap(True)self.map_grouppygame.sprite.Group(map1,map2)#英雄精灵self.heroHero()self.hero_grouppygame.sprite.Group(self.hero)#敌机精灵组self.enemy_grouppygame.sprite.Group()#英雄子弹精灵组self.bullet_grouppygame.sprite.Group()#敌机子弹精灵组self.bullet_enemy_grouppygame.sprite.Group()#爆炸动画精灵组self.bomb_grouppygame.sprite.Group()# 菜单精灵组self.resume_nor Menu(./source/resume_nor.png) # 正在暂停按钮图标self.pause_nor Menu(./source/pause_nor.png) # 正在运行图标self.restart Menu(./source/again.png) # 重新开始图标self.menu_group pygame.sprite.Group()# 显示精灵组self.show_group pygame.sprite.Group()# 碰撞检测def collie_check(self):#1.英雄子弹与敌机for bullet1 in self.bullet_group:#第一个参数是精灵、第二个参数是精灵组、第三个参数为是否删除与该精灵碰撞的所有精灵返回值为与第一个参数碰撞的所有精灵列表eyspygame.sprite.spritecollide(bullet1,self.enemy_group,True)#判断子弹精灵是否与敌机精灵组有碰撞有则杀死所有敌机#表示有碰撞if len(eys)0:self.bomb.play()#发生碰撞播放爆炸音效self.score1#记录杀死的敌机数量bullet1.kill()#杀死发生碰撞的子弹精灵bomb_enemyBomb(eys[0])#将发生碰撞的敌传入爆炸类方便使用爆炸的具体位置self.bomb_group.add(bomb_enemy)#加入爆炸精灵组#2.敌机子弹与英雄bullet2pygame.sprite.spritecollide(self.hero,self.bullet_enemy_group,True)if len(bullet2)0:self.bomb.play()#发生碰撞播放爆炸音效self.hp-1#英雄与敌机子弹接触自身HP值-1#敌机与英雄enemyspygame.sprite.spritecollide(self.hero,self.enemy_group,True)if len(enemys)0:self.bomb.play()#发生碰撞播放爆炸音效self.hp-1#英雄与敌机接触自身HP值-1bomb_enemy2 Bomb(enemys[0])#将发生碰撞的敌传入爆炸类方便使用爆炸的具体位置self.bomb_group.add(bomb_enemy2)#加入爆炸精灵组# 英雄生命值为0暂停游戏并且显示重新开始if self.hp 0:self.hero.kill()self.enemy_group.empty()self.bullet_group.empty()self.bullet_enemy_group.empty()self.pause_flag Trueself.restart.rect.centerx self.window.get_rect().centerxself.restart.rect.centery self.window.get_rect().centeryself.menu_group.add(self.restart)# 更新精灵组位置并绘制def sprite_group_update_draw(self):#地图精灵组更新self.map_group.update()self.map_group.draw(self.window)#英雄精灵组更新self.hero_group.update()self.hero_group.draw(self.window)#敌机精灵组更新self.enemy_group.update()self.enemy_group.draw(self.window)#英雄子弹精灵组self.bullet_group.update()self.bullet_group.draw(self.window)#敌机子弹精灵组self.bullet_enemy_group.update()self.bullet_enemy_group.draw(self.window)#爆炸精灵组self.bomb_group.update()self.bomb_group.draw(self.window)# 菜单类精灵组self.menu_group.update()self.menu_group.draw(self.window)# 显示信息self.show_group.update()self.show_group.draw(self.window)#绘制数据 #游戏数据# 显示游戏信息self.score1 Show(得分, self.score)self.score1.rect.x 80self.score1.rect.y 0self.hp1 Show(生命值, self.hp)self.hp1.rect.x 200self.hp1.rect.y 0self.show_group.empty()self.show_group.add(self.score1, self.hp1)# 事件处理def handle_events(self):#pygame.event.get()获取当前时间帧的所有事件返回一个事件列表可以对此列表遍历for event in pygame.event.get():if event.typepygame.QUIT:pygame.quit()exit()#用户事件1固定时间生成敌机时间可以在窗口初始化代码中修改if event.typepygame.USEREVENT:self.enemyEnemy()self.enemy_group.add(self.enemy)#用户事件2固定时间生成敌机子弹时间可以在窗口初始化代码中修改if event.typepygame.USEREVENT2:#固定时间生成敌机子弹需要遍历敌机精灵组获取所有已经存在的敌机精灵在对应的位置上绘制敌机子弹for enemy_sprite in self.enemy_group:self.bullet_enemy Bullet(enemy_sprite.speed 1,True)self.bullet_enemy.rect.centerx enemy_sprite.rect.centerxself.bullet_enemy.rect.y enemy_sprite.rect.bottom#将敌机子弹精灵添加到敌机子弹精灵组self.bullet_enemy_group.add(self.bullet_enemy)#用户事件3固定时间生成英雄子弹时间可以在窗口初始化代码中修改if event.typepygame.USEREVENT1:self.bullet_heroBullet(-HERO_BULLET_MOVE_SPEED)#英雄子弹飞行方向与敌机子弹飞行方向相反#根据英雄的当前位置来设置英雄子弹的位置self.bullet_hero.rect.centerxself.hero.rect.centerxself.bullet_hero.rect.yself.hero.rect.y-self.bullet_hero.rect.height# 将英雄飞机子弹精灵添加到英雄子弹精灵组self.bullet_group.add(self.bullet_hero)# 按下ESC切换暂停if event.type pygame.KEYDOWN and event.key pygame.K_ESCAPE:self.pause_flag not self.pause_flag # 切换暂停状态# 鼠标点击切换暂停if event.type pygame.MOUSEBUTTONDOWN and event.button pygame.BUTTON_LEFT:if self.pause_nor.rect.collidepoint(event.pos):self.pause_flag not self.pause_flag#pygame.key.get_pressed()获取当前时间帧的所有键盘事件并返回一个列表遍历列表控制英雄上下左右移动keys_eventpygame.key.get_pressed()if keys_event[pygame.K_a] or keys_event[pygame.K_LEFT]:self.hero.x_speed-HERO_MOVE_SPEEDelif keys_event[pygame.K_d] or keys_event[pygame.K_RIGHT]:self.hero.x_speedHERO_MOVE_SPEEDelse:self.hero.x_speed 0if keys_event[pygame.K_w] or keys_event[pygame.K_UP]:self.hero.y_speed-HERO_MOVE_SPEEDelif keys_event[pygame.K_s] or keys_event[pygame.K_DOWN]:self.hero.y_speedHERO_MOVE_SPEEDelse:self.hero.y_speed0# 暂停状态下if self.pause_flag:if self.pause_nor in self.menu_group:self.menu_group.remove(self.pause_nor) # 将运行图标的精灵移除self.menu_group.add(self.resume_nor)pygame.mixer.music.pause()#暂停背景音乐# 非暂停状态else:if self.resume_nor in self.menu_group:self.menu_group.remove(self.resume_nor) # 将暂停图标的精灵移除self.menu_group.add(self.pause_nor)pygame.mixer.music.unpause()# 显示游戏信息self.score1 Show(得分, self.score)self.score1.rect.x 80self.score1.rect.y 0self.hp1 Show(生命值, self.hp)self.hp1.rect.x 200self.hp1.rect.y 0self.show_group.empty()self.show_group.add(self.score1, self.hp1)#游戏主框架def run(self):pygame.init()while True:#暂停状态while self.pause_flag:self.clock.tick(60)for event in pygame.event.get():if event.type pygame.QUIT:pygame.quit()exit()# 按下ESC暂停if event.type pygame.KEYDOWN and event.key pygame.K_ESCAPE:self.pause_flag not self.pause_flag # 切换暂停状态# 鼠标点击切换暂停if event.type pygame.MOUSEBUTTONDOWN and event.button pygame.BUTTON_LEFT:if self.pause_nor.rect.collidepoint(event.pos):self.pause_flag not self.pause_flag# 当英雄死亡之后点击重新开始if event.type pygame.MOUSEBUTTONDOWN and event.button pygame.BUTTON_LEFT:pos pygame.mouse.get_pos()# 如果英雄死亡了点击重新开始if self.hp 0 and self.restart.rect.collidepoint(pos):self.menu_group.remove(self.restart)self.score 0self.hero_group.add(self.hero)self.hp HERO_HPself.pause_flag False# 切换到非暂停状态if not self.pause_flag:break#正常运行while not self.pause_flag:self.clock.tick(60) # FPS#碰撞检测self.collie_check()# 事件处理self.handle_events()#更新精灵组self.sprite_group_update_draw()# 窗口刷新pygame.display.update()# 切换到暂停状态if self.pause_flag:break
4.游戏资源类
游戏资源类主要包括各种游戏相关元素精灵、主要有基础精灵类、敌机精灵类、子弹精灵类、英雄飞机精灵类、爆炸动画精灵类等。
import pygame
from Config import *
import random
#精灵类————基类定义了基本的导入图片操作以及图片垂直移动操作
class GameSprite(pygame.sprite.Sprite):def __init__(self,image_url,speed0):super().__init__()self.imagepygame.image.load(image_url)self.rectself.image.get_rect()self.speedspeeddef update(self, *args, **kwargs):self.rect.yself.speed
#游戏地图类地图由两张完全一样的图片拼接构成其中两张图片的起始和末尾要无缝衔接
#第一张图片起始位置与窗口完全重合第二张图片的起始位置在第一张图片的上方
class GameMap(GameSprite):#is_1表示是否是第二张图片def __init__(self,is_1False):#地图给了5张保证地图索引在1~5否则随机给一个1~5self.map_indexMAP_INDEX if 1MAP_INDEX5 else random.randint(1,5)map_filenamef./source/map/map-{self.map_index}.jpgsuper().__init__(map_filename,2)if is_1:self.rect.y-WINDOW.height#第二张图片的起始位置在第一张图片的上方def update(self):#更新图像的位置super().update()#如果地图图片完全运动到了窗口最下方就将这张图片的位置移动到窗口的最上方作为新的起始位置if self.rect.yWINDOW.height:self.rect.y-WINDOW.height
#英雄飞机类初始化定义比较简单
class Hero(GameSprite):def __init__(self):super().__init__(./source/plane/hero.png)#定义英雄飞机出生在窗口中的具体位置self.rect.centerxWINDOW.centerxself.rect.yWINDOW.height-120#初始移动速度为0静止状态self.x_speed0self.y_speed0def update(self, *args, **kwargs):#水平方向移动self.rect.xself.x_speed#垂直方向移动self.rect.yself.y_speed#判断上、下、左、右四个边界条件如果移动到了边界让飞机停在原位if self.rect.x0:self.rect.x0if self.rect.xWINDOW.width-self.rect.width:self.rect.xWINDOW.width-self.rect.widthif self.rect.y0:self.rect.y0if self.rect.yWINDOW.height-self.rect.height:self.rect.yWINDOW.height-self.rect.height
#敌机类
class Enemy(GameSprite):def __init__(self):#敌机有7中飞机随机生成self.enemy_urlf./source/plane/enemy-{random.randint(1,7)}.png#敌机的垂直速度也是随机生成1,3super().__init__(self.enemy_url,random.randint(1,3))#敌机的初始水平位置需要随机生成范围就是0,WINDOW.width-self.rect.widthself.rect.xrandom.randint(0,WINDOW.width-self.rect.width)#敌机的垂直位置y是固定值保证敌机出现的位置在窗口之外self.rect.y-self.rect.height#敌机水平方向的移动速度随机生成self.x_speedrandom.randint(-1,1)def update(self, *args, **kwargs):#调用父类的update()函数super().update()#父类函数不够用的情况下直接补充self.rect.xself.x_speed#水平移动#如果到达左右边界则反向运动if self.rect.x0 or self.rect.xWINDOW.width-self.rect.width:self.x_speed-self.x_speed#敌机出了窗口底部则杀死此敌机精灵if self.rect.yWINDOW.height:self.kill()
#子弹类英雄飞机子弹和敌机子弹
class Bullet(GameSprite):#is_enemy表示是否是敌机敌机和英雄飞机使用的子弹图片不同def __init__(self,speed,is_enemyFalse):if is_enemy:self.bullet_indexENEMY_BULLET_INDEXelse:self.bullet_index HERO_BULLET_INDEXbullet_filename f./source/bullet/bullet_{self.bullet_index}.pngself.speedspeedsuper().__init__(bullet_filename,self.speed)#由于敌机和英雄飞机是相对运动资源图片都是正向的所以如果是敌机子弹则需要对子弹图片做旋转180°操作if is_enemy:##flip(翻转的图片、是否绕x轴翻转、是否绕y轴翻转)self.imagepygame.transform.flip(self.image,False,True)def update(self, *args, **kwargs):#垂直方向移动super().update()#超出屏幕则杀死此精灵if self.rect.y-self.rect.height or self.rect.yWINDOW.heightself.rect.height:self.kill()
#爆炸动画类
class Bomb(pygame.sprite.Sprite):def __init__(self,sprite1):super().__init__()#导入所有动画的图片self.images[pygame.image.load(f./source/bomb/bomb-{bomb_index}.png) for bomb_index in range(1,8)]self.sprite1sprite1self.interval 5 # 播放每一张图片的间隔 5帧self.interval_index 0 #帧数计数器 初始值为0self.image_index0#图片索引 初始值为0self.image self.images[self.image_index]self.rect self.image.get_rect()self.rect.x self.sprite1.rect.xself.rect.y self.sprite1.rect.ydef update(self, *args, **kwargs):self.interval_index1#每一帧进入update函数帧计数器加1#当计数器到达设置值时切换图片if self.interval_indexself.interval:self.imageself.images[self.image_index]#帧计数器归零self.interval_index0#切换图片self.image_index1#当所有图片都播放完毕之后杀死此精灵对象if self.image_indexlen(self.images):self.kill()
#菜单类显示控制游戏的暂停、恢复游戏、重新开始游戏
class Menu(GameSprite):def __init__(self,image_url):super().__init__(image_url)def update(self, *args, **kwargs):pass
#显示游戏相关信息类可以显示游戏中得分、英雄生命值等
class Show(pygame.sprite.Sprite):def __init__(self,name,var):super().__init__()pygame.font.init()font1 pygame.font.SysFont(华文宋体, 25) # 加载系统自带字体text f{name}:{var} # 编辑文本text font1.render(text, True, (255, 255, 0)) # 渲染字体字符串抗锯齿字体颜色背景颜色self.imagetextself.rectself.image.get_rect()
5.资源下载
链接:资源 提取码9mje
6.游戏效果