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通过ElementTree操作XML获取结点读取属性美化XML
Dec 02 Python
有趣的python小程序分享
Dec 05 Python
Python中sort和sorted函数代码解析
Jan 25 Python
python自动发邮件库yagmail的示例代码
Feb 23 Python
对python 操作solr索引数据的实例详解
Dec 07 Python
Python时间序列处理之ARIMA模型的使用讲解
Apr 02 Python
Python装饰器限制函数运行时间超时则退出执行
Apr 09 Python
Python实现的银行系统模拟程序完整案例
Apr 12 Python
python通过paramiko复制远程文件及文件目录到本地
Apr 30 Python
python使用openCV遍历文件夹里所有视频文件并保存成图片
Jan 14 Python
tensorflow下的图片标准化函数per_image_standardization用法
Jun 30 Python
Anaconda+spyder+pycharm的pytorch配置详解(GPU)
Oct 18 Python
Python实现老照片修复之上色小技巧
Python anaconda安装库命令详解
Python爬虫入门案例之爬取去哪儿旅游景点攻略以及可视化分析
Python爬虫入门案例之爬取二手房源数据
Python爬虫入门案例之回车桌面壁纸网美女图片采集
Python Django模型详解
Python 阶乘详解
Oct 05 #Python
You might like
PHP中创建并处理图象
2006/10/09 PHP
php函数指定默认值方法的小例子
2013/12/04 PHP
thinkphp3.2.2前后台公用类架构问题分析
2014/11/25 PHP
Laravel中扩展Memcached缓存驱动实现使用阿里云OCS缓存
2015/02/10 PHP
Laravel 5 学习笔记
2015/03/06 PHP
PHP4和PHP5版本下解析XML文档的操作方法实例分析
2017/05/20 PHP
PHP中常用的三种设计模式详解【单例模式、工厂模式、观察者模式】
2019/06/14 PHP
使Ext的Template可以解析二层的json数据的方法
2007/12/22 Javascript
JavaScript window.setTimeout() 的详细用法
2009/11/04 Javascript
javascript 日期常用的方法
2009/11/11 Javascript
javaScript让文本框内的最后一个文字的后面获得焦点实现代码
2013/01/06 Javascript
解决用jquery load加载页面到div时,不执行页面js的问题
2014/02/22 Javascript
基于jQuery的判断iPad、iPhone、Android是横屏还是竖屏的代码
2014/05/11 Javascript
jQuery实现的原图对比窗帘效果
2014/06/15 Javascript
jQuery实用函数用法总结
2014/08/29 Javascript
javascript中的3种继承实现方法
2016/01/27 Javascript
js中获取键盘事件的简单实现方法
2016/10/10 Javascript
JS中闭包的经典用法小结(2则示例)
2016/12/28 Javascript
Bootstrap警告(Alerts)的实现方法
2017/03/22 Javascript
Vue2.0表单校验组件vee-validate的使用详解
2017/05/02 Javascript
jQuery序列化后的表单值转换成Json
2017/06/16 jQuery
jQuery实现的页面遮罩层功能示例【测试可用】
2017/10/14 jQuery
详解如何实现一个简单的Node.js脚手架
2017/12/04 Javascript
Vue2.0实现组件数据的双向绑定问题
2018/03/06 Javascript
js+canvas实现滑动拼图验证码功能
2018/03/26 Javascript
jQuery滚动条美化插件nicescroll简单用法示例
2018/04/18 jQuery
浅谈微信小程序flex布局基础
2018/09/10 Javascript
UEditor 自定义图片视频尺寸校验功能的实现代码
2020/10/20 Javascript
[00:32]2018DOTA2亚洲邀请赛出场——VP
2018/04/04 DOTA
opencv python 基于KNN的手写体识别的实例
2018/08/03 Python
python opencv读mp4视频的实例
2018/12/07 Python
python 多线程重启方法
2019/02/18 Python
幼儿园教师考核制度
2014/02/01 职场文书
委托公证书范本
2014/04/03 职场文书
婚宴新郎致辞
2015/07/28 职场文书
Python使用DFA算法过滤内容敏感词
2022/04/22 Python