This commit is contained in:
sShemet
2025-12-22 14:03:10 +05:00
commit ade2833df7
74 changed files with 42924 additions and 0 deletions

188
tet/pong.py Normal file
View File

@@ -0,0 +1,188 @@
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)