"/>

警告:请仔细阅读整个问题,并在开始编写代码前做好规划。

反派是想在世界上做坏事的人。他们使用道具来完成邪恶行为,从而提高他们的声誉和邪恶程度。

图1:Gru,一位拿着冰冻射线的反派。

类Villain模拟了一个反派,类Gadget模拟了一个道具。

Gadget通过两个输入创建,其名称(字符串)和惊艳值(整数)。一个Gadget在任何时候最多只能被一个Villain拥有。

滑雪板 冰冻射线

代码


freeze_ray = Gadget("Freeze Ray", 5)
lava_lamp_gun = Gadget("Lava Lamp Gun", 3)
dict1 = {
freeze_ray: ""
lava_lamp_gun: "小明"
}

if dict1["freeze_ray"]:

拥有字典 = {

滑雪板 :true

冰冻射线:false

}

Gadget支持以下方法:

  • get_description() 返回字符串 "<Gadget名称> has level <Gadget惊艳值> awesomeness"
  • owned_by() 如果当前被一个反派拥有,则返回字符串 "<Gadget名称> belongs to <拥有者名称>";否则返回字符串 "<Gadget名称> is unowned"。

Villain通过一个输入创建,其名称(字符串)。每个反派初始邪恶值为0,没有任何道具的熟练度,并且不拥有任何道具。每次反派使用道具执行邪恶行为时,该道具的惊艳值会减少1,反派对该道具的熟练度也会减少1。

邪恶值 = 0

道具熟练度 = 道具1:0 道具2:0

道具 = 道具1 道具2 道具3

不同的道具可能有相同的名称。在这种情况下,它们被视为独立的道具,反派的熟练度与它们无关。反派也可以拥有多个同名道具。

Villain支持以下方法:

  • get_evilness() 返回反派的当前邪恶值,是一个整数。
  • gadgets_owned() 返回一个元组,包含反派当前拥有的所有道具名称。
  • get_proficiency(gadget) 接受一个Gadget作为输入。如果反派对该道具的熟练度大于0,则返回字符串 "<Villain名称>'s proficiency with <Gadget名称> is <熟练度>",其中<熟练度>是反派对该道具的熟练度值。如果反派完全不熟练该道具,则返回字符串 "<Villain名称> is not proficient with <Gadget名称>"。
  • do_evil(action, gadget) 接受一个动作(字符串)和一个Gadget作为输入。它返回一个字符串,并根据以下条件执行一些操作:
    • 如果道具不在反派的拥有中,则返回字符串 "<Villain名称> does not have <Gadget名称>"。
    • 否则,将发生以下操作:1) 反派的邪恶值增加道具的惊艳值和反派对该道具熟练度的总和;2) 道具的惊艳值减少1,但不低于0;3) 反派对该道具的熟练度减少1。返回字符串 "<Villain名称> <动作> with <Gadget名称>"。
  • steals(gadget) 接受一个Gadget作为输入并返回一个字符串,同时根据以下条件执行一些操作:
    • 如果反派已经拥有该道具,则返回字符串 "<Villain名称> already has <Gadget名称>"。
    • 否则,反派偷走该道具并现在拥有它。道具的惊艳值也会恢复到其原始值。如果该道具之前由另一个反派拥有,则该其他反派的邪恶值将减半(向下取整到最接近的整数),并返回字符串 "<Villain名称> steals <Gadget名称> from <前拥有者名称>"。否则,该道具之前无拥有者,返回字符串 "<Villain名称> steals <Gadget名称>"。
  • envy(other) 接受一个Gadget或Villain作为输入,并根据以下条件返回一个字符串:
    • 如果other是一个无主Gadget,则返回字符串 "<Villain名称> envies <Gadget名称>"。
    • 如果other是一个被另一个反派拥有的Gadget,则返回字符串 "<Villain名称> envies <其他Villain名称>'s <Gadget名称>"。
    • 如果other是反派当前拥有的Gadget,则返回字符串 "<Villain名称> already has <Gadget名称>"。
    • 如果other是反派本人,则返回字符串 "<Villain名称> cannot envy himself!"。
    • 如果other是另一个与该反派邪恶值相同的Villain,则返回字符串 "Nobody is envious"。
    • 如果other是另一个邪恶值不同的Villain,则返回字符串 "<Villain A名称> envies <Villain B名称>",其中Villain A的邪恶值低于Villain B。

freeze_ray.get_description()
"Freeze Ray has level 4 awesomeness" # Freeze Ray惊艳值减少
gru.do_evil("steals candy", freeze_ray)
"Gru steals candy with Freeze Ray"
gru.get_proficiency(freeze_ray)
"Gru's proficiency with Freeze Ray is 2"
gru.get_evilness()
10
freeze_ray.get_description()
"Freeze Ray has level 3 awesomeness"
gru.envy(freeze_ray)
"Gru already has Freeze Ray"
vector.envy(freeze_ray)
"Vector envies Gru's Freeze Ray"
gru.envy(vector)
"Vector envies Gru"
vector.steals(freeze_ray)
"Vector steals Freeze Ray from Gru"
gru.get_evilness()
5 # Gru的邪恶值减半
freeze_ray.get_description()
"Freeze Ray has level 5 awesomeness" # 惊艳值恢复到原始值
freeze_ray.owned_by()
"Freeze Ray belongs to Vector"
gru.gadgets_owned()
()
vector.do_evil("freezes Miami", freeze_ray)
"Vector freezes Miami with Freeze Ray"
vector.get_evilness()
5

如果other是另一个邪恶值不同的Villain,则返回字符串 "<Villain A名称> envies <Villain B名称>",其中Villain A的邪恶值低于Villain B。

为类Villain和Gadget提供实现。

为简化起见,你无需担心数据抽象,可以直接访问两个类的属性。注意返回字符串中的字符,尤其是空格和标点。

SAMPLE EXECUTION:

gru = Villain("Gru")
vector = Villain("Vector")
freeze_ray = Gadget("Freeze Ray", 5)
lava_gun = Gadget("Lava Lamp Gun", 3)
gru.get_evilness()
0
gru.gadgets_owned()
()
freeze_ray.get_description()
"Freeze Ray has level 5 awesomeness"
freeze_ray.owned_by()
"Freeze Ray is unowned"
gru.steals(freeze_ray)
"Gru steals Freeze Ray"
gru.gadgets_owned()
("Freeze Ray",)
freeze_ray.owned_by()
"Freeze Ray belongs to Gru"
gru.get_proficiency(freeze_ray)
"Gru is not proficient with Freeze Ray"
gru.do_evil("robs a bank", freeze_ray)
"Gru robs a bank with Freeze Ray"
gru.get_evilness()
5 # Gru邪恶值增加Freeze Ray的惊艳值
gru.get_proficiency(freeze_ray)
"Gru's proficiency with Freeze Ray is 1"
gru.envy(vector)
"Nobody is envious"
gru.envy(lava_gun)
"Gru envies Lava Lamp Gun"
gru.do_evil("steals Freeze Ray", lava_gun)
"Gru does not have Lava Lamp Gun"
gru.envy(lava_gun)
"Gru envies Lava Lamp Gun"
gru.steals(lava_gun)
"Gru steals Lava Lamp Gun"
gru.do_evil("steals the Queen's crown", lava_gun)
"Gru steals the Queen's crown with Lava Lamp Gun"
gru.get_evilness()
8
gru.envy(vector)
"Vector envies Gru"
gru.steals(freeze_ray)
"Gru steals Freeze Ray from Vector"
vector.get_evilness()
2
gru.get_evilness()
8
gru.gadgets_owned()
("Lava Lamp Gun", "Freeze Ray")
gru.do_evil("freezes Vector", freeze_ray)
"Gru freezes Vector with Freeze Ray"
gru.get_evilness()
15

建议逐步解决这个问题。即使你无法满足所有期望的行为,你仍可因满足基本行为而获得部分学分。

反派联盟题目