Сохрани это код как контекст:

"
import pygame
import random
import time
import math

# Инициализация Pygame
pygame.init()

# Константы
WIDTH, HEIGHT = 380, 600
FPS = 60

# Цвета
GREEN = (0, 100, 0)  # Темно-зеленый для клеток
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
BLUE = (0, 0, 255)
GRAY = (128, 128, 128)
YELLOW = (255, 255, 0)  # Цвет для времени
RED = (255, 0, 0)  # Цвет для очков при взрыве
ORANGE = (255, 165, 0)  # Цвет для эффекта +1

# Настройки игры
GAME_DURATION = 30
FREEZE_TIME = 4
CELL_SIZE = 40  # Размер клеток

# Классы для элементов
class FallingObject:
    def __init__(self, shape, color, size, score_value, is_bomb=False):
        self.shape = shape  # Тип объекта: "snowflake", "crystal", или "bomb"
        self.color = color
        self.size = size  # Размер объекта
        self.score_value = score_value
        self.is_bomb = is_bomb
        self.x = random.randint(0 + size, WIDTH - size)  # Не выходить за пределы экрана
        self.y = 0

    def fall(self, speed):
        self.y += speed

    def draw(self, surface):
        if self.shape == "snowflake":
            self.draw_snowflake(surface)
        elif self.shape == "crystal":
            self.draw_crystal(surface)
        elif self.shape == "bomb":
            self.draw_bomb(surface)

    def draw_snowflake(self, surface):
        center = (self.x, self.y)
        for i in range(6):
            angle = i * (360 / 6)  # Разделение на 6 частей
            x_offset = self.size * 0.5 * math.cos(math.radians(angle))
            y_offset = self.size * 0.5 * math.sin(math.radians(angle))

            # Основные лучи снежинки
            pygame.draw.line(surface, WHITE, center, (center[0] + x_offset, center[1] + y_offset), 2)

            # Маленькие ответвления
            pygame.draw.line(surface, WHITE,
                             (center[0] + x_offset, center[1] + y_offset),
                             (center[0] + x_offset * 0.5, center[1] + y_offset * 0.5), 1)

    def draw_crystal(self, surface):
        points = [
            (self.x, self.y),
            (self.x + self.size // 2, self.y - self.size // 1.5),
            (self.x + self.size, self.y),
            (self.x + self.size // 1.5, self.y + self.size // 2),
            (self.x + self.size // 2, self.y + self.size),
            (self.x, self.y)
        ]
        pygame.draw.polygon(surface, self.color, points)
        pygame.draw.polygon(surface, WHITE, points, 2)  # Белая обводка для кристаллов

    def draw_bomb(self, surface):
        pygame.draw.circle(surface, GRAY, (self.x, self.y), self.size // 3)  # Уменьшаем размер бомбы
        # Рисуем фитиль
        pygame.draw.line(surface, WHITE, (self.x, self.y - self.size // 3), (self.x, self.y - self.size // 3 - 10), 2)
        pygame.draw.circle(surface, YELLOW, (self.x, self.y - self.size // 3 - 10), 5)  # Фитиль

class Button:
    def __init__(self, text, x, y, width, height, font_size=30):
        self.rect = pygame.Rect(x, y, width, height)
        self.text = text
        self.font = pygame.font.Font(None, font_size)

    def draw(self, surface):
        pygame.draw.rect(surface, WHITE, self.rect)  # Рисуем кнопку
        text_surface = self.font.render(self.text, True, BLACK)
        text_rect = text_surface.get_rect(center=self.rect.center)
        surface.blit(text_surface, text_rect)

    def is_hovered(self, pos):
        return self.rect.collidepoint(pos)

def display_message(screen, message, size, color, y_offset=0):
    font = pygame.font.Font(None, size)
    text_surface = font.render(message, True, color)
    text_rect = text_surface.get_rect(center=(WIDTH // 2, HEIGHT // 2 + y_offset))
    screen.blit(text_surface, text_rect)

def draw_grid(screen):
    """Рисует сетку на фоне."""
    for x in range(0, WIDTH, CELL_SIZE):
        pygame.draw.line(screen, GREEN, (x, 0), (x, HEIGHT))
    for y in range(0, HEIGHT, CELL_SIZE):
        pygame.draw.line(screen, GREEN, (0, y), (WIDTH, y))

def game_over_screen(screen, score):
    screen.fill(BLACK)
    display_message(screen, "Game Over!", 48, WHITE, -30)
    display_message(screen, f"Score: {score}", 36, WHITE, 0)
    pygame.display.flip()

def main_menu(screen):
    screen.fill(BLACK)
    display_message(screen, "Drop Game", 36, WHITE, -50)  # Название игры
    start_button = Button("Start Game", 90, HEIGHT - 150, 200, 50)
    start_button.draw(screen)
    pygame.display.flip()

    # Ожидание нажатия кнопки старта
    waiting = True
    while waiting:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                return
            if event.type == pygame.MOUSEBUTTONDOWN:
                if event.button == 1:  # ЛКМ нажата
                    if start_button.is_hovered(event.pos):
                        waiting = False

def main():
    screen = pygame.display.set_mode((WIDTH, HEIGHT))
    pygame.display.set_caption("Clicker Game")
    clock = pygame.time.Clock()

    while True:  # Основной цикл игры
        score = 0
        freeze_mode = False
        start_time = time.time()
        falling_objects = []
        explosion_start_time = None  # Инициализация переменной для времени взрыва
        pickup_start_time = None  # Инициализация переменной для времени подбора
        pickup_text = ""  # Текст подбора

        elapsed_time = 0

        # Основной игровой цикл
        running = True
        while running:
            screen.fill(BLACK)
            draw_grid(screen)  # Рисуем сетку на фоне

            if not freeze_mode:
                elapsed_time = time.time() - start_time
                if elapsed_time >= GAME_DURATION:
                    running = False

            remaining_time = GAME_DURATION - int(elapsed_time)
            minutes = remaining_time // 60
            seconds = remaining_time % 60
            time_text = f"{minutes:02}:{seconds:02}"
            score_text = f"{score}"

            font = pygame.font.Font(None, 36)

            # Рисуем рамку для времени
            frame_rect = pygame.Rect(5, 5, 110, 35)  # Уменьшаем размер рамки
            pygame.draw.rect(screen, YELLOW, frame_rect, 2, border_radius=10)  # Закругленные края

            # Отображение времени
            time_surface = font.render(time_text, True, YELLOW)  # Время в желтом
            text_rect = time_surface.get_rect(center=frame_rect.center)
            screen.blit(time_surface, text_rect)

            # Отображение очков симметрично
            score_surface = font.render(str(score), True, WHITE)
            score_rect = score_surface.get_rect(center=(frame_rect.centerx, frame_rect.bottom + 10))  # Центрируем текст очков
            screen.blit(score_surface, score_rect)

            # Генерация падающих объектов
            if not freeze_mode and random.random() < 0.06:  # 6% шанс на создание объекта
                size = random.choice([15, 20])  # Уменьшенные размеры для объектов
                if random.random() < 0.01:  # 1% шанс на бомбу
                    falling_objects.append(FallingObject("bomb", GRAY, size, -1, is_bomb=True))
                elif random.random() < 0.1:  # 10% шанс на кристалл
                    falling_objects.append(FallingObject("crystal", BLUE, size, 0))
                else:  # Снежинки
                    falling_objects.append(FallingObject("snowflake", WHITE, size, 1))

            # Обработка событий
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.quit()
                    return

                if event.type == pygame.MOUSEBUTTONDOWN:
                    if event.button == 1:  # ЛКМ нажата
                        for obj in falling_objects[:]:
                            mouse_x, mouse_y = event.pos
                            # Проверка нажатия на объект с более точной областью клика
                            if obj.x - obj.size < mouse_x < obj.x + obj.size and obj.y - obj.size < mouse_y < obj.y + obj.size:
                                if obj.is_bomb:
                                    explosion_start_time = time.time()  # Записываем время взрыва
                                    score = 0  # Сбросить очки до 0
                                elif obj.color == BLUE:
                                    freeze_mode = True
                                    freeze_start_time = time.time()  # Старт заморозки
                                else:
                                    score += obj.score_value  # Прибавляем очки с снежинок
                                    pickup_start_time = time.time()  # Запись времени подбора
                                    pickup_text = "+1"  # Установка текста подбора
                                falling_objects.remove(obj)

            # Обновление состояния игры
            if freeze_mode:
                # Если заморожено, время не истекает
                if time.time() - freeze_start_time >= FREEZE_TIME:
                    freeze_mode = False  # Выход из режима заморозки
            else:
                for obj in falling_objects:
                    speed = random.uniform(3, 5)
                    obj.fall(speed)
                    if obj.y > HEIGHT + obj.size:  # Если объект выходит за пределы экрана
                        falling_objects.remove(obj)

            # Эффект взрыва
            if explosion_start_time and time.time() - explosion_start_time < 1:  # Взрыв длится 1 секунду
                shake_data = [(random.randint(-3, 3), random.randint(-3, 3)) for _ in range(20)]  # Небольшие смещения
                for dx, dy in shake_data:
                    screen.fill((0, 0, 0, 0))  # Заполнение черным
                    draw_grid(screen)  # Рисуем сетку сразу при взрыве
                    for obj in falling_objects:
                        obj.x += dx
                        obj.y += dy
                        obj.draw(screen)
                    
                # Отображаем нормальные очки
                score_surface = font.render(str(score), True, RED)  # Очки красные при взрыве
            else:
                # Нормальное отображение объектов
                for obj in falling_objects:
                    obj.draw(screen)

            # Эффект подбора снежинок
            if pickup_start_time and time.time() - pickup_start_time < 0.5:  # Эффект на 0.5 секунды
                pickup_surface = font.render(pickup_text, True, ORANGE)
                pickup_rect = pickup_surface.get_rect(center=(mouse_x, mouse_y - 5))  # Новый текст над снежинкой
                pickup_rect.y -= 5 * (time.time() - pickup_start_time) / 0.5  # Поднимаем текст
                screen.blit(pickup_surface, pickup_rect)

            pygame.display.flip()
            clock.tick(FPS)

        # Окно окончания игры
        game_over_screen(screen, score)

        # Кнопка для перезапуска игры
        restart_button = Button("Restart Game", 90, HEIGHT - 150, 200, 50)
        restart_button.draw(screen)
        pygame.display.flip()

        # Ожидание нажатия кнопки для перезапуска
        waiting = True
        while waiting:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.quit()
                    return
                if event.type == pygame.MOUSEBUTTONDOWN:
                    if event.button == 1:  # ЛКМ нажата
                        if restart_button.is_hovered(event.pos):
                            waiting = False
                            break  # Сразу начинаем новую игру

if __name__ == "__main__":
    main_menu(pygame.display.set_mode((WIDTH, HEIGHT)))  # Показ начального экрана перед запуском игры
    main()
"