import pygame import sys import random import math # Инициализация Pygame pygame.init() # Константы WIDTH, HEIGHT = 1920, 1080 PADDLE_WIDTH, PADDLE_HEIGHT = 30, 200 BALL_SIZE = 30 WHITE = (255, 255, 255) BLACK = (0, 0, 0) GREEN = (50, 168, 82) LIGHT_GREEN = (100, 200, 100) FPS = 120 # Увеличили FPS для плавности на высоких скоростях # Создание окна screen = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption("Pong - ХЕРАЧЬ Edition v2.0") clock = pygame.time.Clock() # Загрузка шрифтов try: pixel_font = pygame.font.Font("PressStart2P-Regular.ttf", 120) except: pixel_font = pygame.font.SysFont('arial', 120) # Игровые объекты player_paddle = pygame.Rect(100, HEIGHT // 2 - PADDLE_HEIGHT // 2, PADDLE_WIDTH, PADDLE_HEIGHT) ai_paddle = pygame.Rect(WIDTH - 100 - PADDLE_WIDTH, HEIGHT // 2 - PADDLE_HEIGHT // 2, PADDLE_WIDTH, PADDLE_HEIGHT) ball = pygame.Rect(WIDTH // 2 - BALL_SIZE // 2, HEIGHT // 2 - BALL_SIZE // 2, BALL_SIZE, BALL_SIZE) # Физика мяча base_speed = 3 max_speed = 35 # Увеличили максимальную скорость speed_increase = 0.7 # Увеличили ускорение после удара ball_speed = base_speed ball_dx = ball_speed * random.choice((1, -1)) ball_dy = ball_speed * random.choice((1, -1)) # Скорости player_speed = 0 ai_speed = 0 # Счет player_score = 0 ai_score = 0 font = pygame.font.Font(None, 72) def draw_field(): """Рисует поле с разметкой""" screen.fill(GREEN) # Полупрозрачная надпись text_surface = pixel_font.render("ХЕРАЧЬ!", True, LIGHT_GREEN) text_surface.set_alpha(30) screen.blit(text_surface, (WIDTH//2 - text_surface.get_width()//2, HEIGHT//2 - text_surface.get_height()//2)) # Разметка for y in range(0, HEIGHT, 40): pygame.draw.rect(screen, WHITE, (WIDTH // 2 - 5, y, 10, 20)) pygame.draw.rect(screen, WHITE, (0, 0, WIDTH, HEIGHT), 10) def reset_ball(): """Сбрасывает мяч в центр""" global ball_speed, ball_dx, ball_dy ball.center = (WIDTH // 2, HEIGHT // 2) ball_speed = base_speed angle = math.radians(random.uniform(30, 60)) direction = random.choice((-1, 1)) ball_dx = direction * ball_speed * math.cos(angle) ball_dy = ball_speed * math.sin(angle) * random.choice((-1, 1)) def handle_collision(): """Обрабатывает все столкновения""" global ball_dx, ball_dy, ball_speed # Жесткие границы (мяч не может вылететь) if ball.top < 0: ball.top = 0 ball_dy = abs(ball_dy) * 0.95 # Небольшая потеря энергии if ball.bottom > HEIGHT: ball.bottom = HEIGHT ball_dy = -abs(ball_dy) * 0.95 # Обработка ударов о ракетки с более сильным ускорением if ball.colliderect(player_paddle) and ball_dx < 0: # Сильное ускорение + случайный угол relative_intersect = (player_paddle.centery - ball.centery) / (PADDLE_HEIGHT / 2) ball_dx = abs(ball_dx) * 1.25 # Увеличили ускорение ball_dy = -relative_intersect * ball_speed * 2 # Добавляем случайности ball_dx += random.uniform(-0.5, 0.5) ball_dy += random.uniform(-1, 1) elif ball.colliderect(ai_paddle) and ball_dx > 0: relative_intersect = (ai_paddle.centery - ball.centery) / (PADDLE_HEIGHT / 2) ball_dx = -abs(ball_dx) * 1.25 ball_dy = -relative_intersect * ball_speed * 2 ball_dx += random.uniform(-0.5, 0.5) ball_dy += random.uniform(-1, 1) # Нормализация скорости speed = math.sqrt(ball_dx**2 + ball_dy**2) if speed > max_speed: ball_dx = (ball_dx / speed) * max_speed ball_dy = (ball_dy / speed) * max_speed ball_speed = speed def ai_movement(): """Упрощенный ИИ с ошибками""" global ai_speed # Простое следование за мячом с задержкой и ошибками target_y = ball.centery + random.uniform(-50, 50) # Добавляем ошибку # Замедляем ИИ на высоких скоростях reaction_speed = max(3, 8 - ball_speed * 0.2) if ai_paddle.centery < target_y: ai_speed = min(reaction_speed, target_y - ai_paddle.centery) else: ai_speed = max(-reaction_speed, target_y - ai_paddle.centery) ai_paddle.y += ai_speed # Границы if ai_paddle.top < 0: ai_paddle.top = 0 if ai_paddle.bottom > HEIGHT: ai_paddle.bottom = HEIGHT # Основной цикл while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() if event.type == pygame.KEYDOWN: if event.key == pygame.K_DOWN: player_speed = 15 if event.key == pygame.K_UP: player_speed = -15 if event.key == pygame.K_ESCAPE: pygame.quit() sys.exit() if event.type == pygame.KEYUP: if event.key == pygame.K_DOWN or event.key == pygame.K_UP: player_speed = 0 # Движение player_paddle.y += player_speed if player_paddle.top < 0: player_paddle.top = 0 if player_paddle.bottom > HEIGHT: player_paddle.bottom = HEIGHT ai_movement() # Физика мяча ball.x += ball_dx ball.y += ball_dy handle_collision() # Голы if ball.left <= 0: ai_score += 1 reset_ball() if ball.right >= WIDTH: player_score += 1 base_speed = min(15, base_speed + speed_increase) reset_ball() # Отрисовка draw_field() pygame.draw.rect(screen, WHITE, player_paddle, border_radius=10) pygame.draw.rect(screen, WHITE, ai_paddle, border_radius=10) pygame.draw.ellipse(screen, WHITE, ball) # Счет screen.blit(font.render(f"{player_score}", True, WHITE), (WIDTH//4, 50)) screen.blit(font.render(f"{ai_score}", True, WHITE), (3*WIDTH//4 - 50, 50)) pygame.display.flip() clock.tick(FPS)