日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

Python生命游戲實現原理及過程解析(附源代碼)

系統 1880 0

1. 生命游戲是什么

生命游戲是英國數學家約翰?何頓?康威在1970年發明的細胞自動機。它包括一個二維矩形世界,這個世界中的每個方格居住著一個活著的或死了的細胞。一個細胞在下一個時刻生死取決于相鄰八個方格中活著的或死了的細胞的數量。如果相鄰方格活著的細胞數量過多,這個細胞會因為資源匱乏而在下一個時刻死去;相反,如果周圍活細胞過少,這個細胞會因太孤單而死去。

規則看起來很簡單,但卻能演繹出無窮無盡的內容。

滑翔者:每4個回合"它"會向右下角走一格。雖然細胞早就是不同的細胞了,但它能保持原本的形態。

Python生命游戲實現原理及過程解析(附源代碼)_第1張圖片

輕量級飛船:它的周期是4,每2個回合會向右邊走一格。

Python生命游戲實現原理及過程解析(附源代碼)_第2張圖片

脈沖星:它的周期為3,看起來像一顆周期爆發的星星。

Python生命游戲實現原理及過程解析(附源代碼)_第3張圖片

更復雜的圖案。

來體會一下這些作品的腦洞以及震撼:

史詩般的生命游戲 http://www.iqiyi.com/w_19rsq435c9.html

用生命游戲實現生命游戲:http://www.bilibili.com/video/av616329/index.html

2. Console版:一個簡單的Python實現

生命游戲的規則其實很簡單。我們可以把計算機中的宇宙想象成是一堆方格子構成的封閉空間,尺寸為N的空間就有N*N個格子。

而每一個格子都可以看成是一個生命體,每個生命都有生和死兩種狀態,如果該格子生就顯示藍色,死則顯示白色。每一個格子旁邊都有鄰居格子存在,如果我們把3*3的9個格子構成的正方形看成一個基本單位的話,那么這個正方形中心的格子的鄰居就是它旁邊的8個格子。

每個格子的生死遵循下面的原則:

1. 如果一個細胞周圍有3個細胞為生(一個細胞周圍共有8個細胞),則該細胞為生(即該細胞若原先為死,則轉為生,若原先為生,則保持不變) 。

2. 如果一個細胞周圍有2個細胞為生,則該細胞的生死狀態保持不變;

3. 在其它情況下,該細胞為死(即該細胞若原先為生,則轉為死,若原先為死,則保持不變)

設定圖像中每個像素的初始狀態后依據上述的游戲規則演繹生命的變化,由于初始狀態和迭代次數不同,將會得到令人嘆服的優美圖案。

我們用#代表活的細胞,空格表示死的細胞,那么我們可以用控制臺打印字符、清屏來模擬生命游戲。我的代碼在github上:

https://github.com/Pleiades0428/GameOfLife/blob/master/Demo/gameOfLife.py

游戲世界尺寸為60x20,隨機生成初始狀態,循環邊界,按任意鍵進入下一幀,q退出。

單純的看這段程序,好像并沒有什么問題,代碼邏輯正確、清晰。

效果圖:

Python生命游戲實現原理及過程解析(附源代碼)_第4張圖片

3. Python列表生成式

我們來嘗試一些python的高級特性,比如列表生成式。

例如,在生成初始值時,我們一般這樣寫:

            
screen = []
width = 60
height = 20
def Init():
 for i in range(height):
  line = []
  for j in range(width):
   if random.random() > 0.8:
    line.append('#')
   else:
    line.append(' ')
  screen.append(line)
          

如果用列表生成式,我們可以這樣寫:

            
 def Init():
  global screen
  screen = [['#' if random.random() > 0.8 else ' ' for i in range(width)] for j in range(height)]
          

注意這里必須用global聲明,否則screen將默認作為函數內的局部變量。這里用了兩層列表生成式來生成一個二維數組。

列表生成式很好很強大,如果用好能大大提高效率。但會犧牲一定的可讀性,如果單個表達式寫的過于復雜,那就變成write-only了。尤其是在團隊開發情況下,可讀性日益重要。

重寫后的代碼:

https://github.com/Pleiades0428/GameOfLife/blob/master/Demo/gameOfLife.1.py

如果僅僅是作為練習,這樣就已經足夠好了,簡潔易讀。

4. 重構:面向對象與重用

可是我們還不能滿足,我們來給生命插上面向對象的翅膀,在模塊化的天空中翱翔。對,就是讓他跟別的模塊搞對象!

先來定義一個類GameOfLifeWorld,之前那些丑陋的全局變量,讓他們統統變成成員變量,再也不能在外興風作浪。

            
class GameOfLifeWorld:

 width = 100
 height = 100
 cells = []
…略
          

然后把UI層剝離,只保留游戲的核心邏輯。

代碼:

https://github.com/Pleiades0428/GameOfLife/blob/master/Demo/gameOfLifeWorld.py

5. GUI:Tkinter的調用

有了上一步的鋪墊,我們終于可以讓Tkinter粉墨登場了。Tkinter是著名的UI庫,Python自帶的Tkinter是一個精簡版,不過也夠我們用的了。

我們這里用到的主要是Canvas,Button控件。Canvas畫布用來繪制游戲區,Button用來交互。

代碼:

https://github.com/Pleiades0428/GameOfLife/blob/master/Demo/gameOfLifeWorld.py

效果:

Python生命游戲實現原理及過程解析(附源代碼)_第5張圖片

以上就是這樣,項目我還會繼續改進,希望大家喜歡。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 南郑县| 彭泽县| 自贡市| 扎兰屯市| 双桥区| 通城县| 巴东县| 丰顺县| 原平市| 宝清县| 贡觉县| 大庆市| 沾益县| 梧州市| 太保市| 柏乡县| 盐山县| 察隅县| 漳浦县| 通江县| 象山县| 合作市| 吉林省| 巴东县| 余江县| 四会市| 平果县| 百色市| 日喀则市| 通州区| 茌平县| 巫溪县| 儋州市| 龙口市| 平乐县| 东明县| 双江| 马龙县| 江安县| 泌阳县| 津市市|