2017-10-20 125 views
2

我有生命的实施康威的游戏新作:如何使用matplotlib动画一组点?

def neighbors(point): 
    x, y = point 
    for i, j in itertools.product(range(-1, 2), repeat=2): 
     if any((i, j)): 
      yield (x + i, y + j) 

def advance(board): 
    newstate = set() 
    recalc = board | set(itertools.chain(*map(neighbors, board))) 

    for point in recalc: 
     count = sum((neigh in board) 
       for neigh in neighbors(point)) 
     if count == 3 or (count == 2 and point in board): 
      newstate.add(point) 

    return newstate 

我想以可视化的结果,所以我试图从Matplotlib animation example修改给出的例子:

glider = set([(0, 0), (1, 0), (2, 0), (0, 1), (1, 2)]) 

fig, ax = plt.subplots() 

x, y = zip(*glider) 
mat, = ax.plot(x, y, 'o') 

def animate(i): 
    glider = advance(glider) 
    x, y = zip(*glider) 
    mat.set_data(x, y) 
    return mat, 

ani = animation.FuncAnimation(fig, animate, interval=50) 
plt.show() 

但只是绘制the initial points

+0

您可能会感兴趣的游戏生活的其他matplotlib的实现,如[这一个](https://stackoverflow.com/questions/45653550/停止动画conways游戏的生活)或[这一个](https://stackoverflow.com/questions/46196346/why-does-my-game-of-life-simulation-slow-down-to-一个抓取中之秒-matplot)。 – ImportanceOfBeingErnest

回答

3

您拥有的代码实际上应该会产生错误。问题在于您在分配之前先参考glider

注意python函数中变量的局部范围。例如。尝试

a = 0 
def f(): 
    a = a + 1 
f() 

这会给你同样的错误。

在您的康威生命游戏代码中,您可以通过在全球范围内提供glider来避开此问题,即global glider。另外请确保您的轴限制允许看到动画。

完整的示例:

import itertools 
import matplotlib.pyplot as plt 
import matplotlib.animation as animation 

def neighbors(point): 
    x, y = point 
    for i, j in itertools.product(range(-1, 2), repeat=2): 
     if any((i, j)): 
      yield (x + i, y + j) 

def advance(board): 
    newstate = set() 
    recalc = board | set(itertools.chain(*map(neighbors, board))) 

    for point in recalc: 
     count = sum((neigh in board) 
       for neigh in neighbors(point)) 
     if count == 3 or (count == 2 and point in board): 
      newstate.add(point) 

    return newstate 

glider = set([(0, 0), (1, 0), (2, 0), (0, 1), (1, 2)]) 

fig, ax = plt.subplots() 

x, y = zip(*glider) 
mat, = ax.plot(x, y, 'o') 

def animate(i): 
    global glider 
    glider = advance(glider) 
    x, y = zip(*glider) 
    mat.set_data(x, y) 
    return mat, 

ax.axis([-15,5,-15,5]) 
ani = animation.FuncAnimation(fig, animate, interval=50) 
plt.show() 

enter image description here

+0

出于好奇@ImportanceOfBeingness,你是如何产生这个gif的? –

+1

@ReblochonMasque在这种情况下,您可以[保存任何动画](http://matplotlib.org/api/_as_gen/matplotlib.animation.Animation.html#matplotlib.animation.Animation.save):'ani.save(“output。 gif“writer =”imagemagick“)'。 – ImportanceOfBeingErnest

+0

非常感谢! –