飞机大战(源码+素材)

news/2025/2/21 7:04:55/

素材:https://fy98.cn
最近自学了一些爬虫知识,没有及时更新博客。这两天花时间做了一个类似飞机大战的游戏,再次放出源码以及思路。

需要实现的地方:
主角动作 碰撞效果 敌机状态 分数记录 游戏暂停 子弹效果 子弹伤害
设计思路:
设计游戏框架背景循环图
设计主角动作 操控 (鼠标或键盘都可)
产生敌机工厂 产生敌机
设计子弹效果 主角发射子弹
设计奖励效果
设计子弹 主角 敌机 奖励 相互碰撞的结果
主函数 循环事件
-----------大概思路就是这些 ----------------
下面先放出效果图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
-----------放出代码思路-------------

import pygame,os,sys,math,time,random
from pygame.locals import *#分析飞机大战:#1.开始界面: 背景,标题,按钮 ,底部动画,背景音乐music
# 开始界面类:
#        属性: 图片 , 屏幕
#        方法: 显示
#开始界面 图片
startImgs=[pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\bk2.jpg"),(640,825)),   #开始界面背景图pygame.image.load(r"Game_Main\Img_File\title2.png"),                                           #开始界面标题pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\icon2.png"), (220, 60)),                                      #开始按钮图标pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\loading.png"),(640,640)),      #背景衬托图  透明圆pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\music_stop.png"),(45,45)),     #音乐暂停按钮pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\music_start.png"),(45,45)),    #音乐开始按钮pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\mouse3.png"),(30,30)),         #鼠标指针pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\icon2.png"),(284,82)),      #开始按钮图标 变换图pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\bk1.png"),(640,850)),    #850-825     #游戏内背景1pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\bk4.png"),(640,850)),         #游戏内背景2# pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\bk6.jpeg"),(640,825)),   #载入界面图]
#加载界面底部四张图 组成动画效果
statBotImg=[pygame.image.load(r"Game_Main\Img_File\1.png"),
pygame.image.load(r"Game_Main\Img_File\2.png"),
pygame.image.load(r"Game_Main\Img_File\3.png"),
pygame.image.load(r"Game_Main\Img_File\4.png"),
pygame.image.load(r"Game_Main\Img_File\5.png"),
pygame.image.load(r"Game_Main\Img_File\6.png"),
pygame.image.load(r"Game_Main\Img_File\7.png"),
pygame.image.load(r"Game_Main\Img_File\8.png"),
pygame.image.load(r"Game_Main\Img_File\9.png"),
pygame.image.load(r"Game_Main\Img_File\10.png"),
pygame.image.load(r"Game_Main\Img_File\11.png"),]
#开始界面类
class StartPanel:#判断鼠标是否在开始游戏按钮上isIn_Start=False#判断鼠标是否在BGM按钮上isIn_BGM=False#判断是否暂停BGMisOn_BGM=Truedef __init__(self,screen,imgs=startImgs):self.screen=screenself.imgs=imgs# self.btmimgs=btmimgs#控制标题浮动self.sin_y=0#显示开始界面def Show(self):self.screen.blit(self.imgs[0],(0,0))#背景:#开始界面 游戏标题 如果鼠标停留 标题回到初始位置Place_title=self.screen.blit(self.imgs[1],(180+30*math.cos(self.sin_y),100+50*math.sin(self.sin_y)))tempC=Place_title.collidepoint(pygame.mouse.get_pos())self.sin_y += 0.05if self.sin_y>=100:   #约束变量累加过大  产生的系统卡顿self.sin_y=0elif tempC:Place_title=tempC#BGM开关if StartPanel.isOn_BGM==True:Place_BGM=self.screen.blit(self.imgs[4], (30, 740))tempA = Place_BGM.collidepoint(pygame.mouse.get_pos())StartPanel.isIn_BGM = tempAelse:Place_BGM = self.screen.blit(self.imgs[5], (33, 743))tempA = Place_BGM.collidepoint(pygame.mouse.get_pos())StartPanel.isIn_BGM = tempA#开始界面 开始按钮Place_StartBtm=self.screen.blit(self.imgs[2],(210,350))tempB=Place_StartBtm.collidepoint(pygame.mouse.get_pos())StartPanel.isIn_Start=tempB# self.isIn_Start=tempBif StartPanel.isIn_Start:# if self.isIn_Start:self.screen.blit(self.imgs[7], (185, 340))#开始界面 背景衬托图  透明圆self.screen.blit(self.imgs[3],(0,66))# 鼠标指针temp=pygame.mouse.get_pos()self.screen.blit(self.imgs[6], pygame.mouse.get_pos())
#游戏加载界面
loadImages=[pygame.transform.scale(pygame.image.load("Game_Main/Img_File/bk5.png"),(640,800)),pygame.transform.scale(pygame.image.load("Game_Main/Img_File/bk6.png"),(150,160)),
]
class LoadWindows():#控制图片变换 时间load_time=Falsetime_add=0def __init__(self, screen, pos,imgs=loadImages,btmimgs=statBotImg):self.screen=screenself.imgs=loadImages[0]self.rect=self.imgs.get_rect()self.rect.topleft=posself.image=imgsself.btmimgs = btmimgs# 控制加载界面底部图片动画self.btmIndex = 0self.btmAdd = 0  # 累加变量 控制动画速度def Show(self):#判断 加载界面是否完成if self.load_time==False:self.time_add += 1#渲染图片self.screen.blit(self.imgs, self.rect)self.screen.blit(self.image[1], (10, 10))if self.time_add == 260:self.load_time = Trueself.Move()#渲染文字self.screen.blit(font_tips.render("Tips:",True,pygame.Color("black")),(25,540))self.screen.blit(font_tips.render("1.您可通过F1键更换键鼠操作模式。",True,pygame.Color("red")),(50,580))self.screen.blit(font_tips.render("2.游戏主界面左下角可关闭背景音乐。ESC键可强制返回主界面",True,pygame.Color("red")),(50,610))self.screen.blit(font_tips.render("3.空格键可暂停游戏,再次按下即可开启。",True,pygame.Color("red")),(50,640))self.screen.blit(font_tips.render("4.更多精彩内容将会陆续更新。",True,pygame.Color("red")),(50,670))# self.screen.blit(font.render("最终分数:%s"%heroObj.score, True, pygame.Color("green")), (self.rect.center[0]-230,self.rect.center[1]-75))#底部四个图 形成动图self.screen.blit(self.btmimgs[self.btmIndex],(245,700))self.btmAdd+=1if self.btmAdd==25:    #控制图片转换速度self.btmIndex+=1self.btmAdd=0if self.btmIndex>=11:    #限制转换图片索引 使其循环self.btmIndex=0def Move(self):if self.rect.x==0:self.rect.move(0,0)else:self.rect = self.rect.move(-32, 40)
#2.游戏界面类
#游戏界面背景
class GameBG:def __init__(self,image1,image2,screen1,screen2,speed1,speed2) -> None:#背景1  背景2  背景2 在上层 speed小self.image1=image1self.image2=image1.copy()self.rect1=self.image1.get_rect()self.rect2=self.image2.get_rect()self.rect2.topleft=(0,-850)self.image3 = image2self.image4 = image2.copy()self.rect3 = self.image3.get_rect()self.rect4 = self.image4.get_rect()self.rect4.topleft = (0, -850)self.screen1=screen1self.speed1 = speed1self.screen2 = screen2self.speed2 = speed2def Show(self):#背景底板1self.rect1 = self.rect1.move(0, self.speed1)self.rect2 = self.rect2.move(0, self.speed1)if self.rect1.y>=825:self.rect1.y=self.rect2.y-850if self.rect2.y>=825:self.rect2.y=self.rect1.y-850self.screen1.blit(self.image1, self.rect1)self.screen1.blit(self.image2, self.rect2)#背景 云2self.rect3 = self.rect3.move(0, self.speed2)self.rect4 = self.rect4.move(0, self.speed2)if self.rect3.y>=825:self.rect3.y = self.rect4.y - 850if self.rect4.y >= 825:self.rect4.y = self.rect3.y - 850self.screen2.blit(self.image3, self.rect3)self.screen2.blit(self.image4, self.rect4)
#主角图片
GameImg=[pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\hero3.png"), (68, 68)),# pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\hero3.png"),(68,68)),# pygame.image.load(r"Game_Main\Img_File\hero3.png"),       #主角1# pygame.image.load(r"Game_Main\Img_File\hero3.png"),       #主角2pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\hero4.png"),(68,68)),pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\heroskill.png"),(120,120)),pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\planpigu4.png"),(20,20)),pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\planpigu4.png"),(40,40)),pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\planpigu4.png"),(60,80)),pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\planpigu4.png"),(80,80)),pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\planpigu4.png"),(100,100)),pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\planpigu4.png"),(80,80)),pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\planpigu4.png"),(60,60)),pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\planpigu4.png"),(40,40)),pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\planpigu4.png"),(20,20)),pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\planpigu4.png"),(0,0)),pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\safetao.png"),(200,200)),
]
#主角类
class Hero:#人物移动up = Falsedown = Falseleft = Falseright = False#判断人物是否死亡isHeroDead=False#isIn判断鼠标在主角的上方isIn=False#判断切换键鼠操作isCMK=False#子弹类 约束速度 类型buttleAdd=0#子弹类 控制弹道buttleCurve=0#BUG_1模式  BUG1持续时间On_Off_BUG1=FalseBUG1_time=0#主角动态屁股控制herf_pigu=3#主角动态屁股速度herf_pigu_Add=0#检测主角安全状态以及安全时间isSafe=FalsesafeTime=0#死亡画面deadIndex=0deadAdd=0# 可释放大招次数R_skill = 0#image2 screen2 speed2 都是最上层云的属性 其余为主角def __init__(self,image,pos,screen,speed,hp,score,bulletspeed,image2,screen2,speed2):self.image = GameImg[0]self.rect = self.image.get_rect()  # 获得矩形对象self.rect.topleft = pos  # 初始化位置self.screen = screenself.speed = speedself.hp = hpself.score = scoreself.bulletspeed=bulletspeed#控制子弹速度 以及子弹图片self.imgs=imageself.heroAdd=0self.heroIndex=0#云背景self.image3 = image2self.image4 = image2.copy()self.rect3 = self.image3.get_rect()self.rect4 = self.image4.get_rect()self.rect4.topleft = (0, -850)self.speed2=speed2self.screen2=screen2def Move(self): #移动# 键盘移动if Hero.up:self.rect = self.rect.move(0, -self.speed)elif Hero.down:self.rect = self.rect.move(0, self.speed)elif Hero.left:self.rect = self.rect.move(-self.speed, 0)elif Hero.right:self.rect = self.rect.move(self.speed, 0)#鼠标移动if Hero.isCMK:self.rect.center=pygame.mouse.get_pos()#更换键盘操作  默认else:Hero.isIn=self.rect.collidepoint(pygame.mouse.get_pos())#约束移动区间640 800   68   68if self.rect.x>=572:self.rect.x=572if self.rect.x<=0:self.rect.x=0if self.rect.y>=732:self.rect.y=732if self.rect.y<=0:self.rect.y=0#显示主角def Show(self):if self.hp>0:self.Move()self.Collide()self.screen.blit(self.imgs[self.herf_pigu], (self.rect.bottomleft[0]+10,self.rect.midbottom[1]))#控制喷气速度self.herf_pigu_Add += 1if self.herf_pigu_Add==4:self.herf_pigu += 1self.herf_pigu_Add=0if self.herf_pigu==13:self.herf_pigu=3#主角是否开启BUG1模式 切换不同人物特if self.On_Off_BUG1 ==False:self.screen.blit(self.imgs[0], self.rect)else:self.screen.blit(self.imgs[1], self.rect)# self.screen.blit(self.imgs[2], (self.rect[0]-25,self.rect[1]-20))#发射子弹#开启BUG1模式if self.On_Off_BUG1 == True:heroObj.BUG1_time+=1#控制子弹速度 和 子弹的变换样式self.buttleAdd += 1self.buttleCurve+=0.1if self.buttleAdd>3:# Bullet(BulletImages[2],self.screen,(self.rect.midtop[0]-7,self.rect.midtop[1]),speed=self.bulletspeed)Bullet(BulletImages[1],self.screen,(self.rect.midtop[0]-25+(30*math.sin(self.buttleCurve)),self.rect.midtop[1]),speed=self.bulletspeed+15)Bullet(BulletImages[0],self.screen,(self.rect.midtop[0]+18+(-30*math.sin(self.buttleCurve)),self.rect.midtop[1]),speed=self.bulletspeed+15)Bullet1(BulletImages[3],self.screen,(self.rect.midtop[0]-20,self.rect.midtop[1]),speed=self.bulletspeed+15)# Bullet1(BulletImages[3],self.screen,(self.rect.midtop[0]-20-(40*math.sin(self.buttleCurve)),self.rect.midtop[1]),speed=self.bulletspeed+15)Bullet2(BulletImages[3],self.screen,(self.rect.midtop[0]-20,self.rect.midtop[1]),speed=self.bulletspeed+15)# Bullet2(BulletImages[3],self.screen,(self.rect.midtop[0]-20-(40*math.sin(self.buttleCurve)),self.rect.midtop[1]),speed=self.bulletspeed+15)self.buttleAdd = 0#啥都不开启 普通模式elif self.On_Off_BUG1==False:self.buttleAdd += 1if self.buttleAdd == 10:Bullet(BulletImages[2],self.screen,(self.rect.midtop[0]-7,self.rect.midtop[1]),speed=self.bulletspeed+50)self.buttleAdd = 0#约束弹道函数 优化运行if self.buttleCurve>10:self.buttleCurve=0#遍历子弹列表 打印for bullet1 in Bullettemp:bullet1.Show()#控制 BUG1的时间if self.BUG1_time > 100:self.BUG1_time = 0self.On_Off_BUG1 = False# for bullet in Bullettemp2:#     bullet.Show2()#背景 云# self.rect3 = self.rect3.move(0, self.speed2)# self.rect4 = self.rect4.move(0, self.speed2)# if self.rect3.y>=825:#     self.rect3.y = self.rect4.y - 850# if self.rect4.y >= 825:#     self.rect4.y = self.rect3.y - 850# self.screen2.blit(self.image3, self.rect3)# self.screen2.blit(self.image4, self.rect4)else:self.Dead()soundlist[4].play()def Dead(self): #死亡global isPlay#播放死亡动画self.screen.blit(deadImages[self.deadIndex],self.rect)soundlist[0].play()self.deadAdd+=1if self.deadAdd==4:self.deadIndex+=1self.deadAdd=0if self.deadIndex==len(deadImages):self.deadIndex=0# 判断分数更新if self.score > history:UpdateScore(self.score)heroObj.isHeroDead=True# isPlay = Falsedef Collide(self): #碰撞#碰撞奖励tempReward=pygame.sprite.spritecollideany(self,rewardlist,collided=pygame.sprite.collide_mask)if tempReward!=None:#判断! 当hero血量满时 血不增加 并且 补给血不会消失if tempReward.tag==3 and self.hp>=10:passelse:if tempReward.tag==1:self.On_Off_BUG1=Trueself.BUG1_time=0elif tempReward.tag==2:for i in enemylist:i.hp=0elif tempReward.tag==3 and self.hp<10:self.hp+=1if tempReward in rewardlist:rewardlist.remove(tempReward)#碰撞敌机if self.isSafe==False:tempEnemy=pygame.sprite.spritecollideany(self,enemylist,collided=pygame.sprite.collide_mask)if tempEnemy!=None:tempEnemy.hp=0self.hp -= 1self.isSafe=Trueelse:self.safeTime+=1self.screen.blit(GameImg[13],(self.rect[0]-68,self.rect[1]-68))if self.safeTime==100:self.safeTime=0self.isSafe=False
#3.子弹类
#子弹图片
BulletImages=[pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\bullet6.png"), (15, 30)),pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\bullet5.png"), (15, 30)),pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\bullet3.png"), (15, 30)),pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\bullet4.png"), (50, 30)),pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\bullet3.png"), (15, 30)),pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\bullet3.png"), (15, 30)),
]
#临时存储子弹列表
Bullettemp=[]
class Bullet:def __init__(self,image,screen,pos,speed):self.image = imageself.screen=screenself.rect=self.image.get_rect()    #获得主角对象self.rect.center=pos      #初始化位置self.speed=speedBullettemp.append(self)soundlist[1].play()def Show(self):self.rect=self.rect.move(0,-self.speed)   #移动self.screen.blit(self.image,self.rect)    #位置#消失子弹if self.rect.y < -50:if self in Bullettemp:Bullettemp.remove(self)#碰撞检测self.Collide()def Collide(self):temp=pygame.sprite.spritecollideany(self,enemylist,collided=pygame.sprite.collide_mask)if temp!=None:temp.hp-=1if self in Bullettemp:Bullettemp.remove(self)
#散弹子弹向右
class Bullet1(Bullet):def __init__(self, image, screen, pos, speed):super().__init__(image, screen, pos, speed)def Show(self):self.rect=self.rect.move(20,-self.speed)   #移动self.screen.blit(self.image, self.rect)  # 位置# 消失子弹if self.rect.y < -50:if self in Bullettemp:Bullettemp.remove(self)# 碰撞检测self.Collide()def Collide(self):super().Collide()
#散弹子弹向左
class Bullet2(Bullet):def __init__(self, image, screen, pos, speed):super().__init__(image, screen, pos, speed)def Show(self):self.rect=self.rect.move(-20,-self.speed)   #移动self.screen.blit(self.image, self.rect)  # 位置# 消失子弹if self.rect.y < -50:if self in Bullettemp:Bullettemp.remove(self)# 碰撞检测self.Collide()def Collide(self):super().Collide()
#4.敌机类
#敌机图片
enemyimage=[pygame.transform.scale(pygame.image.load("Game_Main/Img_File/enemyair1.png"),(60,60)),pygame.transform.scale(pygame.image.load("Game_Main/Img_File/enemyair2.png"),(60,60)),pygame.transform.scale(pygame.image.load("Game_Main/Img_File/enemyair3.png"),(60,60)),pygame.transform.scale(pygame.image.load("Game_Main/Img_File/enemyair4.png"), (120, 120)),pygame.transform.scale(pygame.image.load("Game_Main/Img_File/enemyair5.png"),(120,120)),pygame.transform.scale(pygame.image.load("Game_Main/Img_File/enemyair6.png"),(120,120)),pygame.transform.scale(pygame.image.load("Game_Main/Img_File/enemyair7.png"),(240,240)),pygame.transform.scale(pygame.image.load("Game_Main/Img_File/enemyair8.png"),(240,240)),pygame.transform.scale(pygame.image.load("Game_Main/Img_File/enemyair9.png"),(240,240)),pygame.transform.scale(pygame.image.load("Game_Main/Img_File/enemyair10.png"),(240,240)),
]
#存放敌机飞机
enemylist=[]
#敌机类
class Enemy:def __init__(self,imgs,screen,speed,pos,hp,tag):self.imgs=imgsself.image=imgsself.screen=screenself.speed=speedself.rect=self.image.get_rect()self.rect.midbottom=posself.tag=tagself.hp=hp#死亡动画索引self.deadIndex=0self.deadAdd=0#存放新产生飞机enemylist.append(self)def Show(self):if self.hp>0:self.Move()self.screen.blit(self.image,self.rect)else:self.Dead()def Move(self):self.rect=self.rect.move(0,self.speed)if self.rect.y>=801:if self in enemylist:enemylist.remove(self)def Dead(self):#播放死亡动画self.screen.blit(deadImages[self.deadIndex],self.rect)soundlist[0].play()self.deadAdd+=1if self.deadAdd==2:self.deadIndex+=1self.deadAdd=0if self.deadIndex==len(deadImages):if self.tag == 1:heroObj.score += 1elif self.tag == 2:heroObj.score += 3elif self.tag == 3:heroObj.score += 5enemylist.remove(self)def Collide(self):pass
#5.奖励类
rewardImage=[pygame.transform.scale(pygame.image.load("Game_Main/Img_File/reward1.png"),(80,80)),pygame.transform.scale(pygame.image.load("Game_Main/Img_File/reward2.png"),(80,80)),pygame.transform.scale(pygame.image.load("Game_Main/Img_File/reward3.png"),(80,80)),
]
rewardlist=[]   #存放奖励
class Reward:def __init__(self,image,screen,speed,pos,tag):self.image=imageself.screen=screenself.speed=speedself.rect=self.image.get_rect()self.rect.midbottom=posself.tag=tag#存放新产生奖励rewardlist.append(self)def Show(self):self.Move()self.screen.blit(self.image,self.rect)def Move(self):self.rect=self.rect.move(0,self.speed)if self.rect.y>=801:if self in rewardlist:rewardlist.remove(self)
#工厂 类 敌机 和奖励
class Factory:createAdd=0createrewardAdd=0@staticmethoddef CreateEnemy():#随机产生敌机Factory.createAdd+=1if Factory.createAdd==20:ranNum=random.randint(1,100)if ranNum<=70:Enemy(enemyimage[random.randint(0,2)],screen=screen,speed=random.randint(4,6),pos=(random.randint(0,580),-60),hp=1,tag=1)elif ranNum<=90:Enemy(enemyimage[random.randint(3,5)],screen=screen,speed=random.randint(2,3),pos=(random.randint(0,520),-120),hp=3,tag=2)elif ranNum<=100:Enemy(enemyimage[random.randint(6,9)],screen=screen,speed=random.randint(1,2),pos=(random.randint(0,400),-240),hp=10,tag=3)Factory.createAdd=0soundlist[3].set_volume(0.05)# soundlist[3].play()for temp in enemylist:temp.Show()@staticmethoddef CreateReward():Factory.createrewardAdd+=1if Factory.createrewardAdd==100:ranNum=random.randint(1,10)if ranNum==1:Reward(rewardImage[0],screen=screen,speed=random.randint(4,6),pos=(random.randint(0,560),-81),tag=1)elif ranNum==2:Reward(rewardImage[1],screen=screen,speed=random.randint(4,6),pos=(random.randint(0,560),-81),tag=2)elif ranNum == 3:Reward(rewardImage[2], screen=screen, speed=random.randint(4, 6), pos=(random.randint(0, 560), -81),tag=3)Factory.createrewardAdd=0for i in rewardlist:i.Show()
#用户死亡结束画面类
#死亡动画动图
deadImages=[pygame.transform.scale(pygame.image.load("Game_Main/Img_File/da_0.png"),(80,40)),pygame.transform.scale(pygame.image.load("Game_Main/Img_File/da_1.png"),(80,80)),pygame.transform.scale(pygame.image.load("Game_Main/Img_File/da_2.png"),(80,80)),pygame.transform.scale(pygame.image.load("Game_Main/Img_File/da_3.png"),(80,80)),pygame.transform.scale(pygame.image.load("Game_Main/Img_File/da_4.png"),(80,80)),pygame.transform.scale(pygame.image.load("Game_Main/Img_File/da_5.png"),(80,80)),pygame.transform.scale(pygame.image.load("Game_Main/Img_File/da_6.png"),(80,80)),pygame.transform.scale(pygame.image.load("Game_Main/Img_File/da_7.png"),(80,80)),pygame.transform.scale(pygame.image.load("Game_Main/Img_File/da_8.png"),(80,80)),
]
#死亡界面
gameImgs=[pygame.transform.scale(pygame.image.load("Game_Main/Img_File/gameover1.jpg"),(640,800)),pygame.transform.scale(pygame.image.load("Game_Main/Img_File/gameover2.png"),(611,412)),pygame.transform.scale(pygame.image.load("Game_Main/Img_File/gameover3.png"), (150, 100)),pygame.transform.scale(pygame.image.load("Game_Main/Img_File/gameover4.png"), (180, 75)),pygame.transform.scale(pygame.image.load("Game_Main/Img_File/gameover4.png"), (220, 90)),pygame.transform.scale(pygame.image.load("Game_Main/Img_File/gameover5.png"), (64, 64)),pygame.transform.scale(pygame.image.load("Game_Main/Img_File/gameover5.png"), (80, 80)),
]
class GameOver:#判断鼠标在哪个位置上isMouse_In_end=FalseisMouse_In_again = Falsedef __init__(self,imgs,pos,screen) -> None:self.imgs=gameImgsself.image=gameImgs[0]self.rect=self.image.get_rect()self.rect.topleft=posself.screen=screendef Show(self):pygame.mouse.set_visible(True)#显示背景板self.screen.blit(gameImgs[0], self.rect)#显示美女self.screen.blit(gameImgs[1],(self.rect))#GameOver图标self.screen.blit(gameImgs[2], (self.rect.midtop[0],self.rect.midtop[1]+30))#继续游戏图标again_icon=self.screen.blit(gameImgs[3], (self.rect.center[0]-80,self.rect.center[1]+30))self.isMouse_In_again=again_icon.collidepoint(pygame.mouse.get_pos())if self.isMouse_In_again:self.screen.blit(gameImgs[4], (self.rect.center[0] - 100, self.rect.center[1] + 20))#结束游戏图标end_icon=self.screen.blit(gameImgs[5], (self.rect.topright[0]-100, self.rect.topright[1]+10))self.isMouse_In_end=end_icon.collidepoint(pygame.mouse.get_pos())if self.isMouse_In_end:self.screen.blit(gameImgs[6], (self.rect.topright[0] - 109, self.rect.topright[1] + 5))#结束界面文字self.screen.blit(font.render("最终分数:%s"%heroObj.score, True, pygame.Color("green")), (self.rect.center[0]-230,self.rect.center[1]-75))self.screen.blit(font.render("历史最高分:%s"%history, True, pygame.Color("green")), (self.rect.center[0]+20,self.rect.center[1]-75))self.Move()def Move(self):if self.rect.y<0:self.rect=self.rect.move(0,12)else:self.rect=self.rect.move(0,0)
#****************************************************************
#判断游戏是否开始
isPlay=False
#创建整体帧率速度
clock=pygame.time.Clock()
#字体对象
pygame.font.init()
font=pygame.font.Font("Game_Main/Img_File/fount.otf",35)
font_end=pygame.font.Font("Game_Main/Img_File/fount.otf",80)
font_tips=pygame.font.Font("Game_Main/Img_File/fount.otf",20)
#1.引入
pygame.init()
#2.生产屏幕
screen2=pygame.display.set_mode((640,800))
screen=pygame.display.set_mode((640,800))
#3.BGM
pygame.mixer.music.load(r"Game_Main/Img_File/bgm2.wav")
pygame.mixer.music.play(-1)
#4.产生开始界面对象
startObj=StartPanel(screen)
#加载界面
loadObj=LoadWindows(screen=screen,pos=(640,-800))
#5.游戏背景对象
gameObj=GameBG(image1=startImgs[8],image2=startImgs[9],screen1=screen,screen2=screen2,speed1=4,speed2=2)
#6.游戏主角对象
heroObj=Hero(image=GameImg,pos=(310,600),screen=screen,speed=25,hp=1,score=0,bulletspeed=10,image2=startImgs[9],screen2=screen2,speed2=2)
#7.游戏结束画面
gameoverObj=GameOver(imgs=gameImgs,pos=(0,-800),screen=screen)
#历史分数
history=0
#8.音效
soundlist=[
pygame.mixer.Sound("Game_Main/Img_File/boom.wav"),
pygame.mixer.Sound("Game_Main/Img_File/fashe.wav"),
pygame.mixer.Sound("Game_Main/Img_File/kaishiyouxi.ogg"),
pygame.mixer.Sound("Game_Main/Img_File/planhuxiao.wav"),
pygame.mixer.Sound("Game_Main/Img_File/herodead.wav"),
]
#7.事件 监测 方法
def EventAll():global isPlayfor event in pygame.event.get():#退出事件if event.type==pygame.QUIT:pygame.quit()sys.exit()#鼠标事件if event.type==pygame.MOUSEBUTTONDOWN:#开始按钮事件  是否开始游戏if event.button==1 and StartPanel.isIn_Start==1:StartPanel.isIn_Start=False# 读取历史分数 初始化信息InitMethod()gameObj.Show()soundlist[2].play()isPlay = Trueif event.button==1 and gameoverObj.isMouse_In_again==1:gameoverObj.isMouse_In_again=FalseheroObj.isHeroDead=False# 读取历史分数 初始化信息InitMethod()gameObj.Show()soundlist[2].play()isPlay = TrueheroObj.isHeroDead = Falseif event.button==1 and gameoverObj.isMouse_In_end==1:exit()sys.exit()#右键开启BUG模式# if event.button==3:#     Hero.On_Off_BUG1=not  Hero.On_Off_BUG1#BGM按钮事件 更替声音按钮图标elif event.button==1 and StartPanel.isIn_BGM==1:StartPanel.isOn_BGM=not StartPanel.isOn_BGMif StartPanel.isOn_BGM:pygame.mixer.music.unpause()else:pygame.mixer.music.pause()# 键盘if event.type == pygame.KEYDOWN:  # 按下#返回主菜单if event.key==pygame.K_ESCAPE:isPlay=False#暂停  死循环  处理if event.key==pygame.K_SPACE:x=Truepygame.mixer_music.pause()while x:for stop in pygame.event.get():if stop.type==pygame.KEYDOWN:if stop.key==pygame.K_SPACE:pygame.mixer_music.unpause()x=Falsebreak#主角移动if event.key == pygame.K_w:Hero.up = Trueelif event.key == pygame.K_s:Hero.down = Trueelif event.key == pygame.K_a:Hero.left = Trueelif event.key == pygame.K_d:Hero.right = Trueif event.type == pygame.KEYUP:  # 抬起if event.key == pygame.K_w:Hero.up = Falseelif event.key == pygame.K_s:Hero.down = Falseelif event.key == pygame.K_a:Hero.left = Falseelif event.key == pygame.K_d:Hero.right = Falseif event.type==pygame.KEYDOWN:if event.key==pygame.K_F1:Hero.isCMK=not Hero.isCMK
#读取配置文件
def ReadScore(path="score.json"):if os.path.exists(path):with open(path,"r") as f_r:return int(f_r.read())else:with open(path,"w") as f_w:f_w.write("0")return 0
#更新配置文件
def UpdateScore(newScore,path="score.json"):with open(path,"w") as f_w:f_w.write(str(newScore))
#初始化信息
def InitMethod():global historyhistory=ReadScore()heroObj.hp=1heroObj.score=0heroObj.rect.topleft=(310,600)enemylist.clear()Bullettemp.clear()rewardlist.clear()gameoverObj.rect.topleft=(0,-800)
def Main():pygame.mouse.set_visible(False)while True:EventAll()if isPlay and heroObj.isHeroDead==False:#开始游戏主体loadObj.Show()if loadObj.load_time==True:gameObj.Show()Factory.CreateEnemy()Factory.CreateReward()heroObj.Show()#显示信息screen.blit(font.render("血量:%s"%heroObj.hp,True,pygame.Color("red")),(0,0))screen.blit(font.render("分数:%s"%heroObj.score,True,pygame.Color("red")),(0,50))screen.blit(font.render("历史最高分:%s"%history,True,pygame.Color("red")),(0,100))screen.blit(font.render("终极技能:%s" %(heroObj.R_skill), True, pygame.Color("green")), (200, 0))elif isPlay==False:#开始界面startObj.Show()elif isPlay and heroObj.isHeroDead==True:gameoverObj.Show()#更新画面pygame.display.update()#设置帧率clock.tick(120)
if __name__=="__main__":Main()

如果想要素材的话请留言吧~


http://www.ppmy.cn/news/377726.html

相关文章

飞机大战之-添加背景

之前我们已经生成了一个空白的窗口&#xff0c;接下来我们要在这个窗口上添加背景。 我们新建一个MyPanel的类用来单独设置面板。 MyPanel是继承于JPanel的一个子类。导入所需的包。 package view;import javax.swing.JPanel;public class MyPanel extends JPanel{}然后新建一…

JS小游戏-宇宙战机

游戏介绍: 业余时间写的一个飞行射击游戏&#xff0c;纵向&#xff0c;共六关。 游戏需求: 1.战机可发射子弹&#xff0c;子弹可通过获取道具升级。 2.战机可放bomb&#xff0c;可获取道具增加数量。 3.战机可蓄力攻击。 4.道具有三种&#xff0c;分别是升级子弹&#xff0c;增…

Python实现飞机大战小游戏(含源码+图片资源)

Python实现飞机大战小游戏&#xff08;含源码图片资源&#xff09; 1. 项目描述2. 依赖包导入3. 代码实现3.1 类构建3.2 初始化设置3.3 排行榜功能3.4 主循环 4. 效果展示4.1游戏开始界面&#xff1a;4.2破纪录界面显示&#xff1a;4.3排行榜功能&#xff1a; 5. 不足和改进 1.…

史上最清晰的雷霆战机游戏开发全过程(基于java,素材和源码均齐全)

前情提要 此次咕咕为大家准备了雷霆战机游戏开发的全过程&#xff0c;我将整个开发都写在了文档中&#xff0c;有图有真相&#xff0c;步步到位&#xff0c;供大家进行细节功能实现上的参考&#xff0c;除此之外&#xff0c;游戏所需的图片与音乐素材、逻辑脑图都一 一放在了文…

【Canvas】童年玩过的雷霆战机你还记得吗?

按键机的年代&#xff0c;想必大家都玩过类似雷电&#xff0c;雷霆战机之类的飞行射击类游戏吧&#xff0c;今天我就试着用canvas来还原一下游戏场景。 素材准备 还原场景的第一步是准备素材&#xff0c;首先我们需要一架雷霆战机&#xff0c;经过九牛二虎之力&#xff0c;我…

前端案例:飞机大战( js+dom 操作,代码完整,附图片素材)

目录 一、案例效果 二、实现思路 三、完整代码详细注释 四、涉及要点 五、案例素材 一、案例效果 二、实现思路 创建游戏背景板&#xff1b;创建我方战机&#xff0c;鼠标进入游戏面板后其随鼠标轨迹运动&#xff1b; onmousemove创建子弹&#xff0c;让子弹周期性的在战…

飞机大战——图文详解

文章目录 1.前言2.效果展示3.图片素材的准备4.需要构建的函数5.变量的定义6.数据的初始化7.画面的呈现8.飞机移动的实现9.子弹的构建和移动9.1子弹的构建9.2子弹的移动 10.敌机的创建和移动11.敌机消灭函数12.结束语13.完整代码14.内容更新 1.前言 本次需要用到easyx图形库&am…

自动化运维工具—Ansible

一、Ansible概述 1.1 Ansible是什么 Ansible是一个基于Python开发的配置管理和应用部署工具&#xff0c;现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点&#xff0c;Pubbet和Saltstack能实现的功能&#xff0c;Ansible基本上都可以实现。 Ansible能批量配…