📅  最后修改于: 2023-12-03 14:54:09.787000             🧑  作者: Mango
康威的人生游戏(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 秒。
康威的人生游戏是一种非常有趣的数学实验,通过模拟细胞的生命周期,我们可以发现一些有趣的规律和现象。如果你感兴趣的话,也可以自己尝试去实现这个程序,并且改进一下,比如添加更多的游戏规则、增加图像界面等等。