3

每当我运行这个程序时(不是一个严肃的程序,只是为了搞清楚事情的想法),来自monster (monster[1])刚才的损害一遍又一遍地重复相同的数字。它随机化一次,然后重复它。我明白发生了什么,但我不明白为什么会这样。这是代码(对不起,我不知道我的问题是否清楚......在我的脑海中很有意义哈哈)

编辑 - 我希望 Monster[1] 函数每次都随机化,但如果不编写更多代码(即damage=random.randint(5, 15) health-=damage),我不知道该怎么做。如果我这样写它工作正常。但是如果我有一系列 10 个不同的怪物,我不想专门写那个。如果有意义的话,我只想召唤每个怪物并让它自己运行。

编辑#2:是否可以在列表中创建一个元组,因为元组是不可变的(即monster=[100, (random.randint(5, 15)), random.randint(15, 30)]此代码不起作用我已经尝试过,但只是想知道它是否可能。

import random
monster = [100, random.randint(5, 15), random.randint(15, 30)]
health = 200
a = 1

print "you run into a monster"
while a == 1:
    if monster[0] <= 0:
        print "monster is dead"
        print "you get, " + str(monster[1]) + " exp"
        a += 1
    elif monster[0] >= 0:
        att = random.randint(5, 15)
        monster[0] -= att
        health -= monster[1]
        print ("you attack the monster and do, " + str(att) + " damage"
               " the monster does," + str(monster[1]) + " damage to you")
        print "you have, " + str(health) + " health left"
        print "monster has, " + str(monster[0]) + " health left"
4

5 回答 5

2

monster[1]在代码的第二行分配一个随机整数。monster然后它以整数形式存储在列表中。该整数将保持不变。您将不得不重新random.randint(5, 15)调用以获得新的“伤害”数字或新的经验值。

虽然我认为这可能超出了您在这里工作的范围,但您可能希望研究创建一个class怪物而不是使用数组,然后使用一种方法在每次攻击时生成这些随机整数。

这是一个示例怪物类,可以让您了解它是如何工作的。

class monster():
    def __init__(self,health):
        self.health = health

    def attack(self):
        return random.randint(5,15)

然后,您可以按如下方式创建一个新怪物。

monster = monster(100)

看看它造成了多少伤害如下。

monsterDamage = monster.attack()
health -= monsterDamage
print "The monster does " + str(monsterDamage) + " damage to you."

并降低怪物的生命值如下。

att = random.randint(5,15)
monster.health -= att
于 2013-09-15T03:50:52.717 回答
1

这一行:

monster=[100,random.randint(5, 15), random.randint(15, 30)]

保存100和两个随机数一次。例如,这可能是monster运行时的表示:

monster=[100, 11, 26]

而且这些数字不会改变,因为分配只发生一次。(例如,在循环之外)

于 2013-09-15T03:50:25.430 回答
1

monster=[100,random.randint(5, 15), random.randint(15, 30)]

当您定义此列表时,它将始终相同。这些值不会每次都改变monster[1]

要解决此问题,您可以执行以下操作:

monster=[100, random.randint, random.randint]

当你去调用它时:

monster[1](15, 15)

只是一种选择。虽然在这里字典可能会更好。

于 2013-09-15T03:50:35.283 回答
1

好吧,你monster[1]只给了一个值,在第二行:

monster=[100,random.randint(5, 15), random.randint(15, 30)]

该行只执行一次,所以“当然”monster[1]总是相同的。如果你想monster[1](和/或太)改变,你需要你的循环monster[2]中给它一个新的值。你这样做是为了!你需要对所有其他你想看到变化的事情做类似的事情:-)att

于 2013-09-15T03:51:09.880 回答
0

当您拨打您的电话时:

monster = [100, random.randint(5, 15), ...]

执行函数 random.randint(5, 15) 并将特定值存储在列表中。

我将通过将函数存储为字符串来提供另一种方法来做你想做的事;你可以写:

monster = [100, "random.randint(5, 15)", ...]

然后当你想获得一个新的随机整数时,你调用:

r=eval(monster[1])

并且每次调用它时都会给你一个不同的整数,因为函数会被重新评估。

(注意,如果你想重复使用一个随机值,例如打印它,你必须将它存储在一个临时变量“r”中,然后使用 str(r),而不是 str(eval(monster[1 ])),因为前一种方式打印存储在“r”中的调用结果,而后一种方式再次重新评估函数)。

例如。

    tmp = eval(monster[1])
    health -= tmp
    print ("you attack the monster and do, " + str(att) + " damage. the monster does," + str(tmp) + " damage to you")
于 2013-09-16T21:04:02.383 回答