[PR]当サイトはアフィリエイト広告を利用しています。
前回はリスの繁殖のシミュレーションのアルゴリズムと使用するクラスを解説しました。
今回は使用するクラスの解説を続けます。
前回は土地のクラスでしたが、今回はリスそのもののクラスです。
早速作成したクラスが以下。
class indiv:
def __init__(self, x, y):
self.x = x
self.y = y
self.life = True
self.lifeTime = 24
self.tempMoveList = [True,True,True,True,True,True,True,True]
self.tempLife = True
def move(self, cells):
self.tempLife = False
self.tempMoveList = [True,True,True,True,True,True,True,True]
while(True in self.tempMoveList):
temp = random.randint(0, 7)
if(temp == 0):
if(cells[self.x - 1][self.y - 1].wall == False) and (cells[self.x - 1][self.y - 1].active == False) and (cells[self.x - 1][self.y - 1].recoveryTime == False):
self.tempLife = True
cells[self.x - 1][self.y - 1].active = True
cells[self.x][self.y].active = False
self.x -= 1
self.y -= 1
return self.x, self.y
else:
self.tempMoveList[0] = False
elif(temp == 1):
if(cells[self.x][self.y - 1].wall == False) and (cells[self.x][self.y - 1].active == False) and (cells[self.x][self.y - 1].recoveryTime == False):
self.tempLife = True
cells[self.x][self.y - 1].active = True
cells[self.x][self.y].active = False
self.y -= 1
return self.x, self.y
else:
self.tempMoveList[1] = False
elif(temp == 2):
if(cells[self.x + 1][self.y - 1].wall == False) and (cells[self.x + 1][self.y - 1].active == False) and (cells[self.x + 1][self.y - 1].recoveryTime == False):
self.tempLife = True
cells[self.x + 1][self.y - 1].active = True
cells[self.x][self.y].active = False
self.x += 1
self.y -= 1
return self.x, self.y
else:
self.tempMoveList[2] = False
elif(temp == 3):
if(cells[self.x - 1][self.y].wall == False) and (cells[self.x - 1][self.y].active == False) and (cells[self.x - 1][self.y].recoveryTime == False):
self.tempLife = True
cells[self.x - 1][self.y].active = True
cells[self.x][self.y].active = False
self.x -= 1
return self.x, self.y
else:
self.tempMoveList[3] = False
elif(temp == 4):
if(cells[self.x + 1][self.y].wall == False) and (cells[self.x + 1][self.y].active == False) and (cells[self.x + 1][self.y].recoveryTime == False):
self.tempLife = True
cells[self.x + 1][self.y].active = True
cells[self.x][self.y].active = False
self.x += 1
return self.x, self.y
else:
self.tempMoveList[4] = False
elif(temp == 5):
if(cells[self.x - 1][self.y + 1].wall == False) and (cells[self.x - 1][self.y + 1].active == False) and (cells[self.x - 1][self.y + 1].recoveryTime == False):
self.tempLife = True
cells[self.x - 1][self.y + 1].active = True
cells[self.x][self.y].active = False
self.x -= 1
self.y += 1
return self.x, self.y
else:
self.tempMoveList[5] = False
elif(temp == 6):
if(cells[self.x][self.y + 1].wall == False) and (cells[self.x][self.y + 1].active == False) and (cells[self.x][self.y + 1].recoveryTime == False):
self.tempLife = True
cells[self.x][self.y + 1].active = True
cells[self.x][self.y].active = False
self.y += 1
return self.x, self.y
else:
self.tempMoveList[6] = False
elif(temp == 7):
if(cells[self.x + 1][self.y + 1].wall == False) and (cells[self.x + 1][self.y + 1].active == False) and (cells[self.x + 1][self.y + 1].recoveryTime == False):
self.tempLife = True
cells[self.x + 1][self.y + 1].active = True
cells[self.x][self.y].active = False
self.x += 1
self.y += 1
return self.x, self.y
else:
self.tempMoveList[7] = False
if(self.tempLife == False):
self.life = False
cells[self.x][self.y].active = False
return self.x, self.y
def die(self, cells):
self.lifeTime -= 1
if(self.lifeTime == 0):
self.life = False
cells[self.x][self.y].active = False
関数moveが要です。
まず下の図を見てください。
このように基準となる目から一マスずれたマスを考えます。基準のマス目の周りを考えるということです。
関数moveでは乱数を発生させてこの周りのマス目のどれかを選びます。
それから選んだマス目が、activeでない、かつ壁ではない、かつ回復中ではないならそこへ移動します。
移動先のactiveをTrueにして、元いたマス目のactiveをFalseに戻します。
これが周囲8マス分あるという処理です。
また移動できるマスがなければ死亡とします。
次に関数die。
これは呼び出されるたびにインスタンスのライフを一つずつ減らして、寿命が来たら死亡、すなわちlifeをFalseにして、今いるセルのactiveをFalseに戻します。
今回はここまで。
次回はアルゴリズム本体の解説と実行を予定しています。