变量不会更新为类之间的新值

时间:2017-05-05 09:39:02

标签: python tkinter

我正在制作一款基本的RPG风格游戏。我为代码的各个部分制作了不同的类,每个主要项目一个(英雄,门,怪物等)。

对于英雄和门,我给他们分配随机位置,如下面的代码所示,但对于门,我运行一个while循环,确保门与英雄一定距离(使用pythagorus)。

然而,门类中的while循环不起作用,因为它始终对heroC和heroR(英雄的行和列)使用值0。我对使用类相对较新,但它似乎没有意义,因为在HeroLocation中我为这些变量分配了一个随机整数,并且在DoorLocation之前调用了HeroLocation。

非常感谢任何帮助!!

class Hero(Character):
    def __init__(self):
        super(Hero, self).__init__(10, 10, 1, 1, 0, 1)
        self.herolocations = list(range(1,6)) + list(range(10,14))
        self.heroC = 0
        self.heroR = 0
    def HeroLocation(self):
        #place hero
        self.heroC = random.choice(self.herolocations)
        self.heroR = random.choice(self.herolocations)

class Door:
    def __init__(self):
        self.hero = Hero()
        self.doorC = 0
        self.doorR = 0
    def DoorLocation(self):
        while ((self.hero.heroC-self.doorC)**2+(self.hero.heroR-self.doorR)**2) <= 128:
            self.doorC = random.randint(1, 13)
            self.doorR = random.randint(1, 13)

class game:
    def __init__(self, parent):
        self.hero = Hero()
        self.door = Door()
    def MakeMap(self):
        self.hero.HeroLocation()
        self.herol = self.Main_game.create_image(15+30*self.hero.heroC,15+30*self.hero.heroR, image = self.heroimage)        
        self.door.DoorLocation()
        self.doorl = self.Main_game.create_image(15+30*self.door.doorC,15+30*self.door.doorR, image = self.exitdoor)

注意,还有更多的代码,但我只发布了我觉得相关的东西,如果你需要更多来破解拼图消息我!

1 个答案:

答案 0 :(得分:1)

您没有在Hero中调用好Door.DoorLocation个实例。

顺便说一下,我真的建议你改变班级和班级。方法名称Pep 8

Door.__init__,第一行:

self.hero = Hero()

在这里,您要实例化 Hero的实例。但是,在game.MakeMap中,您正在调用self.hero.HeroLocation()

self.hero实例不相同,因为它已在game.__init__中实例化,而不在Door.__init__中实例化。

我没有尝试过,但请检查一下此更新的行为:

class game:
    def __init__(self, parent):
        self.door = Door()
        self.hero = self.door.hero

通过此操作,您现在正在调用Door.__init__中定义的实例,因此在self.hero.HeroLocation()中执行game(self.hero.heroC-self.doorC [...]中的Door时,您指的是相同的实例

最后一点,这个解决方案可能有效,但肯定不是你真正想要的,我认为门不应该存储英雄,英雄不应该存储门,但这里有关于模式的更复杂的问题。