我有一个相当简单的python问题,因为我对这门语言很陌生。我开始为练习编写一个快速程序,但现在变得很沮丧,因为我无法让它工作。
import random
import sys
class Meta:
turncounter = 1
class Enemy:
life = 10
wis = 1
str = 3
def heal(self):
healscore = self.wis + random.randrange(1, 7, 1)
self.life += healscore
print "Enemy healed for " + str(healscore) + ".\n"
self.checklife()
Meta.turncounter += 1
def attack(self, player):
damage = self.str + random.randrange(1, 5, 1)
player.life -= damage
print "You took " + str(damage) + " damage.\n"
Player.checklife(player)
Meta.turncounter += 1
def checklife(self):
if self.life <= 0:
print "The enemy is dead.\n"
sys.exit(0)
else:
print "Enemy's HP: " + str(self.life) + ".\n"
class Player:
life = 50
wis = 3
str = 5
def heal(self):
healscore = self.wis + random.randrange(1, 7, 1)
self.life += healscore
print "You healed for " + str(healscore) + ".\n"
Meta.turncounter += 1
def attack(self, enemy):
damage = self.str + random.randrange(1, 5, 1)
enemy.life -= damage
print "You did " + str(damage) + " damage.\n"
Enemy.checklife(enemy)
Meta.turncounter += 1
def checklife(self):
if self.life <= 0:
sys.exit("You died!")
else:
print "HP: " + str(self.life) + ".\n"
paladin = Player()
hollow = Enemy()
turnmeta = Meta.turncounter % 2
move = random.randrange(1, 3, 1)
print turnmeta
print move
while turnmeta == 0:
if move == 1 and paladin.life <= 10:
paladin.heal()
print turnmeta
elif move != 0 or (move == 1 and hollow.life > 15):
paladin.attack(hollow)
print turnmeta
while turnmeta > 0:
if move == 1 and hollow.life <= 15:
print turnmeta
elif move != 0 or (move == 1 and hollow.life > 15):
hollow.attack(paladin)
print turnmeta
如您所见,这个程序并不是特别复杂;它只是意味着通常理解python语法和循环等。出于某种原因,每当我运行程序时,而不是转弯计数器递增而来回的圣骑士/空心,转弯计数器保持锁定在1,导致空洞攻击直到圣骑士死亡,立即结束程序。 / p>
答案 0 :(得分:2)
问题是你的while循环依赖于turnmeta
,当你在类方法中增加Meta.turncounter
时,它不会改变。
注意:
>>> class Meta(object):
... turncounter = 0
...
>>> turnmeta = Meta.turncounter
>>> turnmeta
0
>>> Meta.turncounter += 1
>>> turnmeta
0
>>> Meta.turncounter
1
只需使用Meta.turncounter
。
话虽这么说,你的设计在很大程度上依赖于类属性,但设计并不好,并且略过代码我不认为你正在做你认为自己在做的事情。 Python类定义与Java不同。
您需要使用__init__
在self.attribute
方法(或任何其他方法)中定义实例属性,而不是在类命名空间中定义,就像您在类定义中所做的那样。
答案 1 :(得分:0)
你的第二个while循环永远不会在move == 1
结束,因为变量turnmeta
的值永远不会改变,并且始终为1且变量'move`始终为1。
如果我正确理解您的程序,您需要在循环中为其提供新值:turnmeta = Meta.turncounter % 2
和move = random.randrange(1, 3, 1)
。
答案 2 :(得分:0)
turnmeta
是您的计算结果Meta.turncounter % 2
。
它不再引用您的Meta.turncounter
。
你应该在每次转弯后重新分配转弯。