【问题标题】:How do I regenerate a random int in a loop?如何在循环中重新生成随机 int?
【发布时间】:2014-06-18 04:12:51
【问题描述】:

我似乎不知道my_damage 如何创建新的random 值的解决方案。

这是因为while 保持random.randrange 不变。


那么让我们说:

my_damage = random.randrange(40, 45)

然后我们添加战斗公式:

jack_health = (jack_health + jack_defense) - my_damage
print(deskemon + " HAVE INFLICTED " + str(my_damage) + " TO CHIPHEAD")

然后就出来了:

LILWILLY HAVE INFLICTED 41 TO CHIPHEAD
CHIPHEAD HAS 261 HITPOINTS LEFT!
...
...
...
CHIPHEAD HAVE INFLICTED 5 TO LILWILLY
LILWILLY HAS 261 HITPOINTS LEFT!
BATTLE MENU:

(1) ATTACK
(2) SPECIAL ATTACK
> 1
LILWILLY HAVE INFLICTED 41 TO CHIPHEAD
CHIPHEAD HAS 222 HITPOINTS LEFT!
...
...
...
CHIPHEAD HAVE INFLICTED 5 TO LILWILLY
LILWILLY HAS 222 HITPOINTS LEFT!

每次我使用代码时,random 的值都保持不变,不会改变

我知道一个解决方案,但因为 my_damage 可以在我的程序前面通过 input 更改为 4 个其他 random 值,所以我不能使用这个:

jack_health = (jack_health + jack_defense) - random.randrange(20, 25)
print(deskemon + " HAVE INFLICTED " + str(random.randrange(20, 25)) + " TO CHIPHEAD")

注意事项:

如果您需要信息,请查看 pastebin.com 中的完整代码: http://pastebin.com/iij5C16z

【问题讨论】:

  • 你需要播种随机数生成器
  • 复制问题中的代码。
  • @TonyHopkinson - 这不是那个问题的重复,他的代码结构是错误的。他没有在赋值和函数调用之间建立联系。他只分配了一次值,但预计它会在 retrieval 之后发生变化。一个类属性可以做到这一点......但它不只是发生
  • @g.d.d.c 哎呀,懒散的时刻认为这是另一个种子问题。

标签: python loops random while-loop


【解决方案1】:

当你调用一个随机数时,函数返回一个值。因此你的错误。每次需要新值时,您都需要想出一种调用函数的方法。

你可以做一些聪明的事情,需要decorators,我将在下面展示。

def recall_last(func):
    def _inner(*args, **kwargs):
        if args:
            func.last_dealt = func(*args,**kwargs)
        else:
            func.last_dealt = getattr(func,'last_dealt',0)
        return func.last_dealt
    return _inner

@recall_last
def rand_damage(*args):
    return random.randrange(*args)

每次您将下限和上限传递给randrange 函数时,此代码都会返回一个新值。如果没有传递任何内容,则返回最后生成的值。然后这将在您的代码中起作用

if deskemon_selection_input == "1":
    deskemon = "TIMOSHA"
    my_health = 500
    my_damage = (20, 25)
    my_defense = random.randrange(10, 15)
    my_specialattack = 0
    print("You have selected TIMOSHA as your Deskemon")
    deskemon_selection_loop = False

   ....
jack_health = (jack_health + jack_defense) - rand_damage(*my_damage)
print(deskemon + " HAVE INFLICTED " + str(rand_damage()) + " TO CHIPHEAD")

【讨论】:

  • 不,这仍然不对。您仍然只调用random.randrange 一次,您只是添加了一个 lambda 表达式。 my_damage 中的结果值仍然是静态值。
  • 没有看到他的能力,我不知道他不会正确使用它。我将编辑答案以发表评论。
  • 不幸的是,发生了这种情况:Traceback (most recent call last): File "Deskemon.py", line 224, in <module> jack_health = (jack_health + jack_defense) - rand_damage(my_damage) File "Deskemon.py", line 15, in rand_damage return random.randrange(values) File "C:\Program Files\Python\lib\random.py", line 178, in randrange istart = _int(start) TypeError: int() argument must be a string or a number, not 'tuple'
  • my_damage 前面需要一个星号。就像我的代码一样。如果您想对其进行更多研究,这是一个 splat 运算符。我将在周一通过电脑而不是手机更新以澄清。
  • 我现在知道了:Traceback (most recent call last): File "Deskemon.py", line 225, in <module> print(deskemon + " HAS INFLICTED " + str(rand_damage()) + " TO CHIPHEAD") File "Deskemon.py", line 15, in rand_damage return random.randrange(*values) TypeError: randrange() missing 1 required positional argument: 'start'
【解决方案2】:

我知道这应该用类来实现,但我还在学习类,所以这不是使用类:

import random

def damage( attack ):
    return random.randrange(attack*0.9, attack*1.1)

my_name = 'LILWILLY' 
my_health = 300
my_defense = 10
my_attack = 40

enemy_name = 'CHIPHEAD'
enemy_health = 100
enemy_defense = 1
enemy_attack = 40

while my_health > 0 and enemy_health > 0:
    my_damage = damage( my_attack )
    enemy_damage = damage( enemy_attack )
    my_health = (my_health + my_defense) - enemy_damage
    enemy_health = (enemy_health + enemy_defense) - my_damage
    print( '{0} HAVE INFLICTED {1} TO {2}'.format( my_name, my_damage, enemy_name ))
    print( '{0} has {1} hitpoints left'.format(enemy_name, enemy_health ) )
    print( '{0} HAVE INFLICTED {1} TO {2}'.format( enemy_name, enemy_damage, my_name ))
    print( '{0} has {1} hitpoints left'.format(my_name, my_health ) )

else:
    if my_health > 0:
        print ( '***{} has slain {}!'.format(my_name, enemy_name))
    elif enemy_health > 0:
        print ( '***{} has slain {}!'.format(enemy_name, my_name))
    else:
        print('BOTH {} and {} have died'.format(my_name, enemy_name))

我得到的结果:

LILWILLY HAVE INFLICTED 42 TO CHIPHEAD
CHIPHEAD has 59 hitpoints left
CHIPHEAD HAVE INFLICTED 36 TO LILWILLY
LILWILLY has 274 hitpoints left
LILWILLY HAVE INFLICTED 40 TO CHIPHEAD
CHIPHEAD has 20 hitpoints left
CHIPHEAD HAVE INFLICTED 43 TO LILWILLY
LILWILLY has 241 hitpoints left
LILWILLY HAVE INFLICTED 41 TO CHIPHEAD
CHIPHEAD has -20 hitpoints left
CHIPHEAD HAVE INFLICTED 40 TO LILWILLY
LILWILLY has 211 hitpoints left
***LILWILLY has slain CHIPHEAD!

【讨论】:

  • 不幸的是,print 行是错误的。所以如果战斗计算中jack_health被减去42。print行将显示一个新的random值,这使得这个答案无效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多