-1

所以我有以下代码:

    def monsterturn():
        global monster
        global playerhp
        turn = True
        print "Rolling for", monster, "...(14 or better to hit)"
        time.sleep(1)
        if r > 14:
            print r, "- The", monster, "hit you!"
            playerhp-=1
            time.sleep(0.5)
            print "Your HP:", playerhp
            if playerhp == 0:
                    turn = False
                    time.sleep(0.5)
                    print "YOU HAVE BEEN SLAIN."
            else:
                    turn = False
                    time.sleep(1.5)
                    playerturn()
        elif r < 14:
            print r, "- The", monster, "missed you."
            turn = False
            playerturn()
    r = randrange(1, 21)

该函数playerturn()的结构与 完全类似monsterturn(),除了全局变量 monsterhp 代替 playerhp,r2 代替 r,以及玩家而不是怪物的对话。问题是,它计算一个随机整数一次,然后保留它,这通常会导致永远没有人打任何人。我怎样才能让它每次都计算一个不同的随机整数?

此外,该函数playerturn()被调用,最后触发monsterturn(),触发playerturn(),依此类推,直到有人死。

4

2 回答 2

1

我认为您应该重新考虑您的整体设计,因为这会导致您遇到问题。这在很大程度上是理论上的,但是您的战斗时间越长,您的调用堆栈就会变得越深,最终可能导致堆栈溢出(并且还会增加内存消耗;即使它继续运行良好)。

相反,我建议您重新编写函数以返回布尔值,游戏是否应该继续。然后,只要两个函数都返回 true,您就可以循环,本质上意味着游戏继续:

while playerturn() and monsterturn():

为了使每次命中/攻击随机,您r需要在使用它之前重新分配一个随机值:

...
time.sleep(1)
r = randrange(1, 21)
if r > 14
    ...
于 2013-07-22T16:41:48.127 回答
0

在循环内而不是在循环外计算 r。

你也可以通过分解常见的材料来大大改善这一点,使怪物和玩家具有相同的回合功能。您可以通过避免引用全局变量并传入更改的细节(对手的生命值、要打印的消息等)来做到这一点

于 2013-07-22T16:35:23.803 回答