注册 登录
Python项目实战

第一章:猜谜游戏

第二章:街霸游戏

第三章:购物系统

第四章:搜索引擎

首页 > Python项目实战 > 第二章:街霸游戏 > 2.2节:春丽vs巴洛克

2.2节:春丽vs巴洛克

薯条老师 2021-02-23 17:41:11 340382 0

编辑 收藏

春丽VS巴洛克

上节的程序实战中,写了个简单的程序,模拟春丽如何挑战街霸维加。虽然美丽的春丽打败了维加,但邪恶的影罗组织并未就此覆灭。许多年以后,春丽站在A号街区,会突然想起打败神月卡琳后的那个下午。当时,身躯高大的巴洛克已将面具摘下,道场中的其他四名影子杀手,形如雕塑,酷似木偶......春丽经过这场残酷的战斗以后,在背部留下了一道很长的月牙形伤痕。

在本节程序实战中,通过多进程的方式来模拟春丽一人对抗影罗组织的五名邪恶杀手。

图片.png

程序完整源码

通过多进程+队列来模拟春丽1VS5的街霸游戏挑战赛:

# __author__ = 薯条老师
from multiprocessing import Process, Queue
import random



class Fighter:
    def __init__(self, name, blood = 100, justice = True, kungfu = None, enemies = 1):
        """
        :param name:  表示该fighter的姓名
        :param blood: 表示该fighter的血量
        :param justice: 布尔类型,表示该fighter是否代表正义的一方
        :param kungfu: 表示该fighter的格斗技能
        :param enemies: 表示该fighter对抗的敌人数
        """
        self.__name = name
        self.__blood = blood
        self.__justice = justice
        self.__kungfu = kungfu
        self.__enemies = enemies
        
        
        
    def  attack(self):
       kungfu, harm = None, 0
       if self.__blood > 0:
           kungfu = random.choice(list(self.__kungfu.keys()))
           harm = self.__kungfu[kungfu]
       return kungfu, harm
       
       
       
    @property
    def name(self):
        return self.__name
        
        
        
    @property
    def blood(self):
        return self.__blood
        
        
        
    @blood.setter
    def blood(self, value):
        self.__blood = value
        
        
        
    @property
    def enemies(self):
        return self.__enemies
        
        
        
    @enemies.setter
    def enemies(self, count):
        self.__enemies = count
        
        
        
    @property
    def justice(self):
        return self.__justice
        
        
        
def fight(fighter,  justice_attacks, injustice_attacks):
    """
    :param fighter: Fighter对象
    :param justice_attacks: 队列类型,表示春丽的攻击
    :param injustice_attacks: 队列类型,表示巴洛克等杀手的攻击
    :return:
    """
    while True:
        kungfu, harm = fighter.attack()
        attack = {"name": fighter.name, "kungfu": kungfu,
                  "harm": harm, "blood": fighter.blood}
        if fighter.justice:
            # 通过justice_attacks代表的队列,向以巴洛克为首的杀手们发起一个攻击
            justice_attacks.put(attack)
            if fighter.blood == 0:
                break
            # 从justice_attacks代表的消息队列中,接收对方的一个攻击
            attack = injustice_attacks.get()
            # 如果对方攻击时的blood值为0,表示对方已被击败
            if attack["blood"] == 0:
                # 减去敌人数
                fighter.enemies -= 1
                if fighter.enemies == 0:
                    # 敌人已全部被击败, 退出战斗!
                    break
                else:
                    continue
        else:
            # 通过justice_attacks代表的队列,向春丽发起一个攻击
            injustice_attacks.put(attack)
            if fighter.blood == 0:
                break
            # 从justice_attacks队列中接收春丽发起的攻击
            attack = justice_attacks.get()
            # 如果春丽攻击时的血量为0,说明春丽已经被击败
            if attack["blood"] == 0:
               """
               春丽已经战败,通过justice_attacks对列向己方的杀手们进行消息转发,
               同时退出战斗
               """
               justice_attacks.put({"blood": 0})
               break
               
        kungfu, harm = fighter.attack()
        """
        如果在回击的过程中反击的伤害大于对方的伤害值,
        则加上已有的血量值来实现回血的功能,否则将血量减去对应的伤害值
        """
        fighter.blood += harm - attack["harm"]
        if fighter.blood <= 0:
            fighter.blood = 0
        elif fighter.blood > 100:
            fighter.blood = 100
            
    if fighter.blood > 0:
        print("{} 获得了胜利!!!".format(fighter.name))
        
        
        
if __name__ == "__main__":
    # 定义chunli_kungfu来保存春丽的招式及对应的伤害值
    chunli_kungfu = {
        "失误": 0,
        "原地蹲防": 5,
        "龙星落": 10,
        "气功拳": 15,
        "旋转踢": 20,
        "百裂脚": 20,
        "霸山天升脚": 20,
        "超必杀-千翼气功掌": 25
    }
    # 定义baroque_kungfu来保存杀手巴洛克的招式及对应的伤害值
    baroque_kungfu = {
        "失误": 0,
        "伤疤之恨": 15,
        "闪光漩涡": 20,
        "飞翔巴塞罗那": 20,
        "红色冲击": 20
    }
    # 定义来shadow_kungfu保存影子杀手的攻击策略及对应的伤害值
    shadow_kungfu = {
        "失误": 0,
        "暗器": 10,
        "毒药": 15,
        "炸弹": 20
    }
    processes = []
    fighters = [
        Fighter(name="春丽", kungfu=chunli_kungfu, enemies=5),
        Fighter(name="巴洛克", kungfu=baroque_kungfu, justice=False),
        Fighter(name="影子杀手1", kungfu=shadow_kungfu, justice=False),
        Fighter(name="影子杀手2", kungfu=shadow_kungfu, justice=False),
        Fighter(name="影子杀手3", kungfu=shadow_kungfu, justice=False),
        Fighter(name="影子杀手4", kungfu=shadow_kungfu, justice=False)
    ]
    justice_attacks = Queue()
    injustice_attacks = Queue()
    for fighter in fighters:
        process = Process(target=fight, args=(fighter, justice_attacks, injustice_attacks))
        processes.append(process)
        
    [process.start() for process in processes]
    [process.join() for process in processes]

最具实力的小班培训

来这里参加Python和Java小班培训的学员大部分都找到了很好的工作,平均月薪有11K,学得好的同学,拿到的会更高。由于是小班教学,所以薯条老师有精力把每位学员都教好。打算参加线下小班培训的同学,必须遵守薯条老师的学习安排,认真做作业和项目。把知识学好,学扎实,那么找到一份高薪的工作就是很简单的一件事。

(1) Python后端工程师高薪就业班,月薪11K-18K,免费领取课程大纲
(2) Python爬虫工程师高薪就业班,年薪十五万,免费领取课程大纲
(3) Java后端开发工程师高薪就业班,月薪11K-20K, 免费领取课程大纲
(4) Python大数据分析,量化投资就业班,月薪12K-25K,免费领取课程大纲

扫码免费领取学习资料:


欢迎 发表评论:

请登录

忘记密码我要注册

注册账号

已有账号?请登录