📜  康威的人生游戏(Python实现)(1)

📅  最后修改于: 2023-12-03 14:54:09.787000             🧑  作者: Mango

康威的人生游戏(Python实现)

简介

康威的人生游戏(Conway's Game of Life)是一种自组织、自律的细胞自动机,由英国数学家约翰·康威于1970年发明。它是一种数学实验,通过对细胞状态的更新来模拟生命的繁衍、进化和死亡等过程,从而反映出一些自然规律和数学规律。

在康威的人生游戏中,有一个平面网格,每个格子可以是“存活”或“死亡”两种状态。每个格子的状态由它周围格子的状态来决定。在每个时刻,规则如下:

  • 如果一个存活的格子周围有少于两个存活的格子,它会死亡,好像因为孤独而死亡;
  • 如果一个存活的格子周围有两个或三个存活的格子,它会继续存活;
  • 如果一个存活的格子周围有超过三个存活的格子,它会死亡,好像因为拥挤而死亡;
  • 如果一个死亡的格子周围有正好三个存活的格子,它会变成存活的格子,好像因为繁殖而生活。

基于这些规则,我们就可以模拟出各种有趣的模式和变化了。接下来我们会用 Python 实现一个简单的康威的人生游戏!

实现过程

首先,我们需要定义一个“细胞自动机”类,来模拟整个游戏的运行过程。

class CellularAutomaton:
    def __init__(self, size):
        self.size = size
        self.board = [[0 for _ in range(size)] for _ in range(size)]

    def step(self):
        new_board = [[0 for _ in range(self.size)] for _ in range(self.size)]
        for i in range(self.size):
            for j in range(self.size):
                count = self.count_neighbors(i, j)
                if self.board[i][j] == 1:
                    if count < 2 or count > 3:
                        new_board[i][j] = 0
                    else:
                        new_board[i][j] = 1
                else:
                    if count == 3:
                        new_board[i][j] = 1
        self.board = new_board

    def count_neighbors(self, row, col):
        count = 0
        for i in range(-1, 2):
            for j in range(-1, 2):
                if i == 0 and j == 0:
                    continue
                if row + i < 0 or col + j < 0 or row + i >= self.size or col + j >= self.size:
                    continue
                count += self.board[row + i][col + j]
        return count

在上面的代码中,我们首先定义了一个构造方法 __init__,用来初始化棋盘。我们假设整个棋盘是一个二维的数组 board,初始时全部为 0,表示所有细胞都是死的。同时,我们还需要一个属性 size 来表示棋盘的大小。

接下来,我们定义了一个 step 方法来执行一次游戏中的迭代。在这个方法中,我们遍历了整个棋盘,并对每个格子应用了康威的规则,计算出下一步每个格子的状态,然后更新了整个棋盘 board

最后,我们定义了一个 count_neighbors 方法来计算每个格子周围的存活细胞数。

现在,我们已经可以定义一个简单的康威的人生游戏了。为了更好地演示,我们还需要添加一些辅助函数,来初始化整个棋盘、打印出当前的状态、以及运行整个游戏。

import random
import time

def init_board(board, density):
    for i in range(len(board)):
        for j in range(len(board[0])):
            if random.random() < density:
                board[i][j] = 1

def print_board(board):
    for row in board:
        line = ""
        for elem in row:
            if elem == 1:
                line += "O"
            else:
                line += "."
        print(line)

def run_game(size=50, density=0.3, steps=100, sleep_time=0.1):
    automaton = CellularAutomaton(size)
    init_board(automaton.board, density)
    for i in range(steps):
        print_board(automaton.board)
        automaton.step()
        time.sleep(sleep_time)

在上面的代码中,我们定义了一个 init_board 函数,用来初始化整个棋盘。它接受两个参数:board 表示整个棋盘,density 表示细胞出生的概率。我们通过随机数来判断每个格子是否会出生,从而初始化整个棋盘的状态。

我们还定义了一个 print_board 函数,用来打印出整个棋盘的状态。在这个函数中,我们把每个细胞用 O. 来表示,其中 O 表示当前格子是存活的,. 则表示当前格子是死的。

最后,我们定义了一个 run_game 函数,用来运行整个游戏。这个函数接受四个参数:

  • size 表示棋盘的大小,默认为 50。
  • density 表示细胞出生的概率,默认为 0.3。
  • steps 表示游戏的迭代次数,也就是总共要运行多少步,默认为 100。
  • sleep_time 表示每一次迭代之间要暂停的时间,单位是秒,默认为 0.1。

在这个函数中,我们首先创建了一个 CellularAutomaton 对象,然后调用 init_board 函数来初始化整个棋盘的状态。接下来,我们使用一个循环来运行整个游戏。在循环中,每运行一步就打印出当前棋盘的状态,并且调用 step 方法来执行一次迭代。最后,我们用 time.sleep 函数来暂停一下,等待用户观察当前状态。

使用方法

要使用这个康威的人生游戏程序,只需要调用上面的 run_game 函数,并传入一些参数即可。比如:

run_game(size=30, density=0.2, steps=50, sleep_time=0.2)

这个代码片段将运行一个大小为 30x30 的棋盘,细胞出生的概率为 0.2,运行 50 步,每步之间暂停 0.2 秒。

结束语

康威的人生游戏是一种非常有趣的数学实验,通过模拟细胞的生命周期,我们可以发现一些有趣的规律和现象。如果你感兴趣的话,也可以自己尝试去实现这个程序,并且改进一下,比如添加更多的游戏规则、增加图像界面等等。