Added board reset, hold-click to paint, increased FPS to 60 for responsiveness
This commit is contained in:
54
conway.py
54
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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user