Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Conway's Game Of Life (Trò chơi cuộc đời) bằng Python

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.

Conway s Game Of Life (Trò chơi cuộc đời) bằng Python

Conway s Game Of Life (Trò chơi cuộc đời) bằng Python Ô sẽ chết ở bước thời gian tiếp theo

Conway s Game Of Life (Trò chơi cuộc đời) bằng Python Ô sẽ sống ở bước thời gian tiếp theo

Conway s Game Of Life (Trò chơi cuộc đời) bằng Python Ô đang sống

Conway s Game Of Life (Trò chơi cuộc đời) bằng Python Ô đã 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

Conway s Game Of Life (Trò chơi cuộc đời) bằng Python

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:

Conway s Game Of Life (Trò chơi cuộc đời) bằng Python