Added board reset, hold-click to paint, increased FPS to 60 for responsiveness

This commit is contained in:
=
2024-03-21 20:56:55 -05:00
parent 7cbc496619
commit 4ecc25691d

View File

@@ -39,9 +39,11 @@ class Cell:
def __init__(self, position: XYPair, dimensions: XYPair, render_info: Render_Info, state: CellStates=CellStates.DEAD) -> None: def __init__(self, position: XYPair, dimensions: XYPair, render_info: Render_Info, state: CellStates=CellStates.DEAD) -> None:
self.crowding_number = 0 self.crowding_number = 0
self.position = position self.position = position
self.dimensions = dimensions self.dimensions = dimensions
self.state = state self.state = state
self.click_state = None
self.screen_position = self.calculate_screen_position(render_info) self.screen_position = self.calculate_screen_position(render_info)
self.image = pygame.Surface(self.dimensions) self.image = pygame.Surface(self.dimensions)
self.image.fill(Colors.GRAY.value) self.image.fill(Colors.GRAY.value)
@@ -54,12 +56,6 @@ class Cell:
self.state = state self.state = state
self.image.fill(self.PALETTE_MAP[self.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): def set_crowding_number(self, n: int):
self.crowding_number = n self.crowding_number = n
@@ -74,8 +70,10 @@ class Cell:
class Board: 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 screen_dimenions = render_info.screen_dimensions
self.evolution_time = evolution_time
self.clock = 0
padding = render_info.padding padding = render_info.padding
#calculate cell dimensions once instead of x*y times #calculate cell dimensions once instead of x*y times
cell_dimensions = XYPair(screen_dimenions.x/dimensions.x - 2*padding.x, cell_dimensions = XYPair(screen_dimenions.x/dimensions.x - 2*padding.x,
@@ -128,6 +126,12 @@ class Board:
for cell in row: for cell in row:
cell.draw(screen) 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 handle_click(self, mouse_pos, render_info):
def pixel_to_index(x, w, p): def pixel_to_index(x, w, p):
@@ -138,7 +142,25 @@ class Board:
dimensions = self.matrix[0][0].dimensions dimensions = self.matrix[0][0].dimensions
x = pixel_to_index(mouse_pos[0], dimensions.x, render_info.padding.x) 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) 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): def __repr__(self):
lines = [] lines = []
@@ -157,7 +179,7 @@ class Board:
def main(): def main():
render_info: Render_Info = Render_Info() render_info: Render_Info = Render_Info()
screen = pygame.display.set_mode(render_info.screen_dimensions) 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") pygame.display.set_caption("Conway's Game of Life")
clock = pygame.time.Clock() clock = pygame.time.Clock()
@@ -167,21 +189,27 @@ def main():
while running: while running:
clock.tick(10) dt = clock.tick(60)
board.draw(screen) board.draw(screen)
pygame.display.flip() pygame.display.flip()
if not paused: 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(): 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.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE: if event.key == pygame.K_SPACE:
paused = not paused paused = not paused
if event.key == pygame.K_ESCAPE:
board.reset()
if event.type == pygame.QUIT: if event.type == pygame.QUIT:
running = False running = False