Python

リスの繁殖をシミュレーションしてみる2

Python

[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に戻します。

今回はここまで。

次回はアルゴリズム本体の解説と実行を予定しています。