發表於 Python教學新世界的開端

【Python】生命模擬遊戲 Game of Life 細胞自動機 實現

前言:

說實在我也不知道為什麼今天下午在研究這個
印象中,幾年前好像聽到這個詞
然後今天中午吃完飯就心血來潮想要用 Python 挑戰看看了!! XD
想直接看 程式碼 的可以點這裡!

生命遊戲 介紹 :

康威生命遊戲(英語:Conway’s Game of Life),又稱康威生命棋,是英國數學家約翰·何頓·康威在1970年發明的細胞自動機。

生命遊戲是一個零玩家遊戲它包括一個二維矩形世界,這個世界中的每個方格居住著一個活著的或死了的細胞。一個細胞在下一個時刻生死取決於相鄰八個方格中活著的或死了的細胞的數量。如果相鄰方格活著的細胞數量過多,這個細胞會因為資源匱乏而在下一個時刻死去;相反,如果周圍活細胞過少,這個細胞會因太孤單而死去。實際中,玩家可以設定周圍活細胞的數目怎樣時才適宜該細胞的生存。如果這個數目設定過高,世界中的大部分細胞會因為找不到太多的活的鄰居而死去,直到整個世界都沒有生命;如果這個數目設定過低,世界中又會被生命充滿而沒有什麼變化。

零玩家遊戲: 沒有玩家可以操控。也就是說基本設定之後都是由演算法控制每個細胞的存活與否。

規則:

生命遊戲中,對於任意細胞,規則如下:
每個細胞有兩種狀態 – 存活或死亡,每個細胞與以自身為中心的周圍八格細胞產生互動(如圖,黑色為存活,白色為死亡)

  • 當前細胞為存活狀態時,當周圍的存活細胞低於2個時(不包含2個),該細胞變成死亡狀態。(模擬生命數量稀少)
  • 當前細胞為存活狀態時,當周圍有2個或3個存活細胞時,該細胞保持原樣。
  • 當前細胞為存活狀態時,當周圍有超過3個存活細胞時,該細胞變成死亡狀態。(模擬生命數量過多)
  • 當前細胞為死亡狀態時,當周圍有3個存活細胞時,該細胞變成存活狀態。(模擬繁殖)

可以把最初的細胞結構定義為種子,當所有在種子中的細胞同時被以上規則處理後,可以得到第一代細胞圖。按規則繼續處理當前的細胞圖,可以得到下一代的細胞圖,周而復始。

以上由 維基百科 提供 XD

整理一下就是下面的幾個簡單規則:

  • 某位置之細胞鄰居數為0、1、4、5、6、7、8時,則該位置下次狀態必無細胞存活。
  • 某位置之細胞鄰居數為2時,則該位置下次狀態保持不變(有細胞就有細胞,無細胞就無細胞)。
  • 某位置之細胞鄰居數為3時,則該位置下次狀態必有細胞存活。

講解作法:

我的做法中有三個 Class:

  • Cell
  • Generations
  • World

Cell:
主要就是記錄細胞(因為她也叫做細胞自動機嘛!)的狀況與資料(X, Y, 是否存活)
和提供他座標周圍八格的座標(因為我認為這之後再算的話很麻煩)

Generations:
主要負責 每一代 之間的跳轉,因為每一代都會有細胞的死亡與復活等行為,所以這個Class的行為會比較像是MVC裡面的 C ( Controller )。
控制 何時更新細胞狀態 與 是否要讓細胞死亡或復活。

World:
主要負責地圖的控制,init 的時候是以 Random 的方式決定地圖的樣子的。
我有多設定一個 __next_map 來設定下一代地圖樣貌 ( 為了不因為上一代的計算而影響到地圖資訊 )。
還有重新設定 __getitem__ 和 __setitem__ 這兩個內建 functoin
為了較方便在 Controller 中使用

為了在輸出的時候比較好觀察,所以我用 colorama 設定存活的細胞輸出時是綠色的。
也調整了輸出的格式(我自己看的時候覺得比較好看啦XDDD)

結尾:

從心血來潮到寫完大概1個小時多吧
中間查 Window 改 Console 介面顏色花了好多時間..XD
不過這個演算法用途我還沒很理解
這篇文章好像提到可以用來做加密演算法(?)
可能也有更多的用途但是我事先實作看看了!

如果有想要討論或是有更好的寫法的都可以在下方留言喔!
ㄅㄅ~

 

作者:

一位 熱愛資工領域、喜歡好笑事物、偶爾打打網球 的學生 ! For A Better Me!

發表迴響

Please log in using one of these methods to post your comment:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.