Files
UltraChat/tet/pong.py
sShemet ade2833df7 init
2025-12-22 14:03:10 +05:00

188 lines
6.3 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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)