So I read about Conways Game of Life and tried to implement it with PyGame.
I tried to make it object-oriented. The way it works is that I have a list of cell-instances, which then check how many neighbours they have and then either stay alive or die, based on their neighbours. Then the process repeats itself.
The problem is that when I test it with some known starting patterns (e.g. in the code below (CELL_MAP)) it does not work the way it should.
I read the code over and over and I dont really get what I'm missing here. I posted the whole code below as I dont know where my mistake is, but I'd highly appreciate if someone would point me in the right direction.
Thanks in advance!
import pygame
class Cell:
def __init__(self, live, xcor, ycor):
self.alive = live
self.x = xcor
self.y = ycor
self.neighbours = 0
def checkNeighbours(self, cellList):
for cell in cellList:
#left
if cell.x == self.x-1 and cell.y == self.y and cell.alive == True:
self.neighbours += 1
#right
elif cell.x == self.x+1 and cell.y == self.y and cell.alive == True:
self.neighbours += 1
#upleft
elif cell.x == self.x-1 and cell.y == self.y-1 and cell.alive == True:
self.neighbours += 1
#up
elif cell.x == self.x and cell.y == self.y-1 and cell.alive == True:
self.neighbours += 1
#upright
elif cell.x == self.x+1 and cell.y == self.y-1 and cell.alive == True:
self.neighbours += 1
#downleft
elif cell.x == self.x-1 and cell.y == self.y+1 and cell.alive == True:
self.neighbours += 1
#down
elif cell.x == self.x and cell.y == self.y+1 and cell.alive == True:
self.neighbours += 1
#downright
elif cell.x == self.x+1 and cell.y == self.y+1 and cell.alive == True:
self.neighbours += 1
def breed(self):
if self.alive == False and self.neighbours == 3:
#dead cell ressurects if neighbours equals 3
self.alive = True
elif self.alive and self.neighbours < 2:
#die from loneliness
self.alive = False
elif self.alive and self.neighbours == 2:
#stay alive
pass
elif self.alive and self.neighbours == 3:
#stay alive
pass
elif self.alive and self.neighbours > 3:
#die from overpopulation
self.alive = False
def render(self, display):
if self.alive:
pygame.draw.rect(display, (0,0,0), [self.x*10, self.y*10, 10, 10])
elif self.alive == False:
pygame.draw.rect(display, (0,0,255), [self.x*10, self.y*10, 10, 10])
WID = 33
HEI = 20
CELL_MAP = [[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]]
CELL_LIST = []
xc = -1
yc = -1
for yList in CELL_MAP:
yc += 1
for x in yList:
xc += 1
if x == 0:
#create dead cell
newCell = Cell(False, xc, yc)
CELL_LIST.append(newCell)
elif x == 1:
#create alive cell
newCell = Cell(True, xc, yc)
CELL_LIST.append(newCell)
xc = -1
#pygame init
pygame.init()
(width, height) = (WID*10, HEI*10)
pygame.display.set_caption('Game of Life')
screen = pygame.display.set_mode((width, height))
#game loop
def gameLoop():
gameLoop = True
while gameLoop:
#check for exit
for event in pygame.event.get():
if event.type == pygame.QUIT:
gameLoop = False
pygame.quit()
#render cells
for cell in CELL_LIST:
cell.render(screen)
#check neighbours
for cell in CELL_LIST:
cell.checkNeighbours(CELL_LIST)
pygame.display.flip()
#breed
for cell in CELL_LIST:
cell.breed()
pygame.time.wait(5)
quit()
if __name__ == "__main__":
gameLoop()