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()

原文地址:https://www.cnblogs.com/manbaout/p/12989575.html