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

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')