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