我试图找出流行游戏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
非常感谢你们的帮助=)
答案 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])
答案 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: