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