pixelserver2/apps/rps.py

71 lines
1.7 KiB
Python
Raw Normal View History

2024-10-28 17:10:03 +00:00
#!/usr/bin/env python3
import sys
import os
import numpy as np
import pygame
Nx = int(sys.argv[1])
Ny = int(sys.argv[2])
try:
frequency = float(sys.argv[3])
except (IndexError, ValueError):
frequency = 5
fps = 10
nstates = 5
colors = np.linspace(0, 255, nstates, dtype=np.uint8)
red = np.random.choice(colors, size=(Ny,Nx))
green = np.zeros((Ny, Nx))
blue = np.zeros((Ny, Nx))
grid = np.dstack((red, green, blue)).astype(np.uint8)
clock = pygame.time.Clock()
def clamp(value, min, max):
if value > max:
return max
elif value < min:
return min
return value
while True:
for px in range(Nx):
for py in range(Ny):
statecount = np.zeros(nstates, dtype=np.uint8)
for ix in [-1, 0, 1]:
for iy in [-1, 0, 1]:
if (px+ix) >= Nx or (px+ix) <= 0 or (py+iy) >= Ny or (py+iy) <= 0:
i = 0
else:
i = int(grid[py + iy, px + ix, 0] / colors[1])
#i = int(grid[(px + ix) % Nx, (py + iy) % Ny, 0] / colors[1])
#i = int(grid[max(min(px + ix, Nx-1), 0), max(min(py + iy, Ny-1), 0), 0] / colors[1])
#print(px, py, max(min(px + ix, Nx-1), 0), max(min(py + iy, Ny-1), 0), file=sys.stderr)
statecount[i] = statecount[i] + 1
i = int(grid[py, px, 0] / colors[1])
i_successor = (i+1) % colors.size
if statecount[i_successor] >= 2: #(2-np.random.randint(0, 2)):
grid[py, px, 0] = colors[i_successor]
# for i in range(Nx*Ny):
# c1 = clamp(i % Nx - 1, 0, Nx - 1)
# c2 = clamp(int(i / Nx) - 1, 0, Ny - 1)
# neighbourhood = grid[c1:(c1+3), c2:(c2+3), 0]
# #print(neighbourhood.size, file=sys.stderr)
out = grid.tobytes()
os.write(1, out)
clock.tick_busy_loop(fps)