生命游戏二号

好久没有碰到有意思的计算机题了,昨天鑫哥提了一嘴,就去实现了

这是一个名叫"生命游戏"的小实验,每个方格就是个小细胞,如果细胞周围的伙伴有一个或没有,他们会因为过于孤独而死,如果周围的细胞大于3,则会因为过于拥挤而死亡;此外的情况细胞都能存活,甚至在三个伙伴时还能迎来新生。

不同的初始情况会有不同的迭代过程和结果,但是同样的初始情况一定会有相同的迭代过程和结果

在这样严苛的规则下有无数有意思的图案和方案等待探究

python 复制代码
import numpy as np
import matplotlib.pyplot as plt
import time

def initialize_grid(rows, cols, pattern='complex_pattern', position=None):
    """初始化网格,使用预定义的模式填充"""
    grid = np.zeros((rows, cols), dtype=int)

    def place_pattern(pattern, pos):
        patterns = {
            'block': [[1, 1], [1, 1]],
            'blinker': [[1, 1, 1]],
            'toad': [[0, 1, 1, 1], [1, 1, 1, 0]],
            'beacon': [[1, 1, 0, 0], [1, 1, 0, 0], [0, 0, 1, 1], [0, 0, 1, 1]],
            'glider': [[0, 1, 0], [0, 0, 1], [1, 1, 1]],
            'symmetric': [
                [0, 1, 0, 1, 0],
                [1, 0, 1, 0, 1],
                [0, 1, 0, 1, 0],
                [1, 0, 1, 0, 1],
                [0, 1, 0, 1, 0]
            ],
            'complex_pattern': [
                [1, 1, 0, 0, 1, 1],
                [1, 0, 0, 0, 0, 1],
                [0, 0, 1, 1, 0, 0],
                [0, 0, 1, 1, 0, 0],
                [1, 0, 0, 0, 0, 1],
                [1, 1, 0, 0, 1, 1]
            ],
            'pulsar': [
                [0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0],
                [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1],
                [1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1],
                [1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1],
                [0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0],
                [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0],
                [1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1],
                [1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1],
                [1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1],
                [0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0],
            ]
        }

        if pattern in patterns:
            pat = np.array(patterns[pattern])
            r_offset, c_offset = pos[0] - pat.shape[0] // 2, pos[1] - pat.shape[1] // 2
            grid[r_offset:r_offset + pat.shape[0], c_offset:c_offset + pat.shape[1]] = pat

    if position is None:
        # 如果没有提供位置,则选择一个中心点
        position = (rows // 2, cols // 2)

    place_pattern(pattern, position)

    return grid

def update_grid(grid):
    """更新网格状态"""
    rows, cols = grid.shape
    new_grid = np.zeros((rows, cols), dtype=int)
    for r in range(rows):
        for c in range(cols):
            # 计算当前细胞周围的活细胞数
            neighbors = sum([
                grid[(r-1)%rows, (c-1)%cols], grid[(r-1)%rows, c], grid[(r-1)%rows, (c+1)%cols],
                grid[r, (c-1)%cols],                             grid[r, (c+1)%cols],
                grid[(r+1)%rows, (c-1)%cols], grid[(r+1)%rows, c], grid[(r+1)%rows, (c+1)%cols]
            ])
            # 生命游戏规则
            if grid[r, c] == 1 and (neighbors == 2 or neighbors == 3):
                new_grid[r, c] = 1
            elif grid[r, c] == 0 and neighbors == 3:
                new_grid[r, c] = 1
    return new_grid

def display_grid(grid):
    """显示网格状态"""
    plt.imshow(grid, cmap='binary')
    plt.axis('off')
    plt.show(block=False)
    plt.pause(0.2)
    plt.clf()

def run_game(rows=30, cols=30, generations=500):
    """运行生命游戏"""
    grid = initialize_grid(rows, cols, pattern='pulsar')
    for _ in range(generations):
        display_grid(grid)
        grid = update_grid(grid)

if __name__ == "__main__":
    run_game()
相关推荐
pocket0012 小时前
《只狼:影逝二度》mfc140.dll丢失解决指南
经验分享·游戏·电脑
KILIG_yss9 小时前
unity 2D像素种田游戏学习记录(自用)
学习·游戏·unity
niaoma1 天前
《大宋豪侠传》客户端源码 + 服务端源码 + 工具源码 + 资源,大小16.3G
c++·windows·游戏·visualstudio·游戏程序
Footprint_Analytics2 天前
2024 年 11 月区块链游戏研报:牛市加持下的 GameFi 破局之路
游戏·区块链
RootKai2 天前
MINDAGENT:游戏交互中的新兴性设计(更新中)
游戏
Laofanqie6662 天前
《三角洲行动》游戏安全组件运行时发生异常1-0-0,是什么原因?以及要如何解决?
游戏
Logrus IT2 天前
如何在拉丁美洲推广游戏
游戏
因缘而起12 天前
【Java】类似王者荣耀游戏
游戏
起床气2332 天前
杂谈随笔-关于unity开发游戏
游戏·unity·游戏引擎