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


Posted in Python onOctober 16, 2021

导语

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

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

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游戏实战:机甲对战闯关模式大冒险!

总结

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

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

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

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

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

Python 相关文章推荐
Python中实现从目录中过滤出指定文件类型的文件
Feb 02 Python
详解Python3中的Sequence type的使用
Aug 01 Python
Python引用类型和值类型的区别与使用解析
Oct 17 Python
TensorFlow神经网络优化策略学习
Mar 09 Python
利用Django模版生成树状结构实例代码
May 19 Python
python挖矿算力测试程序详解
Jul 03 Python
Python 中 -m 的典型用法、原理解析与发展演变
Nov 11 Python
Python操作Sqlite正确实现方法解析
Feb 05 Python
基于Python3.7.1无法导入Numpy的解决方式
Mar 09 Python
Spring Boot中使用IntelliJ IDEA插件EasyCode一键生成代码详细方法
Mar 20 Python
python 中的命名空间,你真的了解吗?
Aug 19 Python
基于PyInstaller各参数的含义说明
Mar 04 Python
Python实现老照片修复之上色小技巧
Python anaconda安装库命令详解
Python爬虫入门案例之爬取去哪儿旅游景点攻略以及可视化分析
Python爬虫入门案例之爬取二手房源数据
Python爬虫入门案例之回车桌面壁纸网美女图片采集
Python Django模型详解
Python 阶乘详解
Oct 05 #Python
You might like
php sprintf()函数让你的sql操作更安全
2008/07/23 PHP
ThinkPHP视图查询详解
2014/06/30 PHP
docker-compose部署php项目实例详解
2019/07/30 PHP
Firebug 字幕文件JSON地址获取代码
2009/10/28 Javascript
拉动滚动条加载数据的jquery代码
2012/05/03 Javascript
如何使用JS获取IE上传文件路径(IE7,8)
2013/07/08 Javascript
JavaScript新窗口与子窗口传值详解
2014/02/11 Javascript
JavaScript中的ArrayBuffer详细介绍
2014/12/08 Javascript
AngularJS 让人爱不释手的八种功能
2016/03/23 Javascript
js控件Kindeditor实现图片自动上传功能
2020/07/20 Javascript
基于JS模仿windows文件按名称排序效果
2016/06/29 Javascript
jQuery深拷贝Json对象简单示例
2016/07/06 Javascript
jQuery的Read()方法代替原生JS详解
2016/11/08 Javascript
JSON与js对象序列化实例详解
2017/03/16 Javascript
微信小程序实现移动端滑动分页效果(ajax)
2017/06/13 Javascript
Vue中控制v-for循环次数的实现方法
2018/09/26 Javascript
傻瓜式vuex语法糖kiss-vuex整理
2018/12/21 Javascript
JavaScript 判断iPhone X Series机型的方法
2019/01/28 Javascript
前端Electron新手入门教程详解
2019/06/21 Javascript
JavaScript onclick事件使用方法详解
2020/05/15 Javascript
JavaScript组合设计模式--改进引入案例分析
2020/05/23 Javascript
对numpy.append()里的axis的用法详解
2018/06/28 Python
Win10下python 2.7.13 安装配置方法图文教程
2018/09/18 Python
Python数据类型之List列表实例详解
2019/05/08 Python
window7下的python2.7版本和python3.5版本的opencv-python安装过程
2019/10/24 Python
python 实现查询Neo4j多节点的多层关系
2019/12/23 Python
Python 之 Json序列化嵌套类方式
2020/02/27 Python
Python使用xlrd实现读取合并单元格
2020/07/09 Python
Python爬虫之Selenium鼠标事件的实现
2020/12/04 Python
应届大专生自荐书
2014/06/16 职场文书
数学教育专业求职信
2014/07/22 职场文书
逃课打麻将检讨书
2014/10/05 职场文书
有限责任公司股东合作协议书
2014/12/02 职场文书
2015学生会文艺部工作总结
2015/04/03 职场文书
材料员岗位职责范本
2015/04/11 职场文书
单位介绍信格式范文
2015/05/04 职场文书