开发者

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

目录
  • 导语
  • 正文
    • 一、小编有话说
    • ​二、游戏规则
      • 2.1闯关模式
      • 2.2技能提示
    • 三、游戏素材
      • 3.1像素画风——
      • 3.2机甲模型——
      • 3.3冒险闯关
    • 四、环境安装
      • 五、项目代码
        • 5.1加载动画以及音效
        • 5.2初始化地图
        • 5.3关卡动画
        • 5.4玩家角色
        • 5.5敌人死亡删除
        • 5.6 敌方大BOSS
        • 5.7敌方BOSS章鱼怪
        • 5.8敌方BOSS 绿坦克
        • 5.9掉落的血瓶
        • 5.10捡血包
        • 5.11结束类
      • 六、效果展示
      • 总结

        导语

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

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

        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 (http://www.cppcns.com"+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_coun编程客栈t&gjqsPRsoKt;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_ihttp://www.cppcns.commg = 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游戏实战:机甲对战闯关模式大冒险!

        总结

        好啦!这篇大游戏就写到这里啦,看着这些精致的画面有没有想要自己动手玩一下 ,试试嘛~

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

        你们的支持是我最大的动力!!记得三连哦~mua 欢迎大家阅读往期的文章哦~

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

        到此这篇关于Python 爆肝数千行代码实现炫酷机甲闯关游戏大制作案例进阶的文章就介绍到这了,更多相关Python 机甲闯关游戏内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

        0

        上一篇:

        下一篇:

        精彩评论

        暂无评论...
        验证码 换一张
        取 消

        最新开发

        开发排行榜