Exemple #1
0
class Game:
    def __init__(self):
        from Screen import Screen
        self.screen = Screen()
        self.grid = self.create_grid().randomize()
        self.PAUSE = False

    def create_grid(self):
        from Grid import Grid
        return Grid(self.screen.num_rows(), self.screen.num_cols())

    def draw_grid(self):
        self.screen.clear()
        self.screen.draw_grid(self.grid)

    def determine_new_cell_state(self, row, col):
        # gegeven een cel[row][col], bepaal de nieuwe state van de cel aan de hand van zijn buren
        num_alive_neighbours = self.grid.get_alive_neighbours(row, col)
        cell_value = self.grid.get_value(row, col)
        if cell_value == Constants.ALIVE:
            if num_alive_neighbours < 2:  # rule 1: underpopulation: levende cel gaat dood uit eenzaamheid
                return Constants.DEATH
            if num_alive_neighbours == 2 or num_alive_neighbours == 3:
                return Constants.ALIVE  # rule 2: stay alive: levende cel heeft voldoende levende buren
            if num_alive_neighbours > 3:  # rule 3: overpopulation: cel gaat dood indien meer dan 3 levende buren
                return Constants.DEATH
        elif cell_value == Constants.DEATH:
            if num_alive_neighbours == 3:  # rule 4: reproduction: dode cel komt tot leven met 3 levende buren
                return Constants.ALIVE
        return cell_value  # geen wijziging

    def update_generation(self):
        # maak een nieuwe grid en pas de regels toe op basis van de oude generatie
        new_grid = self.create_grid()
        for row in range(self.grid.num_rows):
            for col in range(self.grid.num_cols):
                new_cell_state = self.determine_new_cell_state(row, col)
                new_grid.set_value(row, col, new_cell_state)
        self.grid = new_grid

    def load_file(self,
                  filename,
                  offset_row=Constants.OFFSET_ROW,
                  offset_col=Constants.OFFSET_COL):
        # lees een rle file in en plaats deze in grid vanaf offset[row][col]
        from RleReader import RleReader
        self.screen.clear()
        self.grid = self.create_grid()
        RleReader.read_from_file(self.grid, filename, offset_row, offset_col)
        self.screen.draw_grid(self.grid)
        self.PAUSE = True

    def save_file(self, filename):
        from RleWriter import RleWriter
        RleWriter.save_to_file(filename, self.grid)

    def handle_events(self):
        def key_file(key):
            num = key - pygame.K_0
            name = "./data/file_{0}.rle".format(num)
            return name

        for event in pygame.event.get():
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_q:  # quit
                    sys.exit()
                elif event.key == pygame.K_p:  # pause
                    self.PAUSE = not self.PAUSE
                elif event.key == pygame.K_s:  # save
                    self.save_file("./data/pipo.rle")
                elif event.key == pygame.K_l:  # load
                    self.load_file("./data/pipo.rle", 0, 0)
                elif event.key == pygame.K_r:  # randomize
                    self.grid = self.create_grid().randomize()
                elif event.key == pygame.K_c:  # clear
                    self.grid.clear()
                elif event.key == pygame.K_t:  # single step if pause
                    self.update_generation()
                    self.screen.draw_grid(self.grid)
                elif event.key in [
                        pygame.K_0,  # load key 1-0 file
                        pygame.K_1,
                        pygame.K_2,
                        pygame.K_3,
                        pygame.K_4,
                        pygame.K_5,
                        pygame.K_6,
                        pygame.K_7,
                        pygame.K_8,
                        pygame.K_9
                ]:
                    self.load_file(key_file(event.key))
            elif event.type == pygame.QUIT:
                sys.exit()

    def run(self):
        while True:
            self.handle_events()
            if not self.PAUSE:
                self.update_generation()
                self.screen.draw_grid(self.grid)
            self.screen.cap_frame_rate()