如何从类的外部增加python中一个类中包含的变量?

时间:2016-06-23 23:45:07

标签: python

我有一个相当简单的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>

3 个答案:

答案 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方法(或任何其他方法)中定义实例属性,而不是在类命名空间中定义,就像您在类定义中所做的那样。

阅读文档: https://docs.python.org/3.5/tutorial/classes.html

答案 1 :(得分:0)

你的第二个while循环永远不会在move == 1结束,因为变量turnmeta的值永远不会改变,并且始终为1且变量'move`始终为1。

如果我正确理解您的程序,您需要在循环中为其提供新值:turnmeta = Meta.turncounter % 2move = random.randrange(1, 3, 1)

答案 2 :(得分:0)

turnmeta是您的计算结果Meta.turncounter % 2

它不再引用您的Meta.turncounter

你应该在每次转弯后重新分配转弯。