創建簡單的二維“捕食者-被捕食者”模擬。在這個模擬中,被捕食者是螞蟻(ant),捕食者是獅蟻(doodlebug)。這些小生物生活在20×20的網格中。每個單元格每次只能由一個個體占據。網格是封閉的,所以個體不允許離開世界邊緣。時間以time step為單位。個體在每個time step裡面都要采取某項行動。
螞蟻的行為像下面這樣建模。
Move(移動):在每個time step中,都隨機向上、向下、向左或者向右移動。假如所選方向上的鄰居單元格被占據,或者會造成螞蟻移動到網格的邊緣之外,那麼螞蟻就停留在當前的單元格中。
Breed(繁殖):如果一只螞蟻在3個time step中保存存活,在第3個time step結束之後(也就是在移動之後),該螞蟻會繁殖。為了模擬繁殖,需要在相鄰(上、下、左或者右)的一個空單元格中創建一只新螞蟻。沒有可用的空單元格,就不會繁殖。一旦成功繁殖出後代,除非再次經歷3個time step,否則不能繁殖另一個後代。
獅蟻的行為像下面這樣建模。
Move(移動):在每個time step中,假如有一只相鄰的螞蟻(上、下、左或者右),就移動到那個單元格,吃掉螞蟻。否則,獅蟻就按照和螞蟻相同的規則移動。注意,獅蟻不能吃掉獅蟻。
Breed(繁殖):假如一只獅蟻在8個time step中保持存活,在第8個time step結束之後,會按照與螞蟻相同的方式繁殖出一只新獅蟻。
Starve(饑餓):假如一只獅蟻在連續3個time step中沒有吃掉一只螞蟻,在第3個time step結束之後,它會感到饑餓並死亡。該獅蟻應從網格中拿掉。
在一輪中,所有獅蟻都應該先於螞蟻移動。
寫程序來實現這個模擬,使用ASCII字符“o”表示螞蟻,“x”表示獅蟻。創建名為Organism(有機生物)的類,它封裝了通用於螞蟻和獅蟻的基本數據。該類應該有一個名為Move的virtual函數,它要在派生類Ant和Doodlebug中進行具體的定義。可能需要額外的數據結構來跟蹤已移動的生物。
使用5只獅蟻和100只螞蟻初始化這個世界。在每個time step後,都提示用戶按Enter鍵移動到下一個time step。應該看到獅蟻和螞蟻數量的循環變化——雖然一些隨機性的混亂可能造成一種或兩種生物的毀滅。
樓上的答案看上去好高大上啊