现在,我已经阅读了其他的“生命游戏”中的堆叠溢出问题,也大量搜索了“生活的游戏”,我知道如何实现我的“生命游戏”,我想要跟踪grid.The问题中的活动单元,因为我被困在该如何编码它。
我的想法是这样的,但在那之后,我的智慧就快到极点了:
B C D
. A .
. . .
如果A满足3),则它添加B,C,D
如果B也返回true ( 3),这意味着它将再次添加A、C(重复)我考虑过使用OrderedSet或什么东西来处理订单,避免使用duplication.But,但我还是遇到了这些问题,我只需要一个方向。
发布于 2013-07-27 13:47:33
您有两个列表,我将它们命名为currentState和newChanges。以下是工作流程:
示例:
发布于 2013-07-27 14:47:01
不知道它是否对你有帮助,但这里有一个关于“生命的游戏”的速写,还有活动词典:
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)
发布于 2013-07-27 13:20:37
您是否考虑使用有序字典而只是将值设置为None?
https://stackoverflow.com/questions/17897988
复制相似问题