Python 如何为醉汉步行创建围栏场地

Python 如何为醉汉步行创建围栏场地,python,random-walk,Python,Random Walk,我买了一本John V.Guttag的Python入门书,我正在努力自学Python。这在很大程度上是合理的,但我有一个书中没有提到的问题。最新的部分讨论了druken步行模拟。在模拟中,它使用field类创建醉汉可以进入的字段。然后,他使用继承创建另一种字段。我想知道怎样才能把场地围起来,限制醉汉走到边缘,然后醉汉必须转身。以下是字段代码: class Field(object): def __init__(self): self.drunks = {} de

我买了一本John V.Guttag的Python入门书,我正在努力自学Python。这在很大程度上是合理的,但我有一个书中没有提到的问题。最新的部分讨论了druken步行模拟。在模拟中,它使用field类创建醉汉可以进入的字段。然后,他使用继承创建另一种字段。我想知道怎样才能把场地围起来,限制醉汉走到边缘,然后醉汉必须转身。以下是字段代码:

class Field(object):
    def __init__(self):
        self.drunks = {}

    def addDrunk(self, drunk, loc):
        if drunk in self.drunks:
            raise ValueError('Duplicate drunk')
        else:
            self.drunks[drunk] = loc

    def moveDrunk(self, drunk):
        if drunk not in self.drunks:
            raise ValueError('Drunk not in field')
        xDist, yDist = drunk.takeStep()
        currentLocation = self.drunks[drunk]
        #use move method of Location to get new location
        self.drunks[drunk] = currentLocation.move(xDist, yDist)

    def getLoc(self, drunk):
        if drunk not in self.drunks:
            raise ValueError('Drunk not in field')
        return self.drunks[drunk]
这是他用继承法创造的另一个领域:

class oddField(Field):
    def __init__(self, numHoles, xRange, yRange):
        Field.__init__(self)
        self.wormholes = {}
        for w in range(numHoles):
            x = random.randint(-xRange, xRange)
            y = random.randint(-yRange, yRange)
            newX = random.randint(-xRange, xRange)
            newY = random.randint(-yRange, yRange)
            newLoc = Location(newX, newY)
            self.wormholes[(x, y)] = newLoc

    def moveDrunk(self, drunk):
        Field.moveDrunk(self, drunk)
        x = self.drunks[drunk].getX()
        y = self.drunks[drunk].getY()
        if (x, y) in self.wormholes:
            self.drunks[drunk] = self.wormholes[(x, y)]

奇怪的领域使用虫洞移动醉汉,这是很酷的。我还是python新手,所以我很好奇这将如何工作。

假设您的问题是关于
OddField
子类中的方法
movedunk
是如何工作的

子类扩展其超类(这适用于大多数OO语言,如果不是所有OO语言的话)。此处的
OddField
类扩展了Field类,因为它添加了一个名为
wormholes
的属性,还覆盖了超类的
movedunk
方法,这意味着它给了它一个新的实现

子类现在拥有其超类的所有成员,但有一个新属性,还有一个与子类更相关的更定制的
movedunk
实现

因此我们知道子类
OddField
可以像普通字段一样工作,但是它有额外的行为,这些行为来自
OddField
的实现。因此,如果我们在
OddField
上调用
movedunk
方法,它将实现新的行为,而不是超类中的行为


但是,如果你的问题是关于虫洞是如何工作的,我很抱歉,但我在这方面帮不了你

假设您的问题是关于
OddField
子类中的方法
movedunk
是如何工作的

子类扩展其超类(这适用于大多数OO语言,如果不是所有OO语言的话)。此处的
OddField
类扩展了Field类,因为它添加了一个名为
wormholes
的属性,还覆盖了超类的
movedunk
方法,这意味着它给了它一个新的实现

子类现在拥有其超类的所有成员,但有一个新属性,还有一个与子类更相关的更定制的
movedunk
实现

因此我们知道子类
OddField
可以像普通字段一样工作,但是它有额外的行为,这些行为来自
OddField
的实现。因此,如果我们在
OddField
上调用
movedunk
方法,它将实现新的行为,而不是超类中的行为


但是,如果你的问题是关于虫洞是如何工作的,我很抱歉,但我在这方面帮不了你

只需重写moveDundle()方法的逻辑,这样,如果坐标在所需的笛卡尔空间之外,醉汉将保持在围栏内,并且还重写初始化以提供受限的笛卡尔空间。考虑下面的伪代码:


stephenDaedalus类(字段):

definit(自身、笛卡尔空间): Field.init(self) self.fence=cartesianSpace ... def(自我): “注意我们的醉汉在哪里,因为他可能会做一些不可能的事” lastX=self.duckers[ducked].getX() lastY=self.duckers[ducked].getY() 字段。移动喝醉(自我,喝醉) x=self.duckers[ducked].getX() y=self.duckers[ducked].getY() ''检查我们的酒鬼是否仍在参数范围内'' 如果self.cartesianSpace.points中的(x,y): 自醉[醉]=当前位置移动(x,y) “如果他不是,他会跌跌撞撞地回到原来的状态” 其他: self.duckers[ducked]=当前位置.move(lastX,lastY)

您必须实现一个CartesianField类,但是如果您从数学角度考虑这个问题,您可能希望接受一个点列表,然后用该列表分隔的字段内的整数点填充另一个列表。对于新程序员来说,这是一个有趣的挑战。考虑使用Python的矩形类来节省自己的欧几里德头痛:


只需重写moveDundle()方法的逻辑,这样,如果坐标在所需的笛卡尔空间之外,醉汉将保持在围栏内,并且还重写初始化以提供受限的笛卡尔空间。考虑下面的伪代码:


stephenDaedalus类(字段):

definit(自身、笛卡尔空间): Field.init(self) self.fence=cartesianSpace ... def(自我): “注意我们的醉汉在哪里,因为他可能会做一些不可能的事” lastX=self.duckers[ducked].getX() lastY=self.duckers[ducked].getY() 字段。移动喝醉(自我,喝醉) x=self.duckers[ducked].getX() y=self.duckers[ducked].getY() ''检查我们的酒鬼是否仍在参数范围内'' 如果self.cartesianSpace.points中的(x,y): 自醉[醉]=当前位置移动(x,y) “如果他不是,他会跌跌撞撞地回到原来的状态” 其他: self.duckers[ducked]=当前位置.move(lastX,lastY)

您必须实现一个CartesianField类,但是如果您从数学角度考虑这个问题,您可能希望接受一个点列表,然后用该列表分隔的字段内的整数点填充另一个列表。对于新程序员来说,这是一个有趣的挑战。考虑使用Python的矩形类来节省自己的欧几里德头痛:


你能更准确地回答你的问题吗,你到底对什么感兴趣?你感兴趣的是子类
oddField
中的
movedunk
方法吗?正确缩进代码真的很难吗?我会帮你修好的