V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
fanqieipnet
V2EX  ›  推广

如何利用 Python 实现生命游戏

  •  
  •   fanqieipnet · 2020-12-14 18:21:42 +08:00 · 555 次点击
    这是一个创建于 1251 天前的主题,其中的信息可能已经有所发展或是发生改变。
    英国数学家约翰·何顿·康威在 1970 年发明了 the game of life,今天番茄加速就来分享下如何利用 python 实现生命游戏,规则如下:

      每个细胞有两种状态 - 存活或死亡

      每个细胞与以自身为中心的周围八格细胞产生互动

      当前细胞为存活状态时,当周围的存活细胞低于 2 个时(不包含 2 个),该细胞变成死亡状态。(模拟生命数量稀少)

      当前细胞为存活状态时,当周围有 2 个或 3 个存活细胞时,该细胞保持原样。

      当前细胞为存活状态时,当周围有超过 3 个存活细胞时,该细胞变成死亡状态。(模拟生命数量过多)

      当前细胞为死亡状态时,当周围有 3 个存活细胞时,该细胞变成存活状态。(模拟繁殖)

      拿个例子阐述上述状态,如下种子时代:

      [0, 0, 1, 0, 0]

      [0, 1, 1, 0, 0]

      [0, 0, 1, 1, 0]

      [0, 1, 1, 1, 0]

      [0, 0, 0, 0, 0]

      坐标[0,2]为一个存活的细胞,因为周围细胞个数为 2,所以繁衍后依然存活;

      坐标[1,2]的存活细胞,因为周围有 4 个存活细胞,所以繁衍后死亡;

      坐标[0,1]死亡细胞,因为周围恰好有 3 个存活细胞,所以[0,1]处出现生命,

      繁衍一代后的,完整图如下:

      [0, 1, 1, 0, 0]

      [0, 1, 0, 0, 0]

      [0, 0, 0, 0, 0]

      [0, 1, 0, 1, 0]

      [0, 0, 1, 0, 0]

      第二代:

      [0, 1, 1, 0, 0]

      [0, 1, 1, 0, 0]

      [0, 0, 1, 0, 0]

      [0, 0, 1, 0, 0]

      [0, 0, 1, 0, 0]

      ...

      能到第几代结束呢?借用 Python 模拟了生命游戏,整个代码一共 60 行。

      首先生成生命网格:

       def get_board(size, alive_cons):

       return [[1 if (i, j) in alive_cons else 0

       for j in range(size)]

       for i in range(size)]

      获得细胞的邻域:

       def get_neighbors(con):

       x, y = con

       neighbors = [(x + i, y + j)

       for i in range(-1, 2)

       for j in range(-1, 2)

       if not i == j == 0]

       return neighbors

      判断下一代是否存活:

       def is_alive_con(con, alive_cons):

       alive_neighbors = calculate_alive_neighbors(con, alive_cons)

       if (alive_neighbors == 3 or

      (alive_neighbors == 2 and con in alive_cons)):

       return True

       return False

      生成下一代完整的生命网格:

       def new_step(alive_cons):

       board = itertools.chain(*map(get_neighbors, alive_cons))

       new_board = set([con

       for con in board

       if is_alive_con(con, alive_cons)])

       return list(new_board)

      以上就是几个核心的函数,下面主函数:

       def main():

       size = 5

       board = [(0, 2), (1, 1), (1, 2), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3)]

       print_board(get_board(size, board))

       for _ in range(10):

       board = correct_cons(size, new_step(board))

       print_board(get_board(size, board))

      终止状态:所有网格细胞状态都为 0
    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2079 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 11:51 · PVG 19:51 · LAX 04:51 · JFK 07:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.