Pygame_Project/кркркр.py

676 lines
28 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import pygame
import random
import math
from main import current_time
# Определение констант
SCREEN_WIDTH = 1920
SCREEN_HEIGHT = 1080
PLAYER_WIDTH = 90
PLAYER_HEIGHT = 135
LOH_WIDTH = 150
LOH_HEIGHT = 100
BULLET_SIZE = 20
FPS = 60
BULLET_SPEED = 6
TANK_SPEED = 2
BOT_SPEED = 1
FIRE_DELAY = 1000 # Задержка между выстрелами в миллисекундах
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
score = 0
# Инициализация Pygame
pygame.init()
# Создание игрового окна
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT), flags=pygame.FULLSCREEN)
pygame.display.set_caption("Танчики")
player_dead = False # Флаг для отслеживания состояния игрока после смерти
dead_time = 0 # Время смерти игрока
# Загрузка и воспроизведение музыки
pygame.mixer.music.load('music.mp3')
pygame.mixer.music.play(-1) # Параметр -1 означает зацикливание музыки
shot_sound = pygame.mixer.Sound('shot.wav')
meme_sound = pygame.mixer.Sound("meme_sound.wav")
explosion_sound = pygame.mixer.Sound("explosion_sound.wav")
stoneexplosion_sound = pygame.mixer.Sound("stoneexplosion_sound.wav")
# Загрузка изображений
background_image = pygame.transform.scale(pygame.image.load("travka_pol.jpeg"), (960, 540))
stena = pygame.transform.scale(pygame.image.load("stena.jpeg").convert(), (100, 100))
stenki = pygame.transform.scale(pygame.image.load("stena.jpeg").convert(), (200, 200))
tank_image = pygame.transform.scale(pygame.image.load("ntank-removebg-preview.png"), (PLAYER_WIDTH, PLAYER_HEIGHT))
loh_image = pygame.transform.scale(pygame.image.load("loh.png"), (LOH_WIDTH, LOH_HEIGHT))
bullet_image = pygame.transform.scale(pygame.image.load("bullet.png"), (BULLET_SIZE, BULLET_SIZE))
explosion_images = [pygame.image.load(f"explosion_{i}.png") for i in range(1, 48)]
stoneexplosion_images = [pygame.image.load(f"stoneexplosion_{i}.png") for i in range(1, 6)]
menu_background = pygame.transform.scale(pygame.image.load("menu_background.jpg"), (SCREEN_WIDTH, SCREEN_HEIGHT))
cursor = pygame.image.load("cursor.png")
pygame.mouse.set_visible(False)
cursor_offset_x = cursor.get_width() // 2
cursor_offset_y = cursor.get_height() // 2
paused_menu_active = False
class Explosion(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.image = explosion_images[0]
self.rect = self.image.get_rect(center=(x, y))
self.frame = 0
self.last_update = pygame.time.get_ticks()
self.frame_rate = 50
def update(self):
now = pygame.time.get_ticks()
if now - self.last_update > self.frame_rate:
self.last_update = now
self.frame += 1
if self.frame == 6:
self.kill()
else:
center = self.rect.center
self.image = explosion_images[self.frame]
self.rect = self.image.get_rect()
self.rect.center = center
# Добавление класса для анимации удара о каменную стену
class StoneExplosion(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.images = stoneexplosion_images
self.image = self.images[0]
self.rect = self.image.get_rect(center=(x, y))
self.frame = 0
self.last_update = pygame.time.get_ticks()
self.frame_rate = 50
stoneexplosion_sound.play() # Воспроизведение звука удара о стену
def update(self):
now = pygame.time.get_ticks()
if now - self.last_update > self.frame_rate:
self.last_update = now
self.frame += 1
if self.frame == len(self.images):
self.kill()
else:
center = self.rect.center
self.image = self.images[self.frame]
self.rect = self.image.get_rect()
self.rect.center = center
def update(self):
now = pygame.time.get_ticks()
if now - self.last_update > self.frame_rate:
self.last_update = now
self.frame += 1
if self.frame == len(self.images):
self.kill()
else:
center = self.rect.center
self.image = self.images[self.frame]
self.rect = self.image.get_rect()
self.rect.center = center
# Определение класса танка
class Tank(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.original_image = tank_image
self.image = self.original_image
self.rect = self.image.get_rect(center=(x, y))
self.angle = -90 # Поворот на 90 градусов против часовой стрелки
self.TANK_SPEED = 2
self.last_fire_time = pygame.time.get_ticks() # Время последнего выстрела
self.boosted = False # Флаг, показывающий, активирован ли ускоритель
self.boost_multiplier = 2 # Множитель скорости ускорения
def update(self):
keys = pygame.key.get_pressed()
if keys[pygame.K_w]:
self.move_forward()
mouse_pos = pygame.mouse.get_pos()
self.angle = math.degrees(math.atan2(mouse_pos[1] - self.rect.centery, mouse_pos[0] - self.rect.centerx)) + 90
self.image = pygame.transform.rotate(self.original_image, -self.angle)
self.rect = self.image.get_rect(center=self.rect.center)
if keys[pygame.K_x]:
if not self.boosted:
self.TANK_SPEED *= self.boost_multiplier
self.boosted = True
else:
if self.boosted:
self.TANK_SPEED /= self.boost_multiplier
self.boosted = False
# Проверка столкновения игрока с танками
tank_hit = pygame.sprite.spritecollideany(self, tanks)
if tank_hit and isinstance(tank_hit, Bot):
self.player_die() # Вызов метода обработки смерти игрока
def move_forward(self):
angle_rad = math.radians(self.angle + 270)
self.rect.x += self.TANK_SPEED * math.cos(angle_rad)
self.rect.y += self.TANK_SPEED * math.sin(angle_rad)
def player_die():
global game_over # Если game_over объявлено как глобальная переменная в вашем коде
game_over = True
screen.fill(BLACK)
# Отображение текста "Game Over" по центру экрана
font = pygame.font.Font(None, 36)
text_surface = font.render("Game Over", True, WHITE)
text_rect = text_surface.get_rect(center=(SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2))
screen.blit(text_surface, text_rect)
# Обновление экрана
pygame.display.flip()
# Подождать 3 секунды
pygame.time.delay(3000)
def shoot(self):
current_time = pygame.time.get_ticks()
if current_time - self.last_fire_time > FIRE_DELAY: # Проверка задержки между выстрелами
shot_sound.play() # Воспроизведение звука выстрела
# Коррекция угла вылета пули, чтобы она вылетала из дула танка
offset_angle = -90 # Угол смещения для вылета пули из дула
corrected_angle = self.angle + offset_angle
# Вычисляем координаты дула танка
offset_x = 70 * math.cos(math.radians(corrected_angle))
offset_y = 70 * math.sin(math.radians(corrected_angle))
bullet = PlayerBullet(self.rect.centerx + offset_x, self.rect.centery + offset_y, self.angle + 270)
all_sprites.add(bullet)
bullets.add(bullet)
self.last_fire_time = current_time # Обновление времени последнего выстрела
# Проверяем столкновение пули с каменными стенами
if pygame.sprite.spritecollideany(bullet, walls):
stoneexplosion_sound.play() # Воспроизведение звука столкновения с каменной стеной
explosion = StoneExplosion(bullet.rect.centerx, bullet.rect.centery) # Создание анимации удара о стену
all_sprites.add(explosion) # Добавление анимации удара о стену в группу спрайтов
bullet.kill() # Удаление пули
class PlayerBullet(pygame.sprite.Sprite):
def __init__(self, x, y, angle):
super().__init__()
self.original_image = bullet_image
self.image = self.original_image
self.rect = self.image.get_rect(center=(x, y))
self.angle = angle
def update(self):
self.rect.x += BULLET_SPEED * math.cos(math.radians(self.angle))
self.rect.y += BULLET_SPEED * math.sin(math.radians(self.angle))
if not screen.get_rect().colliderect(self.rect):
self.kill()
if pygame.sprite.spritecollideany(self, walls):
self.kill() # Удаляем снаряд, если он столкнулся со стеной
# Определение класса снаряда бота
class BotBullet(pygame.sprite.Sprite):
def __init__(self, x, y, angle):
super().__init__()
self.original_image = bullet_image
self.image = self.original_image
self.rect = self.image.get_rect(center=(x, y))
self.angle = angle
def update(self):
self.rect.x += BULLET_SPEED * math.cos(math.radians(self.angle))
self.rect.y += BULLET_SPEED * math.sin(math.radians(self.angle))
if not screen.get_rect().colliderect(self.rect):
self.kill()
if pygame.sprite.spritecollideany(self, walls):
self.kill() # Удаляем снаряд, если он столкнулся со стеной
# Определение класса для бота
class Bot(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.original_image = loh_image
self.image = self.original_image
self.rect = self.image.get_rect(center=(x, y))
self.angle = 0 # Угол поворота бота
self.speed = BOT_SPEED # Скорость бота
def update(self):
# Находим координаты игрока
player_x, player_y = player.rect.center
# Вычисляем угол к игроку
dx = player_x - self.rect.centerx
dy = player_y - self.rect.centery
self.angle = math.degrees(math.atan2(dy, dx)) + 90
# Поворачиваем изображение бота
self.image = pygame.transform.rotate(self.original_image, -self.angle)
self.rect = self.image.get_rect(center=self.rect.center)
# Двигаем бота в направлении игрока
angle_rad = math.radians(self.angle + 270)
self.rect.x += self.speed * math.cos(angle_rad)
self.rect.y += self.speed * math.sin(angle_rad)
# Проверяем, не выходит ли бот за границы экрана
self.check_bounds()
# Проверяем столкновения с другими ботами
self.check_bot_collisions()
# Проверяем столкновение с игроком
if pygame.sprite.spritecollideany(self, [player]):
player.player_die() # Вызов метода обработки смерти игрока
def check_bounds(self):
# Проверка выхода за границы экрана
if self.rect.left < 0:
self.rect.left = 0
elif self.rect.right > SCREEN_WIDTH:
self.rect.right = SCREEN_WIDTH
if self.rect.top < 0:
self.rect.top = 0
elif self.rect.bottom > SCREEN_HEIGHT:
self.rect.bottom = SCREEN_HEIGHT
def check_bot_collisions(self):
# Проверяем столкновения с другими ботами
for bot in tanks:
if bot != self:
# Проверяем расстояние между ботами
distance = math.sqrt(
(self.rect.centerx - bot.rect.centerx) ** 2 + (self.rect.centery - bot.rect.centery) ** 2)
min_distance = 100 # Минимальное допустимое расстояние между ботами
if distance < min_distance:
# Если боты слишком близко, переместим текущий бот подальше от другого бота
dx = self.rect.centerx - bot.rect.centerx
dy = self.rect.centery - bot.rect.centery
self.rect.x += dx / distance * min_distance / 2
self.rect.y += dy / distance * min_distance / 2
class Wall(pygame.sprite.Sprite):
def __init__(self, x, y, image):
super().__init__()
self.image = image
self.rect = self.image.get_rect(topleft=(x, y))
# Создание групп спрайтов
all_sprites = pygame.sprite.Group()
tanks = pygame.sprite.Group()
bullets = pygame.sprite.Group()
walls = pygame.sprite.Group() # Группа для всех стен
# Создание стен
wall_positions = [
(360, 40), (460, 730), (460, 830), (460, 930),
(960, 40), (960, 140), (960, 240),
(660, 240),
(960, 440), (960, 540), (960, 640), (960, 740),
(1260, 740), (1360, 740), (1460, 740), (1560, 740), (1660, 740),
(360, 240), (360, 340), (360, 440),
(0, 540), (60, 540), (260, 540), (360, 540), (460, 540),
(560, 540), (660, 540), (760, 540), (860, 540),
(1160, 240), (1260, 240), (1360, 240), (1460, 240), (1460, 340),
(1760, 340), (1860, 340)
]
for pos in wall_positions:
wall = Wall(*pos, stena)
all_sprites.add(wall)
walls.add(wall)
# Создание стен "stenki"
wall_stenki_positions = [
(-150, 0), (-150, 200), (-150, 400), (-150, 600), (-150, 800), (-150, 1000),
(0, -150), (200, -150), (400, -150), (600, -150), (800, -150), (1000, -150),
(1200, -150), (1400, -150), (1600, -150), (1800, -150), (1870, 0), (1870, 200),
(1870, 400), (1870, 600), (1870, 800), (1870, 1000), (0, 1030), (200, 1030),
(400, 1030), (600, 1030), (800, 1030), (1000, 1030), (1200, 1030), (1400, 1030),
(1600, 1030), (1800, 1030)
]
for pos in wall_stenki_positions:
wall_stenki = Wall(*pos, stenki)
all_sprites.add(wall_stenki)
walls.add(wall_stenki)
# Создание групп спрайтов
all_sprites = pygame.sprite.Group()
tanks = pygame.sprite.Group()
bullets = pygame.sprite.Group()
# Создание игрока
player = Tank(SCREEN_WIDTH // 8, SCREEN_HEIGHT // 7)
all_sprites.add(player)
tanks.add(player)
bot = Bot(3 * SCREEN_WIDTH // 4, SCREEN_HEIGHT // 2)
all_sprites.add(bot)
tanks.add(bot)
bot = Bot(3 * SCREEN_WIDTH // 4, SCREEN_HEIGHT // 2)
all_sprites.add(bot)
tanks.add(bot)
bot = Bot(3 * SCREEN_WIDTH // 4, SCREEN_HEIGHT // 2)
all_sprites.add(bot)
tanks.add(bot)
def draw_menu():
screen.blit(menu_background, (0, 0))
font = pygame.font.Font(None, 50)
# Рисуем кнопку "Старт"
start_text = font.render("Start", True, WHITE)
start_rect = start_text.get_rect(center=(SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2 - 100))
screen.blit(start_text, start_rect)
# Рисуем кнопку "Настройки"
settings_text = font.render("Settings", True, WHITE)
settings_rect = settings_text.get_rect(center=(SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2))
screen.blit(settings_text, settings_rect)
# Рисуем кнопку "Выйти"
quit_text = font.render("Quit", True, WHITE)
quit_rect = quit_text.get_rect(center=(SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2 + 100))
screen.blit(quit_text, quit_rect)
x, y = pygame.mouse.get_pos()
screen.blit(cursor, (x - cursor_offset_x, y - cursor_offset_y))
pygame.display.flip()
return start_rect, settings_rect, quit_rect
def respawn_bot():
# Создание нового экземпляра бота
new_bot = Bot(random.randint(0, SCREEN_WIDTH), random.randint(0, SCREEN_HEIGHT))
all_sprites.add(new_bot)
tanks.add(new_bot)
last_meme_time = 0
meme_delay = 2000 # Задержка в миллисекундах (2 секунды)
def draw_settings_menu():
settings_background = pygame.transform.scale(pygame.image.load("settings_background.jpg"), (SCREEN_WIDTH, SCREEN_HEIGHT))
screen.blit(settings_background, (0, 0))
font = pygame.font.Font(None, 50)
# Рисуем кнопку "Выйти" в правом верхнем углу
quit_text = font.render("Quit", True, WHITE)
quit_rect = quit_text.get_rect(topright=(SCREEN_WIDTH - 20, 20))
screen.blit(quit_text, quit_rect)
# Рисуем кнопку для управления музыкой
if pygame.mixer.music.get_busy():
music_text = font.render("Music On", True, WHITE)
else:
music_text = font.render("Music Off", True, WHITE)
music_rect = music_text.get_rect(center=(SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2 - 100))
screen.blit(music_text, music_rect)
x, y = pygame.mouse.get_pos()
screen.blit(cursor, (x - cursor_offset_x, y - cursor_offset_y))
pygame.display.flip()
return quit_rect, music_rect
# Главный цикл программы
menu_active = True
settings_active = False # Флаг, показывающий, активно ли меню настроек
while menu_active:
if not settings_active:
start_rect, settings_rect, quit_rect = draw_menu()
else:
quit_rect, music_rect = draw_settings_menu()
for event in pygame.event.get():
if event.type == pygame.MOUSEBUTTONDOWN:
if event.button == 1: # Левая кнопка мыши
if not settings_active:
if start_rect.collidepoint(event.pos):
menu_active = False # Нажата кнопка "Старт"
elif settings_rect.collidepoint(event.pos):
settings_active = True # Нажата кнопка "Настройки"
elif quit_rect.collidepoint(event.pos):
pygame.quit()
quit()
else:
if quit_rect.collidepoint(event.pos):
settings_active = False
elif music_rect.collidepoint(event.pos):
if pygame.mixer.music.get_busy():
pygame.mixer.music.stop() # Выключение музыки
else:
pygame.mixer.music.play(-1) # Включение музыки
# Основной игровой цикл
clock = pygame.time.Clock()
running = True
paused = False # Track pause state
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
# Обработка щелчка левой кнопкой мыши
if not paused:
player.shoot()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_k:
# Обработка нажатия клавиши 'k' для воспроизведения звука мема
if current_time - last_meme_time > meme_delay:
meme_sound.play()
last_meme_time = current_time
elif event.key == pygame.K_ESCAPE:
# Переключение состояния паузы при нажатии клавиши Escape
paused = not paused
elif event.key == pygame.K_SPACE:
# Возвращение в меню при нажатии клавиши пробел
menu_active = True
settings_active = False # Сброс флага settings_active при возвращении в меню
if menu_active: # If in menu, return to menu loop
while menu_active:
start_rect, settings_rect, quit_rect = draw_menu()
for event in pygame.event.get():
if event.type == pygame.MOUSEBUTTONDOWN:
if event.button == 1: # Левая кнопка мыши
if start_rect.collidepoint(event.pos):
menu_active = False # Нажата кнопка начала игры
elif settings_rect.collidepoint(event.pos):
settings_active = True # Нажата кнопка настроек
menu_active = False # Возврат в основной цикл меню
elif quit_rect.collidepoint(event.pos):
pygame.quit()
quit()
pygame.display.flip() # Update the display
clock.tick(FPS) #
# Handle events
if settings_active: # If in settings, return to settings loop
while settings_active:
quit_rect, music_rect = draw_settings_menu()
for event in pygame.event.get():
if event.type == pygame.MOUSEBUTTONDOWN:
if event.button == 1: # Left mouse button
if quit_rect.collidepoint(event.pos):
menu_active = True # Set menu_active to True to return to menu
settings_active = False # Quit button clicked
draw_menu() # Redraw the menu to prevent flickering
elif music_rect.collidepoint(event.pos):
if pygame.mixer.music.get_busy():
pygame.mixer.music.stop() # Turn off music
else:
pygame.mixer.music.play(-1) # Turn on music
pygame.display.flip() # Update the display
clock.tick(FPS) # Limit the frame rate
elif not paused: # If not in menu and not paused, update game state
# Update sprites
all_sprites.update()
# Проверка столкновений пуль с танками
for bullet in bullets:
if isinstance(bullet, PlayerBullet):
tank_hit = pygame.sprite.spritecollideany(bullet, tanks, pygame.sprite.collide_mask)
if tank_hit and isinstance(tank_hit, Bot):
explosion_sound.play() # Воспроизведение звука взрыва
explosion = Explosion(tank_hit.rect.centerx, tank_hit.rect.centery) # Создание взрыва
all_sprites.add(explosion) # Добавление взрыва в группу спрайтов
bullet.kill() # Удаляем пулю
tank_hit.kill() # Удаляем бота
respawn_bot() # Создаем нового бота
score += 1
elif isinstance(bullet, BotBullet):
# Проверяем столкновение пули бота с стенами
if pygame.sprite.spritecollideany(bullet, walls):
stoneexplosion_sound.play() # Воспроизведение звука взрыва камня
explosion = Explosion(bullet.rect.centerx, bullet.rect.centery) # Создание взрыва камня
all_sprites.add(explosion) # Добавление взрыва камня в группу спрайтов
bullet.kill() # Удаляем пулю бота
if player_dead:
# Отображаем текст "проиграл"
if pygame.time.get_ticks() - dead_time < 3000: # Отображаем текст в течение 3 секунд
font = pygame.font.Font(None, 36)
dead_text = font.render("Проиграл", True, RED)
dead_rect = dead_text.get_rect(center=(SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2))
screen.blit(dead_text, dead_rect)
pygame.display.flip() # Обновляем экран
else:
player_dead = False # Сбрасываем флаг после прошествия 3 секунд
running = False # Завершаем игру
# Отрисовка фона
for i in range(2):
for j in range(2):
screen.blit(background_image, (i * 960, j * 540))
all_sprites.draw(screen)
screen.blit(stena, (360, 40))
screen.blit(stena, (460, 730))
screen.blit(stena, (460, 830))
screen.blit(stena, (460, 930))
screen.blit(stena, (960, 40))
screen.blit(stena, (960, 140))
screen.blit(stena, (960, 240))
screen.blit(stena, (660, 240))
screen.blit(stena, (960, 440))
screen.blit(stena, (960, 540))
screen.blit(stena, (960, 640))
screen.blit(stena, (960, 740))
screen.blit(stena, (1260, 740))
screen.blit(stena, (1360, 740))
screen.blit(stena, (1460, 740))
screen.blit(stena, (1560, 740))
screen.blit(stena, (1660, 740))
screen.blit(stena, (360, 240))
screen.blit(stena, (360, 340))
screen.blit(stena, (360, 440))
screen.blit(stena, (0, 540))
screen.blit(stena, (60, 540))
screen.blit(stena, (260, 540))
screen.blit(stena, (360, 540))
screen.blit(stena, (460, 540))
screen.blit(stena, (560, 540))
screen.blit(stena, (660, 540))
screen.blit(stena, (760, 540))
screen.blit(stena, (860, 540))
screen.blit(stena, (1160, 240))
screen.blit(stena, (1260, 240))
screen.blit(stena, (1360, 240))
screen.blit(stena, (1460, 240))
screen.blit(stena, (1460, 340))
screen.blit(stena, (1760, 340))
screen.blit(stena, (1860, 340))
screen.blit(stenki, (-150, 0))
screen.blit(stenki, (-150, 200))
screen.blit(stenki, (-150, 400))
screen.blit(stenki, (-150, 600))
screen.blit(stenki, (-150, 800))
screen.blit(stenki, (-150, 1000))
screen.blit(stenki, (0, -150))
screen.blit(stenki, (200, -150))
screen.blit(stenki, (400, -150))
screen.blit(stenki, (600, -150))
screen.blit(stenki, (800, -150))
screen.blit(stenki, (1000, -150))
screen.blit(stenki, (1200, -150))
screen.blit(stenki, (1400, -150))
screen.blit(stenki, (1600, -150))
screen.blit(stenki, (1800, -150))
screen.blit(stenki, (1870, 0))
screen.blit(stenki, (1870, 200))
screen.blit(stenki, (1870, 400))
screen.blit(stenki, (1870, 600))
screen.blit(stenki, (1870, 800))
screen.blit(stenki, (1870, 1000))
screen.blit(stenki, (0, 1030))
screen.blit(stenki, (200, 1030))
screen.blit(stenki, (400, 1030))
screen.blit(stenki, (600, 1030))
screen.blit(stenki, (800, 1030))
screen.blit(stenki, (1000, 1030))
screen.blit(stenki, (1200, 1030))
screen.blit(stenki, (1400, 1030))
screen.blit(stenki, (1600, 1030))
screen.blit(stenki, (1800, 1030))
font = pygame.font.Font(None, 36)
score_text = font.render(f'Score: {score}', True, WHITE)
screen.blit(score_text, (10, 10))
score_rect = score_text.get_rect(topleft=(10, 10))
pygame.draw.rect(screen, (0, 255, 0), (
score_rect.topleft, (score_rect.width, score_rect.height))) # Draw a green rectangle behind the score
screen.blit(score_text, score_rect.topleft)
x, y = pygame.mouse.get_pos()
screen.blit(cursor, (x - cursor_offset_x, y - cursor_offset_y))
pygame.display.flip()
clock.tick(FPS)
# Завершение работы Pygame
pygame.quit()