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:
|
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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user