John V. Guttag による Python 入門の本を購入し、独学で Python を学ぼうとしています。ほとんどの部分は順調に進んでいますが、この本では語られていない質問があります。前回は酔っ払いシミュレーションについてお話しました。シミュレーションでは、フィールド クラスを使用して酔っ払いが入るフィールドを作成します。次に、継承を使用して別の種類のフィールドを作成します。酔っぱらいが端に行くのを制限し、酔っ払った人が振り向かなければならないフェンスで囲まれたフィールドを作るにはどうすればよいか疑問に思っていました。フィールドコードは次のとおりです。
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]
継承を使用して作成したもう 1 つのフィールドは次のとおりです。
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に慣れていないので、これがどのように機能するのか興味があります。