RosettaCodeData/Task/Conways-Game-of-Life/Processing-Python-mode/conways-game-of-life.processing-py
2023-07-01 13:44:08 -04:00

111 lines
2.8 KiB
Text

cell_size = 10
sample = 10
play = False # simulation is running
last_cell = 0
def setup():
global grid, next_grid, rows, cols
size(800, 500)
rows = height / cell_size
cols = width / cell_size
grid = empty_grid()
next_grid = empty_grid()
randomize_grid()
println("Press 'space' to start/stop")
println("'e' to clear all cells")
println("'b' demonstrate 'blinker'")
println("'g' demonstrate glider")
println("'r' to randomize grid")
println("'+' and '-' to change speed")
def draw():
background(0)
for i in range(cols):
x = i * cell_size
for j in range(rows):
y = j * cell_size
current_state = grid[i][j]
fill(255)
noStroke()
if current_state:
rect(x, y, cell_size, cell_size)
if play:
ngbs_alive = calc_ngbs_alive(i, j)
result = rule(current_state, ngbs_alive)
next_grid[i][j] = result
if play and frameCount % sample == 0 and not mousePressed:
step()
def rule(current, ngbs):
""" classic Conway's Game of Life rule """
if ngbs < 2 or ngbs > 3:
return 0 # dies / dead
elif ngbs == 3:
return 1 # born / alive
else:
return current # stays the same (ngbs == 2)
def calc_ngbs_alive(i, j):
NEIGHBOURS = ((-1, 00), (01, 00), # a tuple describing the neighbourhood of a cell
(-1, -1), (00, -1),
(01, -1), (-1, 01),
(00, 01), (01, 01))
alive = 0
for iv, jv in NEIGHBOURS:
alive += grid[(i + iv) % cols][(j + jv) % rows]
return alive
def empty_grid():
grid = []
for _ in range(cols):
grid.append([0] * rows)
return grid
def randomize_grid():
from random import choice
for i in range(cols):
for j in range(rows):
grid[i][j] = choice((0, 1))
def step():
global grid, next_grid
grid = next_grid
next_grid = empty_grid()
def keyReleased():
global grid, play, sample
if key == "e":
grid = empty_grid()
if key == "r":
randomize_grid()
if key == "g":
grid[10][10:13] = [0, 1, 0]
grid[11][10:13] = [0, 0, 1]
grid[12][10:13] = [1, 1, 1]
if key == "b":
grid[10][10:13] = [0, 1, 0]
grid[11][10:13] = [0, 1, 0]
grid[12][10:13] = [0, 1, 0]
if key == " ":
play = not play
if str(key) in '+=':
sample = max(sample - 1, 1);
if key == '-':
sample += 1
def mousePressed():
paint()
def mouseDragged():
paint()
def paint():
global last_cell
i, j = mouseX // cell_size, mouseY // cell_size
p = j * cols + i
if p != last_cell:
last_cell = p
grid[i][j] = (1, 0)[grid[i][j]]