带有公式的Python变量都返回值1

时间:2013-10-19 19:10:31

标签: python variables formula

(作为参考,我问了一个单独的问题 - 已经回答 - 关于同一个脚本here

我正在学习Python,这是我的第一个程序。我正在尝试创建一个非常基本的类似RPG的游戏,你可以选择一个角色,给角色一个武器,然后告诉它根据使用角色和武器的属性的公式攻击另一个受到伤害的角色。 / p>

我确定我做的事情显然是错误的,但我不能让我的[变量] = ______公式返回除1以外的任何值,即使公式右侧使用的变量返回正确价值独立。

这就是我的“Char”(角色)课程的样子(抱歉,如果我提供的太多 - 尽量不留下任何可能有用的东西):

def __init__(self, name):
    self.name = name
    self.hp = 300
    self.mp = 10
    self.strn = 1
    self.dex = 1
    self.armor = 0
    self.xp = 0
    self.items = []
    self.spells = []
    self.weapon = weapon


    self.attack_speed = self.dex

    self.intact_bones = ["right arm", "left arm", "right leg", "leg leg", 
                    "skull", "sternum", "nose"] # JUST ASSUME RIGHT SIDE 
                                                # IS PRIMARY SIDE FOR NOW

    self.broken_bones = [] ### define what to do per bone if bone is in this list

    self.base_dmg = self.strn * self.weapon.wgt
    self.break_bone_chance = (self.weapon.impact / 50) * 100
    self.bleed_chance = (self.weapon.sharp / 50) * 100

    self.strike_dmg = self.base_dmg # NEED TO ADD A RANDOM ELEMENT TO DAMAGE

def break_crit(self, target):
    print "checking break_crit" # ALL THESE PRINTS ARE TEMPORARY TO TEST THE VARIABLES
    print "self.break_bone_chance = %r" % self.break_bone_chance
    print "self.base_dmg = %r" % self.base_dmg
    print "self.strike_dmg = %r" % self.strike_dmg
    print "len(target.intact_bones) = %r" % len(target.intact_bones)
    print "self.weapon = %r" % self.weapon.name
    print "self.weapon.impact = %r" % self.weapon.impact
    print "self.weapon.wgt = %r" % self.weapon.wgt

    if (randint(1, 100) <= self.break_bone_chance) and (self.strike_dmg > 0) and (len(target.intact_bones) != 0):
        random.shuffle(target.intact_bones)
        target.new_broken_bone = target.intact_bones.pop()
        target.broken_bones.append(target.new_broken_bone)
        print "%s hit %s square in the %s with his %s, cracking his %s!" % (self, target, target.new_broken_bone, self.weapon, target.new_broken_bone)
        self.bleed_crit(target)
    else:
        self.bleed_crit(target)


def bleed_crit(self, target):
    if randint(1, 100) <= self.bleed_chance and self.strike_dmg > 0:
        pass
    else:
        pass # GO TO NEXT ACTION


def attack(self, target):
    ###self.strike_dmg = self.dmg - target.armor # NEED TO ADD A RANDOM ELEMENT TO DAMAGE###
    if self.strike_dmg > 0:
        target.hp -= self.strike_dmg
        print "%s hit %s for %s damage!" % (self.name, target.name, self.strike_dmg)
        self.break_crit(target)
    else: 
        print "%s's strike did no damage!" % self.name          

我的武器类属于装备顶级类:

class Equip(object):
    wgt = 1

class weapon(Equip):
    impact = 1
    sharp = 1

    def __init__(self, name):
        self.name = name
    desc = ""

chuck = weapon("Nun-chuck")
chuck.wgt = 3
chuck.impact = 6
chuck.sharp = 0

dean = Char("Dean")
dean.strn = 3
dean.dex = 8
dean.weapon = chuck

然后我只是运行一个简单的:     dean.attack(汉密尔顿)#hamilton只是另一个Char

令我困惑的是,当我“打印........”来测试数字时,打印的数字是正确的。例如,self.weapon.wgt显示为预期的3,self.strn打印为3预期,self.weapon.impact按预期打印为6。但是,在self.break_bone_chance中,我确定self.weapon.impact返回为1(暂时将self.break_bone_chance =仅返回到self.weapon.impact),self.strike_dmg也返回为1。

同样,我可以提供有问题的“武器”和“Char”的代码,如果它会发生声音,但我试图忽略任何不必要的东西。根据我在这里提供的内容,看起来有什么不对吗?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我只是很快看了这个,但是kroolik的评论可能是你遇到的问题 - 整数除法截断。

您可以将50更改为50.0,这样可以解决此问题,或者您可以使用from future import division将来导入默认情况下将所有分区设置为浮点除法。如果你真的想要整数除法,你需要使用//