如何在循环中重新生成随机整数?
我似乎找不到解决办法,让 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
改成程序前面四个其他的 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
2 个回答
1
我知道这个应该用类来实现,但我还在学习类,所以这里没有用到类:
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!
1
当你调用一个随机数的函数时,它只会返回一个单一的值。这就是你出错的原因。你需要找到一种方法,让这个函数每次都能给你一个新的值。
有一种聪明的做法,可以使用装饰器,我下面会给你展示。
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")