为纸牌游戏创造持续效果

时间:2017-12-02 15:26:24

标签: python python-3.x while-loop

我试图找出流行游戏Hearthstone的一些卡片的代码并用Python复制它。我说炉石,但这基本上适用于每一个纸牌游戏,如Magic the Gathering等...... 让我们说我在场上有一个生物:

class Creature:
    def __init__(self,manacost,atk,health):
        self.manacost = manacost
        self.atk = atk
        self.health = health

creature = Creature(2,3,2)
field = []
field.append(creature)

现在,这个生物有一个连续的效果,如#34;手中的法术花费少一个"。这意味着,当卡片在场上时,我的法术费用将减少1,并且一旦卡片离开场地,他们将返回原始费用。 然后我写道:

class Spell:
    def __init__(self,manacost):
        self.manacost = manacost

s1 = Spell(1)
s2 = Spell(2)
s3 = Spell(3)

hand = [s1,s2,s3]

while creature in field == True:
    for spell in hand:
        if spell.manacost >=1:
            spell.manacost -= 1

起初,我预计最终我的所有法术都会manacost等于0。 相反没有发生。 打字

[x.manacost for x in hand]

我得到[1,2,3],这与我在开始时为法术设置的manacost完全相同。我该怎么办?

编辑后答案

最后,我的代码已修复(我必须在此处发布,而不是在答案中,因为我在回复时段中没有足够的字符。

class Creature:
    def __init__(self,manacost,atk,health):
        self.manacost = manacost
        self.atk = atk
        self.health = health
    def continuous_effect(self):
        global spellcostdifference
        spellcostdifference += 1
    def continuous_effect_cancel(self):
        global spellcostdifference
        spellcostdifference -= 1

class Spell:
    def __init__(self,manacost):
        self.manacost = manacost
    def current_manacost(self):
        global spellcostdifference
        return self.manacost - spellcostdifference if spellcostdifference <= self.manacost else 0

spellcostdifference = 0
creature = Creature(2,3,2)
s1 = Spell(1)
s2 = Spell(2)
s3 = Spell(3)
hand = [s1,s2,s3]

creature.continuous_effect() ## this means the creature is on the field
creature.continuous_effect_cancel() ## this means the creature left the field or got its effect negated

非常感谢你们的帮助=)

3 个答案:

答案 0 :(得分:3)

Python确实看起来与英语/伪代码类似,但在这种情况下,含义不同。当你标记问题时,构造while <condition>: <looping code>是一个循环,这意味着当程序到达这一点时,只要条件为真,它就会继续运行包装代码。

在这种情况下,如果不是operator precedence的问题,您的代码将是无限循环。你写的内容被解释为:

while creature in (field == True):
    for spell in hand:
        if spell.manacost >=1:
            spell.manacost -= 1

永远不会运行,而不是

while (creature in field) == True:
    for spell in hand:
        if spell.manacost >=1:
            spell.manacost -= 1

或等效

while creature in field:
    for spell in hand:
        if spell.manacost >=1:
            spell.manacost -= 1

这两个都是永久运行的无限循环。

你想要的是一个功能,它根据原来的法术力费用和当前修正值来计算当前的法术力费用,就像Atto建议的那样。

这样做的一种方法是作为Spell类中的新方法,如下所示:

class Spell:
    def current_manacost(self, field, creature):
        if creature in field:
            return self.manacost - 1
        else:
            return self.manacost

    def __init__(self,manacost):
        self.manacost = manacost

print([x.current_manacost(field, creature) for x in hand])

Try it online!

答案 1 :(得分:2)

你不需要一个while循环,这会不断降低所有的法术力费用为0.你可能想要一个完全不同的变量来控制buff / debuff。

例如:

spell_manacost_modifier = 0

class Spell:
    def __init__(self,manacost):
        self.manacost = manacost

def calculate_cost(spell):
    final_cost = spell.manacost + spell_manacost_modifier
    return final_cost if final_cost >=0 else 0

s1 = Spell(1)
s2 = Spell(2)
s3 = Spell(3)

hand = [s1,s2,s3]

# this specific if statement should be run when the turn starts, after of course setting spell_manacost_modifier to 0
if creature in field:
    spell_manacost_modifier -= 1

for spell in hand:
    print(calculate_cost(spell))

希望这有帮助!

答案 2 :(得分:0)

计算为布尔值的表达式不需要与True或False进行比较。

>>> a = [1,2,3]
>>> 1 in a == True
False

a == True正在1 in a之前进行评估。参考6.16 Operator Precedence

>>> 1 in a
True
>>> a == True
False

>>> (1 in a) == True
True
>>>

变化:

while creature in field == True

while creature in field: