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

Python生命游戲?qū)崿F(xiàn)原理及過(guò)程解析(附源代碼)

系統(tǒng) 1958 0

1. 生命游戲是什么

生命游戲是英國(guó)數(shù)學(xué)家約翰?何頓?康威在1970年發(fā)明的細(xì)胞自動(dòng)機(jī)。它包括一個(gè)二維矩形世界,這個(gè)世界中的每個(gè)方格居住著一個(gè)活著的或死了的細(xì)胞。一個(gè)細(xì)胞在下一個(gè)時(shí)刻生死取決于相鄰八個(gè)方格中活著的或死了的細(xì)胞的數(shù)量。如果相鄰方格活著的細(xì)胞數(shù)量過(guò)多,這個(gè)細(xì)胞會(huì)因?yàn)橘Y源匱乏而在下一個(gè)時(shí)刻死去;相反,如果周圍活細(xì)胞過(guò)少,這個(gè)細(xì)胞會(huì)因太孤單而死去。

規(guī)則看起來(lái)很簡(jiǎn)單,但卻能演繹出無(wú)窮無(wú)盡的內(nèi)容。

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

Python生命游戲?qū)崿F(xiàn)原理及過(guò)程解析(附源代碼)_第1張圖片

輕量級(jí)飛船:它的周期是4,每2個(gè)回合會(huì)向右邊走一格。

Python生命游戲?qū)崿F(xiàn)原理及過(guò)程解析(附源代碼)_第2張圖片

脈沖星:它的周期為3,看起來(lái)像一顆周期爆發(fā)的星星。

Python生命游戲?qū)崿F(xiàn)原理及過(guò)程解析(附源代碼)_第3張圖片

更復(fù)雜的圖案。

來(lái)體會(huì)一下這些作品的腦洞以及震撼:

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

用生命游戲?qū)崿F(xiàn)生命游戲:http://www.bilibili.com/video/av616329/index.html

2. Console版:一個(gè)簡(jiǎn)單的Python實(shí)現(xiàn)

生命游戲的規(guī)則其實(shí)很簡(jiǎn)單。我們可以把計(jì)算機(jī)中的宇宙想象成是一堆方格子構(gòu)成的封閉空間,尺寸為N的空間就有N*N個(gè)格子。

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

每個(gè)格子的生死遵循下面的原則:

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

2. 如果一個(gè)細(xì)胞周圍有2個(gè)細(xì)胞為生,則該細(xì)胞的生死狀態(tài)保持不變;

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

設(shè)定圖像中每個(gè)像素的初始狀態(tài)后依據(jù)上述的游戲規(guī)則演繹生命的變化,由于初始狀態(tài)和迭代次數(shù)不同,將會(huì)得到令人嘆服的優(yōu)美圖案。

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

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

游戲世界尺寸為60x20,隨機(jī)生成初始狀態(tài),循環(huán)邊界,按任意鍵進(jìn)入下一幀,q退出。

單純的看這段程序,好像并沒(méi)有什么問(wèn)題,代碼邏輯正確、清晰。

效果圖:

Python生命游戲?qū)崿F(xiàn)原理及過(guò)程解析(附源代碼)_第4張圖片

3. Python列表生成式

我們來(lái)嘗試一些python的高級(jí)特性,比如列表生成式。

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

            
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將默認(rèn)作為函數(shù)內(nèi)的局部變量。這里用了兩層列表生成式來(lái)生成一個(gè)二維數(shù)組。

列表生成式很好很強(qiáng)大,如果用好能大大提高效率。但會(huì)犧牲一定的可讀性,如果單個(gè)表達(dá)式寫的過(guò)于復(fù)雜,那就變成write-only了。尤其是在團(tuán)隊(duì)開(kāi)發(fā)情況下,可讀性日益重要。

重寫后的代碼:

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

如果僅僅是作為練習(xí),這樣就已經(jīng)足夠好了,簡(jiǎn)潔易讀。

4. 重構(gòu):面向?qū)ο笈c重用

可是我們還不能滿足,我們來(lái)給生命插上面向?qū)ο蟮某岚颍谀K化的天空中翱翔。對(duì),就是讓他跟別的模塊搞對(duì)象!

先來(lái)定義一個(gè)類GameOfLifeWorld,之前那些丑陋的全局變量,讓他們統(tǒng)統(tǒng)變成成員變量,再也不能在外興風(fēng)作浪。

            
class GameOfLifeWorld:

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

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

代碼:

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

5. GUI:Tkinter的調(diào)用

有了上一步的鋪墊,我們終于可以讓Tkinter粉墨登場(chǎng)了。Tkinter是著名的UI庫(kù),Python自帶的Tkinter是一個(gè)精簡(jiǎn)版,不過(guò)也夠我們用的了。

我們這里用到的主要是Canvas,Button控件。Canvas畫布用來(lái)繪制游戲區(qū),Button用來(lái)交互。

代碼:

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

效果:

Python生命游戲?qū)崿F(xiàn)原理及過(guò)程解析(附源代碼)_第5張圖片

以上就是這樣,項(xiàng)目我還會(huì)繼續(xù)改進(jìn),希望大家喜歡。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

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

【本文對(duì)您有幫助就好】

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

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 达拉特旗| 崇信县| 舞阳县| 景德镇市| 桐城市| 秭归县| 双牌县| 麻栗坡县| 黑水县| 区。| 北海市| 南阳市| 壶关县| 团风县| 乌拉特前旗| 合江县| 潮州市| 涿鹿县| 松溪县| 灵武市| 连南| 太和县| 永兴县| 阿巴嘎旗| 姜堰市| 原阳县| 宝丰县| 泽库县| 朝阳市| 杭锦旗| 桓台县| 合肥市| 烟台市| 中阳县| 阿图什市| 阜新| 德格县| 桦南县| 大兴区| 绥宁县| 石家庄市|