同时运行两种方法

时间:2017-01-27 22:02:23

标签: python python-3.x

我正在尝试制作基于文本的冒险游戏。我的代码是这样的:

class NPC(object):
    def __init__(self, health, damage, rate_of_fire):
        self.health = health
        self.damage = damage
        def attack(self, opponent):
            def attackopponent():
                while self.health > 0 and opponent.health > 0:
                    opponent.health -= self.weapon.damage
                    sleep(self.rate_of_fire)
            def opponentattack():
                while self.health > 0 and opponent.health > 0:
                    self.health -= opponent.weapon.damage
                    sleep(opponent.rate_of_fire)

我已经研究了一个星期,所有的答案要么不起作用,要么我太新了解它们。有人可以向我解释如何同时运行这两种方法吗?

我希望每个NPC都有自己的射速和自身伤害,然后相互射击,直到其中一人死亡。

2 个答案:

答案 0 :(得分:0)

答案是:在大多数Python版本中,你不能。你可以在Python中运行多线程(运行C代码模块),但C python有一个全局解释锁(GIL),这可以防止任何python函数的多线程。

可能,"真实"回答这里是你想要决定你的世界的粒度,然后排队功能以在那个粒度下运行... s.t.你的两个功能是"同时"如果他们都跑在同一个" tick" ...但这超出了简单的堆栈交换答案。

看看基于回合的游戏玩法是如何运作的 - 比如XCOM(或XCOM2)或者无冬之夜2.一个实时的例子(以及奖励积分,在python中)是eve-online(现在是免费的) 。你无法查看代码,但是如果你玩了一段时间,你就会明白每个实体每晚只有一次操作...所以发生在相同的"秒"就游戏而言,是同步的。

答案 1 :(得分:0)

问题比这个原始例子更复杂。

通常游戏有mainloop执行仅产生小“步”的功能。因为每个函数在同一个循环中只做小的“步”,所以最后它看起来像所有函数同时工作。

class NPC(object):

    def __init__(self, health, damage, rate_of_fire):
        self.health = health
        self.damage = damage

    def attack(self, opponent):
        while self.health > 0 and opponent.health > 0:
             attackopponent(opponent)
             opponentattack(opponent)
             sleep(self.rate_of_fire)

    def attackopponent(opponent):
        if self.health > 0 and opponent.health > 0:
            opponent.health -= self.weapon.damage

    def opponentattack(opponent):
        if self.health > 0 and opponent.health > 0:
            self.health -= opponent.weapon.damage