From 92eb91cae76192ba0127f8bde3c78d1b3371a63e Mon Sep 17 00:00:00 2001 From: Charles Date: Sat, 24 Aug 2019 09:55:18 +0200 Subject: Game of life in Python initial commit --- graphic.py | 114 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 graphic.py (limited to 'graphic.py') diff --git a/graphic.py b/graphic.py new file mode 100644 index 0000000..5fac320 --- /dev/null +++ b/graphic.py @@ -0,0 +1,114 @@ +import os +from time import sleep, time +from threading import Thread + +import pygame as pg +from pygame.locals import * + + +RESOLUTION = (720, 520) +BLACK_COLOR = (0, 0, 0) +WHITE_COLOR = (255, 255, 255) +DECAL_LENGTH = 20 +FPS = 30 + + +class Graphic: + def __init__(self, gol): + self.gol = gol + self.running = True + self.key_event_occured = False + self.inspect_next = False + self.full_screen = False + self.x_decal = 0 + self.y_decal = 0 + self.zoom_level = 0 + self.time_next_draw = time() + + @property + def square_size(self): + return self.gol.square_size + self.zoom_level + + def main_loop(self): + os.environ['SDL_VIDEO_CENTERED'] = '1' + pg.init() + # display_info = pg.display.Info() + # self.screen_size = (display_info.current_w, display_info.current_h) + # print(RESOLUTION == self.screen_size) + pg.display.set_caption('Game of life') + self.window = pg.display.set_mode(RESOLUTION, RESIZABLE | DOUBLEBUF) + self.sans_font = pg.font.SysFont('sans', 15) + clock = pg.time.Clock() + + while self.running: + clock.tick(FPS) + self.event_handler() + self.update() + pg.display.flip() + + def update(self): + if not self.gol.inspect: + if not time() >= self.time_next_draw: + return + self.time_next_draw = time() + self.gol.time_step + + if self.gol.inspect and not self.key_event_occured: + return + self.window.fill(BLACK_COLOR) + for node in self.gol.alive_nodes: + node_rect = pg.Rect(10 + self.x_decal + (node.x + 1) * self.square_size, + 45 + self.y_decal + (node.y + 1) * self.square_size, + self.square_size, self.square_size) + pg.draw.rect(self.window, WHITE_COLOR, node_rect) + + gen_text = self.sans_font.render(str(self.gol.generation_counter), + True, WHITE_COLOR, BLACK_COLOR) + self.window.blit(gen_text, (10, 35)) + + gen_text = self.sans_font.render(str(self.gol.pattern_name), + True, WHITE_COLOR, BLACK_COLOR) + self.window.blit(gen_text, (10, 10)) + if (self.gol.inspect and self.inspect_next) or not self.gol.inspect: + self.gol.next_generation() + if self.gol.generation_counter > self.gol.max_gen: + self.running = False + self.key_event_occured = False + self.inspect_next = False + + def event_handler(self): + for event in pg.event.get(): + if event.type == QUIT: + self.running = False + elif event.type == KEYDOWN: + self.key_event_occured = True + # trigger next step in inspect mode + if event.key == K_RETURN or event.key == K_SPACE: + self.inspect_next = True + # quit + elif event.key == K_q: + self.running = False + # toggle inspect mode + elif event.key == K_i: + self.gol.inspect = not self.gol.inspect + # elif event.key == K_F11 or (event.key == K_ESCAPE and self.full_screen): + # pg.display.toggle_fullscreen() + # if self.window.get_flags() & FULLSCREEN: + # pg.display.set_mode(RESOLUTION, RESIZABLE | DOUBLEBUF) + # else: + # pg.display.set_mode(RESOLUTION, RESIZABLE | DOUBLEBUF | FULLSCREEN) + # view move + elif event.key == K_UP: + self.y_decal += DECAL_LENGTH + elif event.key == K_DOWN: + self.y_decal -= DECAL_LENGTH + elif event.key == K_LEFT: + self.x_decal += DECAL_LENGTH + elif event.key == K_RIGHT: + self.x_decal -= DECAL_LENGTH + # zoom + elif event.key == K_MINUS: + self.zoom_level -= 1 + elif event.key == K_EQUALS: + self.zoom_level += 1 + elif event.type == VIDEORESIZE: + pg.display.set_mode(event.size, RESIZABLE | DOUBLEBUF) -- cgit