Một nhà toán học Anh vào khoảng năm 1970 đã tạo ra "Game of Life" – về cơ bản là một tập hợp các quy tắc mô tả sự tăng trưởng hỗn loạn nhưng có quy luật của một quần thể sinh vật học. "Trò chơi cuộc đời" là một lưới hai chiều bao gồm các ô "sống" và "chết".
Quy tắc của Game of Life
Quá đông dân (Overpopulation): Ô chết nếu bị bao quanh bởi hơn ba ô sống.
Ổn định (Static): Ô sống nếu bị bao quanh bởi hai hoặc ba ô sống.
Thiếu dân (Underpopulation): Ô chết nếu bị bao quanh bởi ít hơn hai ô sống.
Sinh sản (Reproduction): Ô chết trở thành sống nếu bị bao quanh bởi đúng ba ô sống.

Ô sẽ chết ở bước thời gian tiếp theo
Ô sẽ sống ở bước thời gian tiếp theo
Ô đang sống
Ô đã chết
Áp dụng tập quy tắc trên theo các bước tuần tự, chúng ta sẽ nhận được những mẫu đẹp mắt và bất ngờ.
Các bước triển khai
i. Khởi tạo vũ trụ rỗng ii. Điền hạt giống vào vũ trụ iii. Tính toán xem ô hiện tại có sống sót đến bước thời gian tiếp theo không, dựa trên hàng xóm iv. Lặp lại hàm sống sót (như bước iii) cho tất cả các ô trong vũ trụ hàng xóm v. Lặp lại bước iii-iv cho số thế hệ mong muốn
Cài đặt
Để tạo Conway's Game of Life, chúng ta sử dụng thư viện matplotlib và mảng numpy. Cài đặt numpy và matplotlib bằng pip:
$pip install numpy, matplotlib
Chương trình triển khai Conway's Game of Life:
Bây giờ là lúc viết chương trình theo tập quy tắc trên. Dưới đây là chương trình triển khai Game of Life:
# Nhập thư viện cần thiết
import numpy as np
import matplotlib.pyplot as plt
import argparse
import time
#-------------------------------------------------------------------------
class Board(object):
def __init__(self, size, seed='Random'):
if seed == 'Random':
self.state = np.random.randint(2, size=size)
self.engine = Engine(self)
self.iteration = 0
def animate(self):
i = self.iteration
im = None
plt.title("Conway's Game of Life")
while True:
if i == 0:
plt.ion()
im = plt.imshow(self.state, vmin=0, vmax=2, cmap=plt.cm.gray)
else:
im.set_data(self.state)
i += 1
self.engine.applyRules()
print('Life Cycle: {} Birth: {} Survive: {}'.format(i, self.engine.nBirth, self.engine.nSurvive))
plt.pause(0.01)
yield self
#-------------------------------------------------------------------------
class Engine(object):
def __init__(self, board):
self.state = board.state
def countNeighbors(self):
state = self.state
n = (state[0:-2,0:-2] + state[0:-2,1:-1] + state[0:-2,2:] +
state[1:-1,0:-2] + state[1:-1,2:] + state[2:,0:-2] +
state[2:,1:-1] + state[2:,2:])
return n
def applyRules(self):
n = self.countNeighbors()
state = self.state
birth = (n == 3) & (state[1:-1,1:-1] == 0)
survive = ((n == 2) | (n == 3)) & (state[1:-1,1:-1] == 1)
state[...] = 0
state[1:-1,1:-1][birth | survive] = 1
nBirth = np.sum(birth)
self.nBirth = nBirth
nSurvive = np.sum(survive)
self.nSurvive = nSurvive
return state
#-------------------------------------------------------------------------
def main():
ap = argparse.ArgumentParser(add_help=False) # Khởi tạo Argument Parser
ap.add_argument('-h', '--height', help='Board Height', default=256)
ap.add_argument('-w', '--width', help='Board Width', default=256)
args = vars(ap.parse_args()) # Thu thập đối số
bHeight = int(args['height'])
bWidth = int(args['width'])
board = Board((bHeight, bWidth))
for _ in board.animate():
pass
#-------------------------------------------------------------------------
if __name__ == '__main__':
main()
Kết quả
Console: Life Cycle: 1 Birth: 7166 Survive: 10621 Life Cycle: 2 Birth: 7930 Survive: 8409 Life Cycle: 3 Birth: 7574 Survive: 8756 Life Cycle: 4 Birth: 7114 Survive: 8406 Life Cycle: 5 Birth: 7005 Survive: 8126 Life Cycle: 6 Birth: 6644 Survive: 7926 Life Cycle: 7 Birth: 6266 Survive: 7711 Life Cycle: 8 Birth: 6132 Survive: 7427 Life Cycle: 9 Birth: 5957 Survive: 7322 Life Cycle: 10 Birth: 5769 Survive: 7290 Life Cycle: 11 Birth: 5585 Survive: 6937 Life Cycle: 12 Birth: 5381 Survive: 6791 Life Cycle: 13 Birth: 5208 Survive: 6686 Life Cycle: 14 Birth: 5063 Survive: 6563 ….
Kết quả trên sẽ tiếp tục xuất hiện cho đến khi nhấn Ctrl-C trong terminal để dừng chương trình.
Hiển thị đồ họa

Các ô sẽ không ngừng thay đổi và mô phỏng các mẫu rất đẹp.
Bạn có thể thay đổi subplot trên bằng cách thay đổi cài đặt và điều chỉnh giá trị thanh trượt:
