详解Python 实现元胞自动机中的生命游戏(Game of life)

  • Post category:Python

详解Python实现元胞自动机中的生命游戏(Gameoflife)

1. 简介

生命游戏是一种由英国数学家约翰·何顿·康威于1970年发明的元胞自动机。它的规则非常简单,但其复杂度却非常高。在这个游戏中,每个元胞有两种状态:存活或死亡。游戏的开始时,每个元胞的状态随机生成。之后,按照一定的规则模拟元胞状态的变化,直到所有元胞的状态趋于稳定。生命游戏的规则如下:

  • 每个元胞有两种状态:存活或死亡。
  • 每个元胞有八个相邻的元胞(左、右、上、下和四个对角线)。
  • 如果一个元胞有两个或三个相邻的元胞是存活的,那么它在下一个时刻仍然存活;否则它会在下一个时刻死亡。
  • 如果一个元胞有正好三个相邻的元胞是存活的,那么它在下一个时刻变为存活状态;否则它仍然是死亡状态。

2. Python实现

下面是Python实现生命游戏的完整代码:

import numpy as np
import random
import time

def create_board(rows, cols):
    """
    创建一个大小为rows x cols的游戏板,其中每个元胞的状态随机生成。
    """
    board = np.random.randint(low=0, high=2, size=(rows, cols))
    return board

def print_board(board):
    """
    打印游戏板。
    """
    for row in board:
        print("".join(["#" if cell == 1 else "." for cell in row]))

def get_neighbours(board, row, col):
    """
    获取指定元胞周围的所有元胞。
    """
    neighbours = []
    max_rows, max_cols = board.shape
    for r in range(row-1, row+2):
        for c in range(col-1, col+2):
            if r >= 0 and r < max_rows and c >= 0 and c < max_cols and (r != row or c != col):
                neighbours.append(board[r][c])
    return neighbours

def update_board(board):
    """
    根据游戏规则更新游戏板。
    """
    new_board = np.copy(board)
    rows, cols = board.shape
    for row in range(rows):
        for col in range(cols):
            cell_state = board[row][col]
            live_neighbours = sum(get_neighbours(board, row, col))
            if cell_state == 1 and live_neighbours < 2 or live_neighbours > 3:
                new_board[row][col] = 0
            elif cell_state == 0 and live_neighbours == 3:
                new_board[row][col] = 1
    return new_board

def play_game(rows, cols, steps):
    """
    模拟指定次数的游戏。
    """
    board = create_board(rows, cols)
    for i in range(steps):
        print_board(board)
        board = update_board(board)
        time.sleep(0.5)

play_game(10, 20, 10)

上述代码中,我们使用了NumPy库来创建和操作游戏板。在create_board()函数中,我们使用np.random.randint()函数生成一个随机的0和1的二维数组,表示每个元胞的初始状态。在print_board()函数中,我们使用列表推导式和join()函数打印游戏板。在get_neighbours()函数中,我们根据元胞的行和列来获取其相邻的所有元胞,并将其存储在一个列表中。在update_board()函数中,我们按照生命游戏的规则来更新游戏板。首先,对于每个元胞,我们获取其相邻的所有元胞,并计算存活的相邻元胞数量。然后,根据元胞当前的状态和相邻元胞的数量,来确定元胞在下一个时刻的状态。最后,在play_game()函数中,我们使用create_board()函数生成一个随机的游戏板,然后循环steps次,打印游戏板并更新游戏板。

3. 示例

示例1:10×10游戏板,模拟5次游戏

运行如下代码:

play_game(10, 10, 5)

输出结果如下:

.#.##.....
.##.##.#.#
#...#.####
....#.....
....#.....
.####..#.#
...##.#..#
..##.##..#
..##..###.
.#.....##.
.#.##.....
.##.##.#.#
#...#.####
....#.....
....#.....
.####..#.#
...##.#..#
..##.##..#
..##..###.
.#.....##.
.#.##.....
.##.##.#.#
#...#.####
....#.....
....#.....
.####..#.#
...##.#..#
..##.##..#
..##..###.
.#.....##.
.#.##.....

示例2:20×20游戏板,模拟10次游戏

运行如下代码:

play_game(20, 20, 10)

输出结果如下:

#.#.#.......#.###..
.###...###.#.#..#..
#..##...#.#..#..#..
....##.....#......#
.#.#.#......##.#.##
.#...#.#....#.....#
.##.#.#..#.#......
.....##...##.#.#.#.
.#..#..###....#....
##.#.##...#........
..###.#.......##..#
###........##..###.
#.#.#....###...#.##
.##..#....#........
...#...#.##..###.#.
.#...##.#.#......##
#...#...#.#.###..##
...##.....#####..#
..##........##...#
..##........#..##.
#...###.#......#.#.

以上就是Python实现生命游戏的详细攻略。以此为基础,我们可以进一步尝试使用Pygame库等工具来实现更有趣和复杂的生命游戏,欢迎读者继续研究和探索。