春丽VS巴洛克
在上节的程序实战中,写了个简单的程序,模拟春丽如何挑战街霸维加。虽然美丽的春丽打败了维加,但邪恶的影罗组织并未就此覆灭。许多年以后,春丽站在A号街区,会突然想起打败神月卡琳后的那个下午。当时,身躯高大的巴洛克已将面具摘下,道场中的其他四名影子杀手,形如雕塑,酷似木偶......春丽经过这场残酷的战斗以后,在背部留下了一道很长的月牙形伤痕。
在本节程序实战中,通过多进程的方式来模拟春丽一人对抗影罗组织的五名邪恶杀手。
程序完整源码
通过多进程+队列来模拟春丽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,免费领取课程大纲
扫码免费领取学习资料: