Added new default animation for alma

This commit is contained in:
Sebastian 2016-08-15 22:14:10 +02:00
parent 1e2b0be3d2
commit 8d8cd1c883
1 changed files with 181 additions and 0 deletions

View File

@ -0,0 +1,181 @@
#!/usr/bin/env python2
import sys
import signal
import colorsys
from random import randint
from time import sleep
from twinklclient import TwinklSocket, TwinklMessage
WIDTH = 12
HEIGHT = 8
MAX_GENS = 180
cells = []
msg = None
socket = None
priority = 0
def set_box(x,y,r,g,b):
if x >= 0 and y >= 0 and x < WIDTH and y < HEIGHT:
base_address = (y * WIDTH + x) * 3
msg[base_address] = b
msg[base_address + 1] = r
msg[base_address + 2] = g
def clear():
for x in range(0, WIDTH):
for y in range(0, HEIGHT):
set_box(x, y, 0, 0, 0)
def terminate(signal, frame):
if msg:
msg.reset()
msg.set_priority(priority)
socket.send(msg)
msg.destroy()
if socket:
socket.close()
sys.exit(0)
class CellStates(object):
DEAD = 0
BORN = 1
ALIVE = 2
LONELY = 3
CROWED = 4
class Cell(object):
def __init__(self, x, y):
self._x = x
self._y = y
self._status = CellStates.DEAD
self._next_status = CellStates.DEAD
def randomize(self):
if randint(0,10) % 2 == 0:
self._next_status = CellStates.BORN
def _get_neighbour(self, dx, dy):
x = self._x + dx
if x >= WIDTH:
x = x - WIDTH
if x < 0:
x = x + WIDTH
y = self._y + dy
if y >= HEIGHT:
y = y - HEIGHT
if y < 0:
y = y + HEIGHT
return cells[x][y]
def _count_neighbours(self):
count = 0
for dx in [-1, 0, 1]:
for dy in [-1, 0, 1]:
if self._get_neighbour(dx, dy).is_alive() and not (dx == 0 and dy == 0):
count = count + 1
return count
def calculate_next_status(self):
neighbours = self._count_neighbours()
if self._status == CellStates.DEAD or self._status == CellStates.LONELY or self._status == CellStates.CROWED:
if neighbours == 3:
self._next_status = CellStates.BORN
else:
self._next_status = CellStates.DEAD
elif self._status == CellStates.ALIVE or self._status == CellStates.BORN:
if neighbours < 2:
self._next_status = CellStates.LONELY
elif neighbours > 3:
self._next_status = CellStates.CROWED
else:
self._next_status = CellStates.ALIVE
def flip(self):
self._status = self._next_status
def is_alive(self):
return self._status == CellStates.ALIVE or self._status == CellStates.BORN
def get_status(self):
return self._status
if __name__== "__main__":
signal.signal(signal.SIGINT, terminate)
if len(sys.argv) != 3:
print "Usage: %s host priority" % sys.argv[0]
sys.exit(1)
socket = TwinklSocket(sys.argv[1], "1337")
msg = TwinklMessage()
priority = int(sys.argv[2])
msg.set_priority(priority)
for x in range(0, WIDTH):
collumn = []
for y in range(0, HEIGHT):
cell = Cell(x,y)
cell.randomize()
collumn += [cell]
cells += [collumn]
gens = 0
while(True):
stale = True
clear()
for x in range(0, WIDTH):
for y in range(0, HEIGHT):
cells[x][y].flip()
if cells[x][y].get_status() == CellStates.DEAD:
set_box(x, y, 0, 0, 0)
elif cells[x][y].get_status() == CellStates.BORN:
set_box(x, y, 0, 0, 255)
stale = False
elif cells[x][y].get_status() == CellStates.ALIVE:
set_box(x, y, 0, 255, 0)
elif cells[x][y].get_status() == CellStates.LONELY:
set_box(x, y, 255, 255, 0)
stale = False
elif cells[x][y].get_status() == CellStates.CROWED:
set_box(x, y, 255, 0, 255)
stale = False
socket.send(msg)
sleep(0.5)
#raw_input()
print gens
for x in range(0, WIDTH):
for y in range(0, HEIGHT):
if stale or gens > MAX_GENS:
cells[x][y].randomize()
else:
cells[x][y].calculate_next_status()
if stale or gens > MAX_GENS:
gens = 0
else:
gens = gens + 1