From 4ecc25691d51fc5b810ec4242a74c7cdcbd92928 Mon Sep 17 00:00:00 2001 From: = <=> Date: Thu, 21 Mar 2024 20:56:55 -0500 Subject: [PATCH] Added board reset, hold-click to paint, increased FPS to 60 for responsiveness --- conway.py | 54 +++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 41 insertions(+), 13 deletions(-) diff --git a/conway.py b/conway.py index 3e8a4e6..74aedd7 100644 --- a/conway.py +++ b/conway.py @@ -39,9 +39,11 @@ class Cell: def __init__(self, position: XYPair, dimensions: XYPair, render_info: Render_Info, state: CellStates=CellStates.DEAD) -> None: self.crowding_number = 0 + self.position = position self.dimensions = dimensions self.state = state + self.click_state = None self.screen_position = self.calculate_screen_position(render_info) self.image = pygame.Surface(self.dimensions) self.image.fill(Colors.GRAY.value) @@ -54,12 +56,6 @@ class Cell: self.state = state self.image.fill(self.PALETTE_MAP[self.state]) - def toggle_state(self): - if self.state == CellStates.ALIVE: - self.set_state(CellStates.DEAD) - elif self.state == CellStates.DEAD: - self.set_state(CellStates.ALIVE) - def set_crowding_number(self, n: int): self.crowding_number = n @@ -74,8 +70,10 @@ class Cell: class Board: - def __init__(self, dimensions: XYPair, render_info: Render_Info): + def __init__(self, dimensions: XYPair, evolution_time, render_info: Render_Info): screen_dimenions = render_info.screen_dimensions + self.evolution_time = evolution_time + self.clock = 0 padding = render_info.padding #calculate cell dimensions once instead of x*y times cell_dimensions = XYPair(screen_dimenions.x/dimensions.x - 2*padding.x, @@ -128,6 +126,12 @@ class Board: for cell in row: cell.draw(screen) + def tick_clock(self, dt): + self.clock += dt + if self.clock >= self.evolution_time: + self.evolve_state() + self.clock = 0 + def handle_click(self, mouse_pos, render_info): def pixel_to_index(x, w, p): @@ -138,7 +142,25 @@ class Board: dimensions = self.matrix[0][0].dimensions x = pixel_to_index(mouse_pos[0], dimensions.x, render_info.padding.x) y = pixel_to_index(mouse_pos[1], dimensions.y, render_info.padding.y) - self.matrix[y][x].toggle_state() + + cell = self.matrix[y][x] + + if not self.click_state: + if cell.state == CellStates.ALIVE: + self.click_state = CellStates.DEAD + else: + self.click_state = CellStates.ALIVE + + self.matrix[y][x].set_state(self.click_state) + + + def reset_click(self): + self.click_state = None + + def reset(self): + for row in self.matrix: + for cell in row: + cell.set_state(CellStates.DEAD) def __repr__(self): lines = [] @@ -157,7 +179,7 @@ class Board: def main(): render_info: Render_Info = Render_Info() screen = pygame.display.set_mode(render_info.screen_dimensions) - board = Board(XYPair(50, 50), render_info) + board = Board(XYPair(50, 50), 100, render_info) pygame.display.set_caption("Conway's Game of Life") clock = pygame.time.Clock() @@ -167,21 +189,27 @@ def main(): while running: - clock.tick(10) + dt = clock.tick(60) board.draw(screen) pygame.display.flip() if not paused: - board.evolve_state() + board.tick_clock(dt) + + if pygame.mouse.get_pressed()[0]: + board.handle_click(pygame.mouse.get_pos(), render_info) + else: + board.reset_click() for event in pygame.event.get(): - if event.type == pygame.MOUSEBUTTONDOWN: - board.handle_click(pygame.mouse.get_pos(), render_info) if event.type == pygame.KEYDOWN: if event.key == pygame.K_SPACE: paused = not paused + if event.key == pygame.K_ESCAPE: + board.reset() + if event.type == pygame.QUIT: running = False