Hra života je dvoustavový, dvourozměrný celulární automat, který svým
chováním připomíná vývoj společenství živých organismů. Odehrává se na matici
buněk, jejíž stav předurčuje podobu hry v následujícím kroku.
Už moc nevím, kde jsem se k této hře nebo algoritmu dostal, ale docela se mi
tato myšlenka zalíbila. Pro implementaci stačí dvourozměrná matice čísel 0 a 1,
které představují mrtvé a živé buňky. O tom, jak bude matice vypadat v
následujícím kroku se rozhodne podle těchto pravidel:
- Každá živá buňka s méně než dvěma živými sousedy zemře.
- Každá živá buňka se dvěma nebo třemi živými sousedy zůstává žít.
- Každá živá buňka s více než třemi živými sousedy zemře.
- Každá mrtvá buňka s právě třemi živými sousedy oživne.
Pro zobrazení a animaci jsem použil modul matplotlib.
game_of_live.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50 | import random
import pylab as lab
import matplotlib.animation as animation
w = 2**7
h = w
def onclick(event):
global data
new = [[0 for i in range(w)] for j in range(h)]
for m in range(h):
for n in range(w):
i = m if m != h-1 else -1
j = n if n != w-1 else -1
suma = data[i+1][j] + data[i-1][j] + \
data[i][j+1] + data[i][j-1] + \
data[i+1][j+1]+data[i-1][j-1] + \
data[i+1][j-1]+data[i-1][j+1]
if data[i][j] == 1:
if suma < 2:
new[i][j] = 0
elif suma > 3:
new[i][j] = 0
else:
new[i][j] = 1
else:
if suma == 3:
new[i][j] = 1
else:
new[i][j] = 0
data = new
grid.set_array(data)
lab.draw()
data = [[random.randint(0, 7) for i in range(w)] for j in range(h)]
for i in range(h):
for j in range(w):
data[i][j] = data[i][j] if data[i][j] == 1 else 0
fig = lab.figure()
sub = lab.subplot(111)
sub.axes.get_xaxis().set_visible(False)
sub.axes.get_yaxis().set_visible(False)
grid = lab.imshow(data, interpolation='none', cmap='binary')
lab.grid()
ani = animation.FuncAnimation(fig, onclick, interval=300)
lab.show()
|
Pravidla lze samozřejmě
upravovat
— lze tak dosáhnout poměrně zajímavých výsledků…