首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >生命游戏:如何跟踪活跃细胞

生命游戏:如何跟踪活跃细胞
EN

Stack Overflow用户
提问于 2013-07-27 12:50:24
回答 5查看 1.3K关注 0票数 5

现在,我已经阅读了其他的“生命游戏”中的堆叠溢出问题,也大量搜索了“生活的游戏”,我知道如何实现我的“生命游戏”,我想要跟踪grid.The问题中的活动单元,因为我被困在该如何编码它。

我的想法是这样的,但在那之后,我的智慧就快到极点了:

  • 维护一个由活动的单元格协调元组组成的ActiveCell列表。 死了还是活着。
  • 计算下一代时,只需迭代ActiveCell列表,计算单元格状态并检查状态是否更改。
  • 如果状态发生变化,则将所有当前单元格邻居添加到列表中。
  • 如果没有,请从列表中删除该单元格。
  • 现在的问题是:(“.”->其他单元格) B C D . A . . . . 如果A满足3),则它添加B,C,D 如果B也返回true ( 3),这意味着它将再次添加A、C(重复)

我考虑过使用OrderedSet或什么东西来处理订单,避免使用duplication.But,但我还是遇到了这些问题,我只需要一个方向。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-07-27 13:47:33

您有两个列表,我将它们命名为currentState和newChanges。以下是工作流程:

  1. 对currentState进行迭代,找出哪些是新生细胞,哪些是将要死亡的细胞。不向currentState添加这些更改。如果有一个细胞要出生或死亡,将其添加到newChanges列表。当您完成此步骤时,currentState的外观应该与开始时完全相同。
  2. 一旦完成了步骤1中对每个单元格的所有计算,然后在newChanges上迭代。对于newChanges中的每一对,在currentState中将其从死改为活着,反之亦然。

示例:

  • currentState具有{0,0} {0,1} {0,2}。(一行中的三个点)
  • newChanges计算为{0,0} {-1,1} {1,1} {0,2} (两端点死亡,中间上方和下方的斑点生成)。
  • currentState接收更改,成为{-1,1} {0,1} {1 ,1},并清除newChanges。
票数 1
EN

Stack Overflow用户

发布于 2013-07-27 14:47:01

不知道它是否对你有帮助,但这里有一个关于“生命的游戏”的速写,还有活动词典:

代码语言:javascript
运行
复制
from itertools import product

def show(board):
    for row in board:
        print " ".join(row)

def init(N):
    board = []
    for x in range(N):
        board.append([])
        for y in range(N):
            board[x].append(".");
    return board

def create_plane(board):
    board[2][0] = "x"
    board[2][1] = "x"
    board[2][2] = "x"
    board[1][2] = "x"
    board[0][1] = "x"

def neighbors(i, j, N):
    g1 = {x for x in product([1, 0, -1], repeat=2) if x != (0, 0)}
    g2 = {(i + di, j + dj) for di, dj in g1}
    return [(x, y) for x, y in g2 if x >= 0 and x < N and y >= 0 and y < N]

def live(board):
    N = len(board)
    acells = {}
    for i in range(N):
        for j in range(N):
            if board[i][j] == "x":
                for (x, y) in neighbors(i, j, N):
                    if (x, y) not in acells: acells[(x, y)] = board[x][y]

    while True:
        print "-" * 2 * N, len(acells), "cells to check"
        show(board)
        raw_input("Press any key...")
        for c in acells.keys():
            a = len([x for x in neighbors(c[0], c[1], N) if board[x[0]][x[1]] == "x"])
            cur = board[c[0]][c[1]]
            if a == 0:
                del acells[c]                       # if no live cells around, remove from active
            elif cur == "x" and a not in (2, 3):
                acells[c] = "."                     # if alive and not 2 or 3 neighbors - dead
            elif cur == "." and a == 3:
                acells[c] = "x"                     # if dead and 3 neighbors - alive
                for x in neighbors(c[0], c[1], N):  # add all neighbors of new born
                    if x not in acells: acells[x] = board[x[0]][x[1]] 

        for c in acells:
            board[c[0]][c[1]] = acells[c]

N = 7
board = init(N)
create_plane(board)

live(board)
票数 2
EN

Stack Overflow用户

发布于 2013-07-27 13:20:37

您是否考虑使用有序字典而只是将值设置为None?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17897988

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档