コード例 #1
0
ファイル: main.py プロジェクト: goserg/Tetris_pygame
class Game:
    def __init__(self) -> None:
        self.update_action_depending_on_state = {
            GameState.PLAY: self.update_play_screen,
            GameState.MENU: self.update_menu_screen,
            GameState.PAUSE: self.update_pause_screen,
            GameState.GAME_OVER: self.update_game_over_screen,
        }
        self.state = GameState.MENU

        self.grid = Grid()
        self.menu = Menu()
        self.start_menu = StartMenu()
        self.border = Border()

        self.clock = pygame.time.Clock()
        self.running = True
        self.to_draw = True

        self.player = type(next_indicator.next_one)()
        self.create_new_player()

        self.fps = 0

    def create_new_player(self) -> None:
        self.player = type(next_indicator.next_one)()
        if s.is_shade_enabled:
            shade.shade = type(self.player)()
            shade.update_pos(self.player)
        next_indicator.change()

    def draw(self) -> None:
        if self.to_draw:
            self.to_draw = False
            utils.window_manager.window.fill(s.color_scheme["Background"])
            if (
                self.state == GameState.PLAY
                or self.state == GameState.PAUSE
                or self.state == GameState.GAME_OVER
            ):
                if s.is_shade_enabled:
                    shade.draw()
                self.player.draw()
                self.border.draw()
                next_indicator.draw()
                well.draw()
                interface.draw(self.state)
                if s.grid_enabled:
                    self.grid.draw()
            elif self.state == GameState.MENU:
                self.menu.draw()
            elif self.state == GameState.START_MENU:
                self.start_menu.draw()
            pygame.display.update()

    def run(self) -> None:
        while self.running:
            start = time()
            controller.get_keys()

            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    self.running = False
                    continue

            self.update_action_depending_on_state[self.state]()

            self.draw()
            self.clock.tick(s.FPS_CAP)
            self.fps = int(1 / (time() - start))

    def update_menu_screen(self) -> None:
        status = self.menu.update()

        if status == 9:
            self.running = False
        elif status == 2:
            self.state = GameState.PLAY
            self.player.reset_timers()
            self.to_draw = True
        elif status:
            self.to_draw = True

    def update_game_over_screen(self) -> None:
        if controller.just_pressed["Start"] or controller.just_pressed["Pause"]:
            self.to_draw = True
            self.state = GameState.MENU
            reset_game()
            next_indicator.change()
            self.create_new_player()

    def update_play_screen(self) -> None:
        interface.update_fps(str(self.fps))
        if controller.just_pressed["Pause"]:
            self.to_draw = True
            self.state = GameState.PAUSE
        self.player.update()
        if self.player.moved:
            if s.is_shade_enabled:
                shade.update_pos(self.player)
            self.to_draw = True
        if self.player.landed:
            self.create_new_player()
            if self.is_game_over():
                self.state = GameState.GAME_OVER
                self.save_score()

    def update_pause_screen(self) -> None:
        if controller.just_pressed["Pause"]:
            self.to_draw = True
            self.state = GameState.PLAY

    def is_game_over(self) -> bool:
        for i in self.player.body:
            cell_x = i.position.x // s.CELL_SIZE
            cell_y = i.position.y // s.CELL_SIZE
            if well.cubes_in_well[cell_y][cell_x - 1]:
                return True
        return False

    def save_score(self):
        if stats.high_score.score_list.is_enough(stats.score.score):
            stats.high_score.score_list.add_score(
                stats.score.player_name, stats.score.score
            )
            self.menu.update_score()