私はPythonを使用して単純な進化シミュレーターを作成しています。
engine.All
ユニット/動物と食べ物の両方を保存する、と呼ばれるリストがあります。私はそれを繰り返し、動物に出くわした場合は、もう一度繰り返して、彼が食べ物のいずれかと衝突しているかどうかを確認します。
もしそうなら、私は彼のエネルギーを増やし、食べ物に食べたものとしてフラグを立て、それをtoRemove
リストに追加します。これは後で要素を削除するために使用しengine.All
ます。
これはコードですが、冗長なものはすべて削除されています。
def remove(l, who): #This should remove all the elements contained in who from the list l
offset = 0
for i in who:
l.pop(i + offset)
offset -= 1
return l
for ob in engine.All:
if ob.skip:
continue;
if ob.drawable:
ob.draw()
if isinstance(ob, Flatlander): #If it is an animal
#Do speed stuff
ob.energy -= decay #Lower its energy
for i in range(len(engine.All)): #Iterate through the list again
if collides(ob.pos, ob.r, engine.All[i].pos, engine.All[i].r) and isinstance(engine.All[i], Food) and ob.energy + engine.All[i].r < ob.r**2*3.14 and not engine.All[i].skip: #If it collides with a food piece, the food piece isn't about to be deleted and it can take the energy in (their maximum is defined by their radiuses)
ob.energy += engine.All[i].r #Increase the his energy
toRemove.append(i) #Add the food piece to the toRemove list
engine.All[i].skip = True #Flag it as skipped
if ob.energy < 0 and not ob.skip: #If its energy is 0 and if it isn't already about to be deleted
toRemove.append(engine.All.index(ob)) #Add it to the toRemove list
ob.skip = True #Flag it as skipped
engine.All = remove(engine.All, toRemove)
私はこれがうまくいかないこと、そしてこれを行うためのより良い方法があることをほぼ確信しています。私が確信している理由は、画面上で物事が「点滅」しているのを時々目にするからです。突然消えて、再び現れます。また、「幽霊」の動物(コードではフラットランダーと呼ばれます)がいるようですが、食べ物が永久に消えてしまうことがあるので、これを結論付けます。
より効率的な方法をお勧めします。