网络编程
位置:首页>> 网络编程>> Python编程>> Python 游戏大作炫酷机甲闯关游戏爆肝数千行代码实现案例进阶

Python 游戏大作炫酷机甲闯关游戏爆肝数千行代码实现案例进阶

作者:顾木子吖  发布时间:2023-06-03 17:37:26 

标签:Python,机甲闯关游戏,Python,案例

导语

大家早上好哈!——有没有想我啊?

木木子来啦,今日上线放一波大招给大家!

Python 游戏大作炫酷机甲闯关游戏爆肝数千行代码实现案例进阶

刚学会了录制视频,之后的效果动态显示终于完美录制出来了!今天跟着小编更新一波大家期待的游戏系列吧~

是不是好开森、好兴奋呀!来来来……小编跟你一起去看看!

Python 游戏大作炫酷机甲闯关游戏爆肝数千行代码实现案例进阶

本文呢是开源的游戏项目哈——小编按照自己的想法加工优化一下给大家展示效果滴!

一、小编有话说

其实这款游戏是一款机甲对战的模式——下面我说的话不要捶我哈,狗头保命.jpg

感觉这种打怪掉金币、掉血包等等这些跟我之前看我朋友打的一款《地下城与勇士》很像!2333,

Python 游戏大作炫酷机甲闯关游戏爆肝数千行代码实现案例进阶

感觉都是这种一直刷刷刷的闯关模式,直女表示:“看这类游戏都差不多一样”,但是貌似市面上很多这种类似刷boss闯

关的,还可以自动刷的游戏来着!BUT 我没玩过但应该是很多人的童年吧~

二、游戏规则

2.1闯关模式

这款游戏只有一个关卡:但是一个关卡里面分为几个小boss、打完即可通关,显示血量为0即可通关不成功。一只红色的机甲作为玩家必须打败出现的所有小机甲+小boss,每次敌方机甲死亡会掉落不同属性的物品,比如:血包、装备等等,靠近即可收取为自己可用。

2.2技能提示

机甲玩家角色:机甲技能列表—I—O—J—U-作为技能按键;机甲移动列表—W—A—S—D—作为上下左右移动按键。

三、游戏素材

这个游戏写了几千行代码——游戏素材图片——相应的背景音乐等都特别的多——下面仅展示一小小部分给大家哈!

3.1像素画风——

Python 游戏大作炫酷机甲闯关游戏爆肝数千行代码实现案例进阶

3.2机甲模型——

Python 游戏大作炫酷机甲闯关游戏爆肝数千行代码实现案例进阶

3.3冒险闯关

Python 游戏大作炫酷机甲闯关游戏爆肝数千行代码实现案例进阶

四、环境安装

本文是写的小游戏嘛!基于Pygame写的。环境准备:Python3、Pycharm。

pip install -i https://pypi.douban.com/simple/ pygame

五、项目代码

由于项目代码过多,这里只给出部分代码。

5.1加载动画以及音效


font = pygame.font.SysFont(None,50,True)# 字体  True 打开抗锯齿
load_music=pygame.mixer.Sound("music/11046.wav")
start_music=pygame.mixer.Sound("music/战斗背景音效.wav")
back_music=pygame.mixer.Sound("music/BGM_1 (1)_02.wav")
green_jn=pygame.mixer.Sound("music/敌人技能.wav")
green_attack_music=pygame.mixer.Sound("music/怪叫.wav")
player_hit_music=pygame.mixer.Sound("music/机甲受伤.wav")
walk_music=pygame.mixer.Sound("music/机器走路.wav")
jump_music=pygame.mixer.Sound("music/弹跳.wav")
diren_die_music=pygame.mixer.Sound("music/坦克 * .wav")
jn_music=pygame.mixer.Sound("music/激光声游戏喷射_1_3.wav")
attack_music=pygame.mixer.Sound("music/敌人普攻_01_1.wav")
check_music=pygame.mixer.Sound("music/升级或者获得奖励.wav")
feiti_music=pygame.mixer.Sound("music/机器故障.wav")
game_over_music=pygame.mixer.Sound("music/我一定会回来的.wav")
life_add_music=pygame.mixer.Sound("music/加血.wav")

player_hit_music.set_volume(0.5)
check_music.set_volume(0.2)
green_attack_music.set_volume(0.1)
back_music.set_volume(0)
jn_music.set_volume(1)
start_music.set_volume(0.5)
load_music.set_volume(1)

5.2初始化地图


map_img=pygame.image.load("map_img/left.jpg")
start_back=pygame.image.load("load_img/start_back2.png")
set_font = pygame.font.SysFont("KaiTi", 47)

# load_music.play()

screen=pygame.display.set_mode((WIDTH,HEIGHT),pygame.FULLSCREEN)
# screen=pygame.display.set_mode((WIDTH,HEIGHT))
# screen.fill((16,16,16))
screen.blit(start_back,(0,0))

pygame.display.set_caption("机甲对战小游戏")
pygame.display.set_icon(start_back)
#
load_image=() #开始动画列表
load_count=1 #开始动画加载
start_flag=False#是否开始
start_music.play(-1)#游戏开始音效
for pic_num in range(1,30):
   if pic_num<10:
       load_image+=(pygame.image.load("./load_img/jz00"+str(pic_num)+".png"),)
   elif pic_num>9:
       load_image+=(pygame.image.load("./load_img/jz0"+str(pic_num)+".png"),)

class walk_sound():
   def __init__(self,src):
       self.sound=pygame.mixer.Sound(src)
       self.sound.set_volume(1)
   def music_play(self):
       self.sound.play()
   def music_stop(self):
       self.sound.stop()

5.3关卡动画


class check_fun(object):
   check_list = []
   for pic_num in range(1, 13):
       check_list+=(pygame.image.load("./right_check/箭头" + str(pic_num) + ".png"),)
   def __init__(self):
       self.check_count=1
   def draw(self,screen):
       if self.check_count>=12:
           self.check_count=1
       if self.check_count:
           screen.blit(self.check_list[self.check_count],(1100,290))
           self.check_count+=1

5.4玩家角色


class Player(object):
   flc_list=()                            #机甲o技能列表
   lizi_list = ()                         #粒子特效1 列表
   lizi2_list = ()                        #粒子特效2 列表
   lizi3_list =()                         #粒子特效3 列表
   walk_right = ()                        #机甲 向左走列表
   walk_left = ()                         #机甲 向左走列表
   jn_list = ()                           #机甲i技能列表
   jump_list = ()                         #机甲跳跃技能列表
   hit_list = ()                          #机甲受伤列表
   attack_list_one=()                     #近攻 第一段 列表
   attack_list_two = ()                   #近攻 第二段列表
   attack_list_three = ()                 #近攻 第三段列表
   life_list=()                           #机甲受伤 列表
   die_list=()                             #机甲 血量 列表
   all_tuple=()
   stand_list = ()
   HP_tuple=()
   cd_tuple=()
   level_tuple=()
   for pic_num in range(1,13):
       level_tuple+=(pygame.image.load("./Update/"+str(pic_num)+".png"),)
   for pic_num in range(1,17):
       all_tuple+=(pygame.image.load("./jn/BIG/1 ("+str(pic_num)+").png"),)
   for pic_num in range(1,12):
       cd_tuple+=(pygame.image.load("./cd/cd"+str(pic_num)+".png"),)
   for pic_num in range(1,17):
       HP_tuple+=(pygame.image.load("./HP/"+str(pic_num)+".png"),)
   for pic_num in range(1,65):
       die_list+=(pygame.image.load("./die/die ("+str(pic_num)+").png"),)
   for pic_num in range(1,33):
       flc_list+=(pygame.image.load("./jn/flc ("+str(pic_num)+").png"),)
   for pic_num in range(1,49):
       lizi_list+=(pygame.image.load("./fire/"+str(pic_num)+".png"),)
   for pic_num in range(1,34):
       lizi2_list+=(pygame.image.load("./huohua/"+str(pic_num)+".png"),)
   for pic_num in range(1,81):
       lizi3_list+=(pygame.image.load("./huohua2/"+str(pic_num)+".png"),)
   for pic_num in range(1,5):
       life_list+=(pygame.image.load("./hit/ss (1).png"),)
       life_list+=(pygame.image.load("./hit/ss (2).png"),)
   for pic_num in range(1,13):
       walk_right+=(pygame.image.load("./walk/walk ("+str(pic_num)+").png"),)
   for pic_num in range(12,0,-1):
       walk_left+=(pygame.image.load("./walk/walk ("+str(pic_num)+").png"),)
   for pic_num in range(1, 25):
       stand_list+=(pygame.image.load("./stand/stand (" + str(pic_num) + ").png"),)
   for pic_num in range(1,41):
       jn_list+=(pygame.image.load("./jn/jn ("+str(pic_num)+").png"),)
   for pic_num in range(1,39):
       jump_list+=(pygame.image.load("./jump/jump ("+str(pic_num)+").png"),)
   for pic_num in range(1,48):
       hit_list+=(pygame.image.load("./hit/jd ("+str(pic_num)+").png"),)
   for pic_num in range(1,14):
       attack_list_one+=(pygame.image.load("./attack/1attack ("+str(pic_num)+").png"),)
   for pic_num in range(1,7):
       attack_list_two+=(pygame.image.load("./attack/2attack ("+str(pic_num)+").png"),)
   for pic_num in range(1,12):
       attack_list_three+=(pygame.image.load("./attack/3attack ("+str(pic_num)+").png"),)
   def __init__(self,x,y,width,height):
       self.x=x
       self.y=y
       self.width=width
       self.height=height
       self.speed=1
       self.left=False
       self.right=True
       self.stand=True
       self.jump=False
       self.i=False
       self.hit=False
       self.attack=0
       self.stand_count=1#站立的图片索引
       self.walk_count=1#步行的图片索引
       self.jump_count=1#跳跃的图片索引
       self.jn_count=1#技能i的图片索引
       self.hit_count=1#受伤的图片索引
       self.attack_Bool=False
       self.attack_one_count = 1#一段普攻的图片索引
       self.attack_two_count = 1  # 二段普攻的图片索引
       self.attack_three_count = 1  # 三段普攻的图片索引
       self.life=100
       self.t=10
       self.hit_box = (self.x, self.y, self.width, self.height)  # 碰撞框的位置 大小变量
       self.kill_enemy=0
       self.life_remove_bool=False
       self.life_count=0
       self.lizi_count=1
       self.lizi2_count = 1
       self.flc_count=0
       self.lizi3_count=1
       self.HP_count=0
       self.cd_count=0
       self.all_count=0
       self.cd=False
       self.levelAdd=False
       self.level=1
       self.flc=False
       self.die=False
       self.all=False
       self.die_count=0
       self.level_count=0
       self.HP_img=pygame.image.load("./HP/电池.png")
       self.skill_img = pygame.image.load("./HP/skill_num.png")
       self.player_img = pygame.image.load("./HP/head.png")
       self.win_bool=False
       self.lifeAdd=False
       self.all_lenth=50
   def draw(self,screen):
       if self.all_count>=16:
           self.all_count=0
           self.all=False
           self.all_lenth=50

if player.all_count>14:
           U_Testing(enemylist)
           U_Testing(enemylist2)
           U_Testing(enemylist3)
           U_Testing(enemylist4)

if self.cd_count>=11:
           self.cd_count=0
           self.cd=False
       if self.HP_count == 2:
           life_add_music.play()
       if self.HP_count>=16:
           life_add_music.stop()
           self.HP_count=0
           self.lifeAdd = False

if self.level_count==2:
           life_add_music.play()
       if self.level_count>=12:
           life_add_music.stop()
       if self.level_count>=12:
           self.level_count=0
           self.levelAdd = False

if self.lizi_count>=48:
           self.lizi_count=1
       if self.lizi2_count>=33:
           self.lizi2_count=1
       if self.lizi3_count>=80:
           self.lizi3_count=1
       if self.lizi2_count:

screen.blit(self.lizi2_list[self.lizi2_count], (-100, 500))
           screen.blit(self.lizi2_list[self.lizi2_count], (200, 500))
           screen.blit(self.lizi2_list[self.lizi2_count], (500, 500))
           screen.blit(self.lizi2_list[self.lizi2_count], (800, 500))
           screen.blit(self.lizi2_list[self.lizi2_count], (1100, 500))
           self.lizi2_count += 1
       # if self.lizi3_count:
       #     screen.blit(self.lizi3_list[self.lizi3_count], (-100, -120))
       #     screen.blit(self.lizi3_list[self.lizi3_count], (200, -200))
       #     screen.blit(self.lizi3_list[self.lizi3_count], (500, -120))
       #     screen.blit(self.lizi3_list[self.lizi3_count], (800, -200))
       #     screen.blit(self.lizi3_list[self.lizi3_count], (1100, -120))
       #     self.lizi3_count += 1

if self.lizi_count:
           screen.blit(self.lizi_list[self.lizi_count], (-100, 600))
           screen.blit(self.lizi_list[self.lizi_count], (200, 550))
           screen.blit(self.lizi_list[self.lizi_count], (500, 600))
           screen.blit(self.lizi_list[self.lizi_count], (800, 550))
           screen.blit(self.lizi_list[self.lizi_count], (1100, 600))
           self.lizi_count+=1
       if self.die_count >=64:
           self.die_count=0
           self.life=100
           self.kill_enemy=0
           self.die = False
           self.stand = True
           return

if self.stand_count>=24:
           self.stand_count=1

if self.flc_count>=32:
           self.flc_count=0
           self.flc=False

if self.life_count>=8:
           self.life_count=0
           self.life_remove_bool=False

if self.attack_one_count>=13:
           self.attack_one_count=1
           self.stand=True
           self.attack_Bool = False

if self.attack_two_count>=6:
           self.attack_two_count=1
           self.stand = True
           self.attack_Bool = False

if self.attack_three_count>=11:
           self.attack_three_count=1
           self.stand = True
           self.attack_Bool = False

if self.walk_count>=12:
           self.walk_count=1

if self.jump_count>=38:
           self.jump_count=1
       if self.jn_count>=40:
           self.jn_count=1
       if self.hit_count>=47:
           self.hit_count=1

if self.die_count==20:
           diren_die_music.play()

if self.life_remove_bool and not self.die:
           screen.blit(self.life_list[self.life_count],(self.x,self.y))
           if self.life_count==0:
               player_hit_music.play()
           elif self.life_count==5:
               player_hit_music.stop()
           self.stand=False
           self.i = False
           self.j = False
           self.left=False
           self.right=False
           self.jump = False
           self.flc = False
           self.life_count+=1

elif self.stand and not self.jump and not self.i and not self.flc  and not self.hit and not self.attack_Bool and not self.life_remove_bool and not self.die:
           screen.blit(self.stand_list[self.stand_count],(self.x,self.y))
           self.stand_count+=1

elif self.right and not self.stand and not self.jump and not self.i and not self.flc  and not self.hit and not self.attack_Bool and not self.life_remove_bool and not self.die:  # 如果没有站立中 并且left=True,
           screen.blit(self.walk_right[self.walk_count], (self.x,self.y))  # 绘制马里奥
           self.walk_count += 1

if self.walk_count==2:
               walk_music.play()
           elif self.walk_count==1:
               walk_music.stop()
       elif self.left and not self.stand and not self.jump and not self.i and not self.flc and not self.hit and not self.attack_Bool and not self.life_remove_bool and not self.die:  # 如果没有站立中 并且left=True,
           screen.blit(self.walk_left[self.walk_count], (self.x,self.y))  # 绘制马里奥
           self.walk_count += 1

if self.walk_count==2:
               walk_music.play()
           elif self.walk_count==1:
               walk_music.stop()

elif self.flc  and not self.die:
           if self.flc_count==1:
               feiti_music.play()
           if self.flc_count==20:
               feiti_music.stop()
           screen.blit(self.flc_list[self.flc_count], (self.x, self.y-120))
           self.flc_count += 1

elif self.i  and not self.die:

screen.blit(self.jn_list[self.jn_count],(self.x,self.y-75))
           self.jn_count+=1
           if self.jn_count == 2:
               jn_music.play()
           elif self.jn_count == 1:
               jn_music.stop()
       elif self.jump and not self.attack_Bool and not self.die:
           screen.blit(self.jump_list[self.jump_count],(self.x,self.y-75))
           self.jump_count+=1
           if self.jump_count == 2:
               jump_music.play()
           elif self.jump_count == 1:
               jump_music.stop()
       elif self.attack==1 and self.attack_Bool and not self.die:
           screen.blit(self.attack_list_one[self.attack_one_count],(self.x,self.y))
           self.attack_one_count += 1
           if self.attack_one_count==2:
               attack_music.play()
           elif self.attack_one_count==1:
               attack_music.stop()
       elif self.attack==2 and self.attack_Bool and not self.die:
           screen.blit(self.attack_list_two[self.attack_two_count],(self.x,self.y))
           self.attack_two_count += 1
           if self.attack_two_count == 2:
               attack_music.play()
           elif self.attack_two_count == 1:
               attack_music.stop()
       elif self.attack==3 and self.attack_Bool and not self.die:
           screen.blit(self.attack_list_three[self.attack_three_count],(self.x,self.y))
           self.attack_three_count += 1
           if self.attack_three_count == 2:
               attack_music.play()
           elif self.attack_three_count == 1:
               attack_music.stop()

elif self.hit and not self.die:
           screen.blit(self.hit_list[self.hit_count],(self.x,self.y))
           self.hit_count+=1

elif self.die:
           self.life = 0
           self.skill = False
           self.attack = False
           screen.blit(self.die_list[self.die_count],(self.x-100,self.y-20))
           self.die_count+=1

self.hit_box = (self.x, self.y, self.width, self.height)

if self.levelAdd:
           LEVAdd = font.render("LEVEL UP ", True, (255, 0, 0))
           screen.blit(LEVAdd, (player.x - 50, player.y - 50))
           screen.blit(self.level_tuple[self.level_count],(self.x-40,self.y-90))
           self.level_count+=1

if self.lifeAdd:
           screen.blit(self.HP_tuple[self.HP_count],(self.x,self.y-40))
           self.HP_count+=1

if self.all:
           self.all_lenth+=50
           screen.blit(self.all_tuple[self.all_count],(self.x+self.all_lenth,self.y+(self.height/2)-210))
           self.all_count+=1

5.5敌人死亡删除


def die_enemy_green():
   enemylist.pop()
def die_enemy_grey():
   enemylist2.pop()
def die_enemy_pink():
   enemylist3.pop()
def die_enemy_Boss():
   enemylist4.pop()

5.6 敌方大BOSS


class Boss(object):
   walk_tuple = ()         #走路元组
   skill_tuple = ()        #远攻元组
   attack_tuple = ()       #近攻元组
   life_remove_tuple = ()          #受伤元组
   die_tuple = ()          #死亡元组
   arm_tuple = ()          #胳膊元组
   for pic_num in range(1,13):
       walk_tuple += (pygame.image.load("./yellow/walk1/1 ("+str(pic_num)+").png"),)
   for pic_num in range(1,34):
       skill_tuple += (pygame.image.load("./yellow/skill/skill ("+str(pic_num)+").png"),)
   for pic_num in range(1,30):
       attack_tuple += (pygame.image.load("./yellow/attack/attack ("+str(pic_num)+").png"),)
   for pic_num in range(1,40):
       life_remove_tuple += (pygame.image.load("./yellow/hit/hit ("+str(pic_num)+").png"),)
   for pic_num in range(1,13):
       die_tuple += (pygame.image.load("./yellow/die/die ("+str(pic_num)+").png"),)
   for pic_num in range(1,13):
       die_tuple += (pygame.image.load("./yellow/die/die ("+str(pic_num)+").png"),)
   for pic_num in range(1,13):
       die_tuple += (pygame.image.load("./yellow/die/die ("+str(pic_num)+").png"),)
   for pic_num in range(1,13):
       die_tuple += (pygame.image.load("./yellow/die/die ("+str(pic_num)+").png"),)
   for pic_num in range(1,13):
       die_tuple += (pygame.image.load("./yellow/die/die ("+str(pic_num)+").png"),)
   for pic_num in range(1,7):
       arm_tuple += (pygame.image.load("./yellow/arm/arm ("+str(pic_num)+").png"),)
   def __init__(self,x,y,start,end):
       self.x = x
       self.y = y
       self.width = 149
       self.height = 122
       self.area = [start,end]
       self.Yarea = [390-self.height,640-self.height]
       self.walk_count = 0             #走路图片索引
       self.skill_count = 0            #远攻图片索引
       self.attack_count = 0           #近攻图片索引
       self.life_count = 0              #倒地图片索引
       self.die_count = 0              #逃跑图片索引
       self.arm_count = 0              #胳膊图片索引
       self.life = 0                  #boss生命值
       self.speed = 1.5                #x轴移动速度
       self.speed_Y = 1.9              #y轴移动速度
       self.hit_box = (self.x,self.y,self.width,self.height)       #碰撞检测
       self.die = False
       self.walk = True
       self.skill=False
       self.attack=False
       self.life_remove_bool=False
       self.Enemy_Y = 0                #保留受伤 Y轴 位置
       self.enemy_img = pygame.image.load("./HP/enemy_yellow.png")      #生命值图标
       self.game_start_Bool = True                 #加载血条长度
   def draw(self,screen):
       global HP_img_boss
       global HP_bool_boss
       if self.game_start_Bool:
           self.life+=0.5
           if self.life>15:
               self.life=15
               self.game_start_Bool=False
       self.move()

if self.life <= 0:
           self.life_remove_bool = False
           self.die = True
           self.walk = False

if self.arm_count>=6:
           self.arm_count=0

if self.life_count>=39:
           # self.y=self.Enemy_Y
           self.life_count=0
           self.life_remove_bool=False
           self.walk=True
       # 敌方走路
       if self.walk_count>=12:
           self.walk_count=0

#敌方远程攻击
       if self.skill_count==20 and not self.life_remove_bool and not self.die:
           if collision_check_tanke(player, enemylist4[0]):
               player.life -= 8
               player.life_remove_bool = True
               if player.life<=0:
                   player.die=True
       # 敌方近程攻击
       if self.attack_count == 17 and not self.life_remove_bool and not self.die:
           if collision_check_tanke_yellow(player, enemylist4[0]):
               player.life -= 8
               player.life_remove_bool = True
               if player.life<=0:
                   player.die=True

#敌方 远程 技能
       if self.skill_count >= 33:
           self.skill_count = 0
           self.skill=False
           self.walk=True

# 敌方 近程 技能
       if self.attack_count >= 29:
           self.attack_count = 0
           self.attack = False
           self.walk = True

5.7敌方BOSS章鱼怪


class Enemy_pink(object):
   walk_left=()
   walk_right=()
   die_list = ()
   life_remove_list = ()
   falsh_list=()
   skill_list=()
   attack_list = ()
   for pic_num in range(1,83):
       attack_list+=(pygame.image.load("./pink/attack/attack1 ("+str(pic_num)+").png"),)
   for pic_num in range(1,17):
       walk_left+=(pygame.image.load("./pink/walk/"+str(pic_num)+".png"),)
   for pic_num in range(16,0,-1):
       walk_right+=(pygame.image.load("./pink/walk/"+str(pic_num)+".png"),)
   for pic_num in range(1,51):
       skill_list+=(pygame.image.load("./pink/skill2/"+str(pic_num)+".png"),)
   #敌人 先起飞 再死亡
   for pic_num in range(1,58):
       die_list+=(pygame.image.load("./pink/die/die ("+str(pic_num)+").png"),)
   # 减血
   for pic_num in range(1,29):
       life_remove_list+=(pygame.image.load("./pink/hit/hit ("+str(pic_num)+").png"),)

def __init__(self,x,y,start,end):
       self.x=x
       self.y=y
       self.width=361
       self.height=179
       self.area=[start,end]
       self.Yarea = [440, 500] # Y轴 运动 区间
       self.walk_count=1
       self.speed=-2
       self.speed_Y=1.9
       self.life=0
       self.hit_box = (self.x, self.y, self.width, self.height)
       self.die=False
       self.walk=True
       self.die_count=1
       self.life_count=1
       self.skill_count=1
       self.attack_count=0
       self.life_remove_bool=False
       self.skill=False
       self.attack = False
       self.Enemy_Y=0  #保留受伤 Y轴 位置
       self.enemy_img = pygame.image.load("./HP/enemy_pink.png")
       self.HP_img = pygame.image.load("./HP/电池.png")
       self.game_start_Bool=True
   def draw(self,screen):
       global HP_img_pink
       global HP_bool_pink
       if self.game_start_Bool:
           self.life+=0.17
           if self.life>3:
               self.life=3
               self.game_start_Bool=False

self.move()

if self.life <= 0:
           self.life_remove_bool = False
           self.die = True
           self.walk = False

if self.life_count>=28:
           # self.y=self.Enemy_Y
           self.life_count=0
           self.life_remove_bool=False
           self.walk=True
       # 敌方走路
       if self.walk_count>=16:
           self.walk_count=0

#敌方远程攻击
       if self.skill_count==30 and not self.life_remove_bool and not self.die:
           if collision_check_tanke_jincheng(player, enemylist3[0]):
               player.life -= 8
               player.life_remove_bool = True
               if player.life<=0:
                   player.die=True
       # 敌方近程攻击
       if self.attack_count == 50 and not self.life_remove_bool and not self.die:
           if collision_check_tanke(player, enemylist3[0]):
               player.life -= 8
               player.life_remove_bool = True
               if player.life<=0:
                   player.die=True

#敌方 远程 技能
       if self.skill_count >= 50:
           self.skill_count = 0
           self.skill=False
           self.walk=True

# 敌方 近程 技能
       if self.attack_count >= 82:
           self.attack_count = 0
           self.attack = False
           self.walk = True

5.8敌方BOSS 绿坦克


class Enemy(object):
   walk_left=()
   walk_right=()
   die_list = ()
   life_remove_list = ()
   falsh_list=()
   skill_list=()
   attack_list = ()

for pic_num in range(1,24):
       attack_list+=(pygame.image.load("./green/attack/attack ("+str(pic_num)+").png"),)
   for pic_num in range(1,9):
       walk_left+=(pygame.image.load("./green/walk/walk ("+str(pic_num)+").png"),)
   for pic_num in range(8,0,-1):
       walk_right+=(pygame.image.load("./green/walk/walk ("+str(pic_num)+").png"),)
   for pic_num in range(1,38):
       skill_list+=(pygame.image.load("./green/skill/skill ("+str(pic_num)+").png"),)

#敌人 先起飞 再死亡
   for pic_num in range(1,40):
       die_list+=(pygame.image.load("./green/die/hit ("+str(pic_num)+").png"),)
   for pic_num in range(1,65):
       die_list+=(pygame.image.load("./green/die/die ("+str(pic_num)+").png"),)
   # 减血
   for pic_num in range(1,24):
       life_remove_list+=(pygame.image.load("./green/die/hit ("+str(pic_num)+").png"),)

def __init__(self,x,y,start,end):
       self.x=x
       self.y=y
       self.width=133
       self.height=95
       self.area=[start,end]
       self.Yarea = [300, 360] # Y轴 运动 区间
       self.walk_count=1
       self.speed=-1.5
       self.speed_Y=1.9
       self.life=0
       self.hit_box = (self.x, self.y, self.width, self.height)
       self.die=False
       self.walk=True
       self.die_count=1
       self.life_count=1
       self.skill_count=1
       self.attack_count=0
       self.life_remove_bool=False
       self.skill=False
       self.attack = False
       self.Enemy_Y=0  #保留受伤 Y轴 位置
       self.enemy_img=pygame.image.load("./HP/enemy_green.png")
       self.game_start_Bool=True
   def draw(self,screen):
       global HP_img_green
       global HP_bool_green
       if self.game_start_Bool:
           self.life+=0.12
           if self.life > 3:
               self.life = 3
               self.game_start_Bool = False

self.move()

if self.life <= 0:
           self.life_remove_bool = False
           self.die = True
           self.walk = False

# 敌方受击
       # if self.life_count==2:
       #     self.Enemy_Y=self.y

if self.life_count>=23:
           # self.y=self.Enemy_Y
           self.life_count=0
           self.life_remove_bool=False
           self.walk=True

# 敌方走路
       if self.walk_count>=8:
           self.walk_count=0

#敌方远程攻击
       if self.skill_count==25 and not self.life_remove_bool and not self.die:
           if collision_check_tanke(player, enemylist[0]):
               player.life -= 8
               player.life_remove_bool = True
               if player.life<=0:
                   player.die=True
       # 敌方近程攻击
       if self.attack_count == 14 and not self.life_remove_bool and not self.die:
           if collision_check_tanke_jincheng(player, enemylist[0]):
               player.life -= 8
               player.life_remove_bool = True
               if player.life<=0:
                   player.die=True

#敌方 远程 技能
       if self.skill_count >= 37:
           self.skill_count = 0
           self.skill=False
           self.walk=True

# 敌方 近程 技能
       if self.attack_count >= 23:
           self.attack_count = 0
           self.attack = False
           self.walk = True

5.9掉落的血瓶


class Prop_Hp(object):
   def __init__(self,x,y):
       self.x=x
       self.y=y
       self.width=64
       self.height=64
       self.HP=2
       self.imglist=[pygame.image.load("./HP/HP.png"),pygame.image.load("./HP/HP2.png"),pygame.image.load("./HP/HP3.png"),pygame.image.load("./HP/gun.png"),pygame.image.load("./HP/gun2.png"),pygame.image.load("./HP/gun3.png"),pygame.image.load("./HP/gun4.png")]
       self.ran=random.randint(0,6)
       self.img=self.imglist[self.ran]
   def draw(self,screen):
       global HP_bool_green
       global HP_bool_grey
       global HP_bool_pink
       screen.blit(self.img,(self.x,self.y))
       if HP_bool_grey:
           if HP_img_grey.imglist.index(HP_img_grey.img)>2:
               if collision_check_tanke_HP(player, HP_img_grey):
                   player.levelAdd = True
                   player.level += 1
                   player.life += 5

if player.life > 100:
                       player.life = 100
                   HP_bool_grey = False
           else:
               if collision_check_tanke_HP(player, HP_img_grey):
                   player.lifeAdd=True
                   player.life += 5
                   if player.life >= 100:
                      player.life=100
                   HP_bool_grey=False

if HP_bool_green:
           if HP_img_green.imglist.index(HP_img_green.img) > 2:
               if collision_check_tanke_HP(player, HP_img_green):
                   player.levelAdd = True
                   player.level += 1
                   player.life += 5

if player.life > 100:
                       player.life = 100
                   HP_bool_green = False
           else:
               if collision_check_tanke_HP(player, HP_img_green):
                   player.lifeAdd = True
                   player.life += 5
                   if player.life >= 100:
                      player.life=100
                   HP_bool_green=False

if HP_bool_pink:
           if HP_img_pink.imglist.index(HP_img_pink.img) > 2:
               if collision_check_tanke_HP(player, HP_img_pink):
                   player.levelAdd = True
                   player.level += 1
                   player.life += 5

if player.life>100:
                       player.life=100
                   HP_bool_pink = False
           else:
               if collision_check_tanke_HP(player, HP_img_pink):
                   player.lifeAdd = True
                   player.life += 5
                   if player.life >= 100:
                      player.life=100
                   HP_bool_pink=False

back_music.play(-1)

5.10捡血包


def collision_check_tanke_HP(a,b):
   temp1= (b.x+b.width>a.x+a.width-30>b.x)
   #角色的攻击区间  容错区间
   temp2= (-40<(b.y+b.height)-(a.y+a.height)<=45)
   return temp1 and  temp2

5.11结束类


def game_over():
   global check
   start_btn=pygame.image.load("./load_img/重新开始.png")
   end_btn=pygame.image.load("./load_img/退出游戏.png")
   failed=pygame.image.load("./load_img/失败.png")
   win_img=pygame.image.load("./load_img/胜利.png")
   bg=pygame.image.load("./map_img/right.jpg")
   back_music.stop()
   while True:
       if check==5:
           back_music.play(-1)
           player.life = 100
           player.x = 0
           player.kill_enemy = 0
           check = 1
           return True
       for event in pygame.event.get():
           if event.type == pygame.QUIT:
               sys.exit()
                                   #鼠标事件
           if event.type==pygame.MOUSEBUTTONDOWN:
                           # 鼠标位置
               if (495<=event.pos[0]<=495+start_btn.get_width()) and (450<=event.pos[1]<450+start_btn.get_height()):
                   back_music.play(-1)
                   player.life = 100
                   player.x = 0
                   player.kill_enemy = 0
                   check = 1
                   return True
               if (495<=event.pos[0]<=495+start_btn.get_width()) and (320<=event.pos[1]<320+start_btn.get_height()):
                   sys.exit()
       player.kill_enemy=0
       screen.blit(bg,(0,0))
       screen.blit(start_btn,(495,450))
       screen.blit(end_btn,(495,320))
       if player.win_bool==False :   #失败
           screen.blit(failed, (395, 120))
       if player.win_bool :  #胜利
           screen.blit(win_img, (425, 120))
       pygame.display.update()

六、效果展示

截图展示——

游戏界面

Python 游戏大作炫酷机甲闯关游戏爆肝数千行代码实现案例进阶

第一小关,其他的几关我就没截图了哈

Python 游戏大作炫酷机甲闯关游戏爆肝数千行代码实现案例进阶

按住U放大这个技能特别可,远攻,其他的攻击太近了,威力不是很大!get!

Python 游戏大作炫酷机甲闯关游戏爆肝数千行代码实现案例进阶

敌方机甲死亡掉落物品

Python 游戏大作炫酷机甲闯关游戏爆肝数千行代码实现案例进阶

视频展示——

哈哈哈 效果出来就成!第一份有视频的动态效果满足满足!!之后会努力优化滴~谢谢大家!

Python游戏实战:机甲对战闯关模式大冒险!

来源:https://blog.csdn.net/weixin_55822277/article/details/120742427

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com