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用fork来创建子进程注意事项
Jul 03 Python
python获取从命令行输入数字的方法
Apr 29 Python
浅谈Python浅拷贝、深拷贝及引用机制
Dec 15 Python
Python基于socket模块实现UDP通信功能示例
Apr 10 Python
python去除文件中重复的行实例
Jun 29 Python
python开发准备工作之配置虚拟环境(非常重要)
Feb 11 Python
python3读取图片并灰度化图片的四种方法(OpenCV、PIL.Image、TensorFlow方法)总结
Jul 04 Python
pygame实现五子棋游戏
Oct 29 Python
Python sql注入 过滤字符串的非法字符实例
Apr 03 Python
Django全局启用登陆验证login_required的方法
Jun 02 Python
python爬虫中的url下载器用法详解
Nov 30 Python
PyQt5结合QtDesigner实现文本框读写操作
Jun 11 Python
Python实现老照片修复之上色小技巧
Python anaconda安装库命令详解
Python爬虫入门案例之爬取去哪儿旅游景点攻略以及可视化分析
Python爬虫入门案例之爬取二手房源数据
Python爬虫入门案例之回车桌面壁纸网美女图片采集
Python Django模型详解
Python 阶乘详解
Oct 05 #Python
You might like
[EPIC] Larva vs Flash ZvT @ Crossing Field [2017-10-09]
2020/03/17 星际争霸
PHP和JAVA中的重载(overload)和覆盖(override) 介绍
2012/03/01 PHP
openflashchart 2.0 简单案例php版
2012/05/21 PHP
laravel安装和配置教程
2014/10/29 PHP
PHP代码实现爬虫记录――超管用
2015/07/31 PHP
PHP session会话操作技巧小结
2016/09/27 PHP
Yii框架操作cookie与session的方法实例详解
2019/09/04 PHP
select组合框option的捕捉实例代码
2008/09/30 Javascript
JQuery.ajax传递中文参数的解决方法 推荐
2011/03/28 Javascript
很棒的学习jQuery的12个网站推荐
2011/04/28 Javascript
ASP.NET jQuery 实例6 (实现CheckBoxList成员全选或全取消)
2012/01/13 Javascript
javascript在myeclipse中报错的解决方法
2013/10/29 Javascript
javascript中取前n天日期的两种方法分享
2014/01/26 Javascript
jQuery获得IE版本不准确webbrowser的解决方法
2014/02/23 Javascript
javascript制作坦克大战全纪录(2)
2014/11/27 Javascript
Angular2 http jsonp的实例详解
2017/08/31 Javascript
微信小程序如何获取openid及用户信息
2018/01/26 Javascript
一行JavaScript代码如何实现瀑布流布局
2020/12/11 Javascript
[31:01]2014 DOTA2国际邀请赛中国区预选赛5.21 CNB VS Orenda
2014/05/23 DOTA
[05:17]DOTA2誓师:今天我们在这里 明天TI4等我!
2014/03/26 DOTA
进一步了解Python中的XML 工具
2015/04/13 Python
python pandas dataframe 按列或者按行合并的方法
2018/04/12 Python
PyCharm设置SSH远程调试的方法
2018/07/17 Python
python实现一个简单的udp通信的示例代码
2019/02/01 Python
wxpython绘制圆角窗体
2019/11/18 Python
python语言是免费还是收费的?
2020/06/15 Python
Pytorch mask-rcnn 实现细节分享
2020/06/24 Python
CSS3 3D立方体效果示例-transform也不过如此
2016/12/05 HTML / CSS
CSS3系列教程:背景图片(背景大小和多背景图) 应用说明
2012/12/19 HTML / CSS
美国眼镜网站:LensCrafters
2020/01/19 全球购物
人力资源管理毕业生自荐信
2013/11/21 职场文书
园林技术个人的自我评价
2014/01/08 职场文书
购房协议书范本
2014/04/11 职场文书
合作经营协议书范本
2014/09/16 职场文书
无刑事犯罪记录证明范本
2014/09/29 职场文书
PostgreSQL将数据加载到buffer cache中操作方法
2021/04/16 PostgreSQL