如何在python中的特定坐标处保存建筑物?

时间:2014-12-04 02:46:15

标签: python random coordinates

所以我知道如何保存班级的x,y坐标,但我不知道如何在我的玩家所在的坐标处保存建筑物。我会尝试更清楚地说明这一点。

我正在以文字为基础。要移动播放器,您可以键入左,右,上或下。因此它会相应地改变你的x和y。

Ex:要向上移动,它会向玩家类的y值加1。 player.yPos + = 1。然而,如果玩家进入0,1然后0,2但是又回到0,1并且在0,1点处有一座建筑物,我怎么能确保它在玩家时仍然存在回去?我一直在想我必须将所有玩家的x,y动作存储到列表中。我不知道如何使该列表的位置等于将存在的对象。如果这没有意义,我可以尝试重写。

P.S。请尽可能使用最简单的逻辑解释。一般来说,当我在stackoverflow上读到一些东西时,我想跳出悬崖,它是如何涉及的。 (基本上,请为我愚​​蠢!)

class player:
    Cnuts = 0
    statPoints = 0
    pStrength = 0
    pConstitution = 0
    pQuickness = 0
    pIntelligence = 0
    pStamina = 0
    playerName = ''
    Weapon = 0
    Armour = 0
    Shield = 0
    inventory = []
    xPos = 0
    yPos = 0

#Building Code

class Entity:
    id = 0
    xPos = 0
    yPos = 0
    name = ''
    description = ''
    def __init__(self, id, xLocation, yLocation, name, description):
        self.xLocation = xLocation
        self.yLocation = yLocation
        self.id = id
        self.name = name
        self.description = description

class Structure(Entity):
    pass

我还没有决定结构/建筑课程的内容,因为我不知道除了实体已有的东西之外还需要什么。我还有另一个类,它也是从Entity继承的,这就是为什么我拥有它。

#Map code

isExploring = True
def Map():
    while isExploring == True:
        pInput = input('What direction would you like to go?')
        if pInput == 'Up':
            player.yPos += 1
        elif pInput == 'Down':
            player.yPos -= 1
        elif pInput == 'Left':
            player.xPos -= 1
        elif pInput == 'Right':
            player.xPos += 1
        elif pInput == 'Diagonal Left':
            player.xPos
            player.yPos
        elif pInput == 'Diagonal Right':
            pass
        elif pInput == 'Down Diag Left':
            pass
        elif pInput == 'Down Diag Right':
            pass

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

我没有看到建筑物的代码,但我猜测建筑最终会继承Entity(玩家也应该继承这个类)。实体对象具有self.xLocationself.yLocation,因此这使得实现位置感知播放器更容易一些。所以你所做的就是你为建造所做的课必须实现__hash__方法,所以就像这样。

class Building(Entity):
    def __hash__(self):
        return hash(tuple(self.xLocatioin, self.yLocation))

    def __eq__(self, other):
        return isinstance(other, Building) and hash(self) == hash(other)

该函数被称为__hash__,因为python将此特殊关键字识别为意味着构建对象可以放在字典中。因此,每当您尝试将Building对象放入集合中或将其用作字典的键时,python将自动调用它的__hash__方法,并使用该值来确定位置将对象放在集合/字典中。实现哈希通常意味着实现__eq__,这是python在使用==运算符比较2个对象时自动调用的另一个神奇函数。

然后,玩家类会将其访问过的每个建筑物存储在一个集合中,然后可以查询该集合以确定是否已经访问过该建筑物

class Player(Entity):
    def __init__(self, *args):
        super.__init__(self, args)
        self.visited = set()
        self.currLocation = tuple(self.xLocatioin, self.yLocation)

    def visit(self, entity):
        if not beenHere(entity):
            self.visited.add(entity)
        self.currLocation = tuple(entity.xLocatioin, entity.yLocation)

    def beenHere(self, entity):
        return entity in self.visited

你有它,现在玩家对象可以确定它之前访问过哪个建筑物