forked from Blinkenbunt/blup
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
96 lines
2.7 KiB
96 lines
2.7 KiB
import sys |
|
import ast |
|
import time as t |
|
import random as r |
|
import blup.animation |
|
import blup.frame |
|
import blup.writebml |
|
|
|
r.seed() |
|
|
|
WIDTH = 22 |
|
HEIGHT = 16 |
|
|
|
COLOR_DEPTH = 256 |
|
COLORS = 3 |
|
DELAY = 300 |
|
|
|
DEAD = 0 |
|
DEADCOLOR = (0,0,0) |
|
ALIVE = 1 |
|
ALIVECOLOR = (0,0,255) |
|
|
|
dimension = blup.frame.FrameDimension(WIDTH, HEIGHT, COLOR_DEPTH, COLORS) |
|
animation = blup.animation.Animation(dimension) |
|
|
|
def generateRandomGameBoard(): |
|
gameBoard = [] |
|
for i in range(HEIGHT): |
|
xCoordinates = [] |
|
for j in range(WIDTH): |
|
xCoordinates.append(r.randint(0, 1)) |
|
gameBoard.append(xCoordinates) |
|
return gameBoard |
|
|
|
def get_neighbors(x, y): |
|
for rowNumber in range(y-1, y+2): |
|
if 0 <= rowNumber < HEIGHT: |
|
for colNumber in range(x-1, x+2): |
|
if 0 <= colNumber < WIDTH: |
|
if not (y==rowNumber and x==colNumber): |
|
yield gameBoard[rowNumber][colNumber] |
|
|
|
if len(sys.argv) == 1: |
|
gameBoard = generateRandomGameBoard() |
|
gameBoardIsSanitized = True |
|
elif len(sys.argv) != 2: |
|
print("check args. found "+str(len(sys.argv))) |
|
exit() |
|
|
|
if not gameBoardIsSanitized: |
|
gameBoard = ast.literal_eval(sys.argv[1]) |
|
|
|
if len(gameBoard) != HEIGHT: |
|
print("len(gameBoard) != "+str(HEIGHT)+". counted "+str(len(gameBoard))) |
|
exit() |
|
|
|
for i in gameBoard: |
|
if len(i) != WIDTH: |
|
print("len(rows) != "+str(WIDTH)+". counted "+str(len(i))) |
|
exit() |
|
|
|
for frame in range(500): |
|
# construct frame |
|
newframe = blup.animation.AnimationFrame(dimension, DELAY) |
|
for rowIndex in range(HEIGHT): |
|
for colIndex in range(WIDTH): |
|
cellStatus = gameBoard[rowIndex][colIndex] |
|
if cellStatus == ALIVE: |
|
newframe.setPixel(colIndex, rowIndex, ALIVECOLOR) |
|
else: |
|
newframe.setPixel(colIndex, rowIndex, DEADCOLOR) |
|
animation.addFrame(newframe) |
|
|
|
# calculate next step |
|
gameBoardNextStep = [] |
|
lastGameBoard = gameBoard |
|
for rowIndex in range(HEIGHT): |
|
newRow = [] |
|
for colIndex in range(WIDTH): |
|
neighborList = list(get_neighbors(colIndex, rowIndex)) |
|
aliveNeighbors = neighborList.count(1) |
|
if aliveNeighbors < 2: |
|
newRow.append(DEAD) |
|
elif aliveNeighbors == 2: |
|
newRow.append(gameBoard[rowIndex][colIndex]) |
|
elif aliveNeighbors == 3: |
|
newRow.append(ALIVE) |
|
elif aliveNeighbors >= 4: |
|
newRow.append(DEAD) |
|
gameBoardNextStep.append(newRow) |
|
gameBoard = gameBoardNextStep |
|
if(gameBoard == lastGameBoard): |
|
for i in range(20): |
|
animation.addFrame(newframe) |
|
break |
|
writebml.writeBml(animation, '/home/pi/animations/gameOfLife.bml')
|
|
|