生命游戏

作者: 何物昂 | 来源:发表于2018-06-25 23:25 被阅读3次

    生命游戏的宇宙是一个无限的,其中细胞的二维正交网格,每个细胞处于两种可能的状态之一,即活着死亡(分别是人口稠密无人居住)。每个细胞与它的八个邻居相互作用,这八个邻居是水平,垂直或对角相邻的细胞。在每一步中,都会发生以下转换:

    1. 任何有两个以上活着的邻居的活细胞都会死亡,好像是在人口下一样。
    2. 任何有两三个活着的邻居的活细胞都会生活在下一代。
    3. 任何有三个以上活着的邻居的活细胞都会死亡,就好像人口过剩一样。
    4. 任何具有三个活的邻居的死细胞都会变成一个活细胞,就像是通过繁殖一样。

    其效果如下图:

    123.gif
    其主要实现逻辑代码出自Effective Python一书中。不过原代码中的生命游戏是静止的,把每一代分别打印出来,没有动画效果,我增加部分代码,实现在终端的动画效果。
    #原代码是通过ColumnPrinter 类实现打印的,我去掉这个类,增加下面两个函数
    
    #这是随机在二维控件内生成初始存活细胞
    def random_alive(k, x=9, y=9):
       xy = [(i,j) for i in range(x) for j in range(y)]
       grid = Grid(x, y)
       for i,j in random.sample(xy, k):
           grid.assign(i, j, ALIVE)
       return grid
    
    #主函数,运行这个生命游戏,其动画效果是通过控制光标移动到初始位置来实现的。
    def main(x,y,k):
       os.system('clear')
       grid = random_alive(k, x=x, y=y)
       clear = '\x1b[{}A\x1b[{}D'.format(x,y)
       print(grid, end='')
       sim = simulate(grid.height, grid.width)
       while 1:
           time.sleep(.1)
           grid = live_a_generation(grid, sim)
           print(clear)
           print(grid, end='')
           time.sleep(.1)
           print(clear)
    
    if __name__ == '__main__':
       main(150,200,3050)
    

    控制光标位置是通过ANSI转义符实现的,如"x1b[nA"实现光标上移n行。不过这在win10下不用,linux下可以。关于生命游戏更多详细内容请查看Conway's Game of Life



    写的仓促,后续更新。

    相关文章

      网友评论

        本文标题:生命游戏

        本文链接:https://www.haomeiwen.com/subject/lyvuyftx.html