Ejemplo n.º 1
0
class GameOfLife:
    def __init__(self):
        pygame.init()  #初始化背景设置
        self.blocks_right = c * (block_size + 1)  #计算方格区右边界
        height = r * (block_size + 1)
        if height < 300:
            height = 300  #保证按键显示完全
        self.screen = pygame.display.set_mode(
            (self.blocks_right + 100, height))
        pygame.display.set_caption("Game Of Life")  #设置标题
        self.screen.fill(bg_color)
        self.core = Core(r, c)
        self.__init_lives()
        self.blocks = Blocks(r, c, block_size, self.screen,
                             self.core.get_now_state())
        self.blocks.draw_board()
        self.running = False
        self.time = time.time()
        self.__add_buttons()
        self.speed = 1

        return

    #添加初始生命
    def __init_lives(self):
        self.core.add_life(1, 1, rle.glider)
        self.core.add_life(15, 10, rle.blinker)
        self.core.add_life(20, 10, rle.toad)
        self.core.add_life(10, 80, rle.HWSS)
        self.core.add_life(30, 0, rle.glider_generater)
        self.core.add_life(30, 40, rle.glider_generater)

    #添加按键
    def __add_buttons(self):
        self.next_button = Button(self.blocks_right + 10, 20, self.screen,
                                  'next')
        self.start_button = Button(self.blocks_right + 10, 80, self.screen,
                                   'start')
        self.stop_button = Button(self.blocks_right + 10, 140, self.screen,
                                  'stop')
        self.speed_up_button = Button(self.blocks_right + 10, 200, self.screen,
                                      'speed up')
        self.speed_down_button = Button(self.blocks_right + 10, 260,
                                        self.screen, 'speed down')
        self.next_button.draw_button()
        self.start_button.draw_button()
        self.stop_button.draw_button()
        self.speed_up_button.draw_button()
        self.speed_down_button.draw_button()

    #点击方格区
    def click_block(self, mouse_x, mouse_y):
        r = int(mouse_y / (block_size + 1))
        c = int(mouse_x / (block_size + 1))
        self.core.change_block(r, c)
        self.blocks.click(r, c)

    #点击按键区
    def click_button(self, mouse_x, mouse_y):
        if self.next_button.rect.collidepoint(mouse_x, mouse_y):
            self.blocks.set_status(self.core.get_next_state())
        if self.start_button.rect.collidepoint(mouse_x, mouse_y):
            self.running = True
        if self.stop_button.rect.collidepoint(mouse_x, mouse_y):
            self.running = False
        if self.speed_up_button.rect.collidepoint(mouse_x, mouse_y):
            if self.speed < 20:
                self.speed += 1
        if self.speed_down_button.rect.collidepoint(mouse_x, mouse_y):
            if self.speed > 1:
                self.speed -= 1
        return

    #添加按键
    def draw(self):
        self.blocks.draw_board()
        pygame.display.flip()

    #运行游戏
    def run_game(self):
        while True:
            for event in pygame.event.get():  #检测键盘鼠标事件
                if event.type == pygame.QUIT:
                    sys.exit()  #退出程序
                elif event.type == pygame.MOUSEBUTTONDOWN:  #检测鼠标点击事件
                    mouse_x, mouse_y = pygame.mouse.get_pos(
                    )  #get_pos()返回一个单击时鼠标的xy坐标
                    if (mouse_x < self.blocks_right):
                        self.click_block(mouse_x, mouse_y)
                    else:
                        self.click_button(mouse_x, mouse_y)
            if self.running:
                nowtime = time.time()
                if nowtime - self.time > (1 / self.speed):
                    self.time = nowtime
                    self.blocks.set_status(self.core.get_next_state())
            self.draw()