import pygame import pygame._view from pygame.locals import * import sys import random pygame.init() class Cell(pygame.sprite.Sprite): def __init__(self, game, pos, num): pygame.sprite.Sprite.__init__(self) self.game = game self.num = num self.color = self.getColor() self.parent = 0 self.image = pygame.Surface([10,10]) self.image.fill((0,0,0)) self.rect = self.image.get_rect() self.rect.topleft = pos self.alive = False self.edge = False self.a_neighbors = [] self.d_neighbors = [] self.n = (num - 74) - 1 self.e = (num + 1) - 1 self.s = (num + 74) - 1 self.w = (num - 1) - 1 self.ne = (self.n + 1) self.se = (self.s + 1) self.nw = (self.n - 1) self.sw = (self.s - 1) self.cell_list = [ self.n, self.e, self.s, self.w, self.ne, self.se, self.nw, self.sw] self.game.cells.append(self) def getColor(self): value = [i for i in range(100,255,25)] r = random.choice(value) g = random.choice(value) b = random.choice(value) return (r,g,b) def die(self): self.alive = False def live(self): self.alive = True def update(self): if not self.edge: self.a_neighbors = [] self.d_neighbors = [] neighbors = [self.game.cells[cell] for cell in self.cell_list] for n in neighbors: if n.alive: self.a_neighbors.append(True) else: self.d_neighbors.append(True) if not self.game.running: if pygame.mouse.get_pressed()[0] and self.rect.collidepoint(self.game.mpos): self.alive = True self.image.fill(self.color) if pygame.mouse.get_pressed()[2] and self.rect.collidepoint(self.game.mpos)and self.alive: self.image.fill((0,0,0)) self.alive = False if self.alive: self.image.fill(self.color) else: if self.alive: self.image.fill(self.color) if not self.alive: self.image.fill((0, 0, 0)) else: self.image.fill((255, 255, 255)) class Game(): def __init__(self): #window setup pygame.display.set_caption('Game Of Life') # initiate the clock and screen self.clock = pygame.time.Clock() self.last_tick = pygame.time.get_ticks() self.screen_res = [740, 490] self.font = pygame.font.SysFont("Impact", 19) self.sprites = pygame.sprite.Group() self.cells = [] self.generation = 0 self.population = 0 self.screen = pygame.display.set_mode(self.screen_res, pygame.HWSURFACE, 32) self.running = False self.createGrid() while 1: self.Loop() def createGrid(self): col = 0 row = 50 cell_num = 0 for y in xrange(44): for x in xrange(74): cell_num +=1 cell = Cell(self, [col, row], cell_num) if row == 50 or row == 480 or col == 0 or col == 730: cell.edge = True self.sprites.add(cell) col += 10 row += 10 col = 0 def Run(self): self.population = 0 for cell in self.cells: if cell.alive: self.population += 1 if len(cell.a_neighbors) < 2: cell.die() elif len(cell.a_neighbors) > 3: cell.die() elif len(cell.a_neighbors) == 2 or len(cell.a_neighbors) == 3: cell.live() else: if len(cell.a_neighbors) == 3: cell.live() def blitDirections(self): text = self.font.render("Press Enter to begin, and Space to stop and clear board", 1, (255,255,255)) generations = self.font.render("Generation: %s" %str(self.generation), 1, (255,255,255)) pop = self.font.render("Pop: %s" %str(self.population), 1, (255,255,255)) self.screen.blit(text, (10, 15)) self.screen.blit(generations, (500, 15)) self.screen.blit(pop, (650, 15)) def Loop(self): # main game loop self.eventLoop() self.Tick() self.Draw() pygame.display.update() def eventLoop(self): # the main event loop, detects keypresses for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() if event.type == KEYDOWN: if event.key == K_RETURN: self.running = True if event.key == K_SPACE: self.running = False self.sprites.empty() self.cells = [] self.createGrid() def Tick(self): # updates to player location and animation frame self.ttime = self.clock.tick() self.mpos = pygame.mouse.get_pos() self.keys_pressed = pygame.key.get_pressed() if self.running: self.generation +=1 self.Run() else: self.generation = 0 self.population = 0 def Draw(self): self.screen.fill(0) self.blitDirections() self.sprites.update() self.sprites.draw(self.screen) Game()