python實現生命游戲


生命游戲介紹:  

生命游戲其實是一個零玩家游戲,它包括一個二維矩形世界,這個世界中的每個方格居住着一個活着的或死了的細胞。一個細胞在下一個時刻生死取決於相鄰八個方格中活着的或死了的細胞的數量。如果相鄰方格活着的細胞數量過多,這個細胞會因為資源匱乏而在下一個時刻死去;相反,如果周圍活細胞過少,這個細胞會因太孤單而死去。實際中,你可以設定周圍活細胞的數目怎樣時才適宜該細胞的生存。如果這個數目設定過低,世界中的大部分細胞會因為找不到太多的活的鄰居而死去,直到整個世界都沒有生命;如果這個數目設定過高,世界中又會被生命充滿而沒有什么變化。實際中,這個數目一般選取2或者3;這樣整個生命世界才不至於太過荒涼或擁擠,而是一種動態的平衡。這樣的話,游戲的規則就是:當一個方格周圍有2或3個活細胞時,方格中的活細胞在下一個時刻繼續存活;即使這個時刻方格中沒有活細胞,在下一個時刻也會“誕生”活細胞。在這個游戲中,還可以設定一些更加復雜的規則,例如當前方格的狀況不僅由父一代決定,而且還考慮祖父一代的情況。你還可以作為這個世界的上帝,隨意設定某個方格細胞的死活,以觀察對世界的影響。

 簡單來說,分為生和死兩種情況:

邏輯描述:
給定當前細胞陣列,遍歷每個細胞,根據該細胞的鄰居細胞情況判斷該細胞在下一代的生死並保存。遍歷結束后判斷當前代與下一代是否有區別或者迭

代次數是否達到上限。如果需要繼續演化,將下一代命名為當前代,並執行上述邏輯。

import tkinter as tk import numpy as np import random as rd class GameOfLife(): def __init__(self): self.name = 'game of life' self.width = 500 self.height = 450 self.window = tk.Tk() self.window.title(self.name) self.window.geometry('{}x{}'.format(self.width, self.height)) self.canvas = tk.Canvas(self.window, bg='white', width=self.width-100, height=self.height-50 ) self.array = np.zeros((int((self.width-100)/20), int((self.height-50)/20)), dtype=int) self.start_btn=tk.Button(self.window,bg='gray',text='start',command=self.start) self.pause_btn=tk.Button(self.window,bg='gray',text='pause',command=self.pause) self.refresh_btn=tk.Button(self.window,bg='gray',text='restart',command=self.restart) self.quit_btn=tk.Button(self.window,bg='gray',text='quit',command=self.window.quit) # 設置暫停標志
        self.flag=0 # 設置start次數,防止加速
        self.count=0 def input_number(self): self.number=int(input('請輸入初始細胞數:')) def pack(self): self.canvas.pack() self.start_btn.place(x=10,y=410,anchor='nw') self.pause_btn.place(x=150,y=410,anchor='nw') self.refresh_btn.place(x=290,y=410,anchor='nw') self.quit_btn.place(x=430, y=410, anchor='nw') def init_cells(self): count = 0 # 隨機產生細胞
        for x in range(len(self.array)): for y in range(len(self.array[x])): if count > 200: return
                if rd.randint(0, 100) >= 50: self.array[x][y] = 1 count += 1
    def draw(self): # 畫圖
        for i in range(len(self.array)): for j in range(len(self.array[i])): if self.array[i][j]==1: self.canvas.create_rectangle(j*20,i*20,j*20+20,i*20+20,fill='red') else: self.canvas.create_rectangle(j * 20, i * 20, j * 20 + 20, i * 20 + 20, fill='white') def start(self): if self.flag==1: return self.flag=1 self.refresh() def pause(self): self.flag=0 def refresh(self): if self.flag==1: for i in range(1, len(self.array) - 1): for j in range(1, len(self.array[i]) - 1): sum = self.array[i][j - 1] + self.array[i - 1][j - 1] + self.array[i - 1][j] + self.array[i - 1][ j + 1] + self.array[i][j + 1] + self.array[i + 1][j + 1] + self.array[i + 1][j] + self.array[i + 1][ j - 1] # 活細胞
                    if self.array[i][j] == 1: if sum != 2 and sum != 3: self.array[i][j] = 0 else:  # 死細胞
                        if sum == 3: self.array[i][j] = 1 self.draw() self.canvas.after(1000, self.refresh) else: return

    def restart(self): self.flag=0 self.init_cells() self.start() def show(self): self.canvas.mainloop() if __name__ == '__main__': game1 = GameOfLife() game1.input_number() game1.pack() game1.init_cells() game1.draw() game1.show()

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM