import os import time import random import msvcrt # Размер поля WIDTH = 40 HEIGHT = 20 # Параметры игры paddle_height = 3 ball_speed_x = 1 ball_speed_y = 1 # Позиции игроков player1_y = HEIGHT // 2 - paddle_height // 2 # Левый игрок player2_y = HEIGHT // 2 - paddle_height // 2 # Правый игрок # Мяч ball_x = WIDTH // 2 ball_y = HEIGHT // 2 # Счет score1 = 0 score2 = 0 def draw(): # НЕ очищаем экран вообще! # Перемещаем курсор в начало print("\033[H", end="", flush=True) # Рисуем верхнюю рамку print("+" + "-" * WIDTH + "+") # Рисуем игровое поле for y in range(HEIGHT): print("|", end="") for x in range(WIDTH): # Ракетка игрока 1 (левая) if x == 1 and player1_y <= y < player1_y + paddle_height: print("|", end="") # Ракетка игрока 2 (правая) elif x == WIDTH - 2 and player2_y <= y < player2_y + paddle_height: print("|", end="") # Мяч elif x == ball_x and y == ball_y: print("O", end="") # Центральная линия elif x == WIDTH // 2: print(":", end="") else: print(" ", end="") print("|") # Рисуем нижнюю рамку print("+" + "-" * WIDTH + "+") print("Игрок 1:", score1, "| Игрок 2:", score2) print("Управление: Игрок 1 - W/S, Игрок 2 - ↑/↓") def move_paddles(): global player1_y, player2_y # Обработка ввода if msvcrt.kbhit(): key = msvcrt.getch() # Игрок 1 (W/S) if key == b'w' and player1_y > 0: player1_y -= 1 elif key == b's' and player1_y < HEIGHT - paddle_height: player1_y += 1 # Игрок 2 (стрелочки) elif key == b'H' and player2_y > 0: # Стрелка вверх player2_y -= 1 elif key == b'P' and player2_y < HEIGHT - paddle_height: # Стрелка вниз player2_y += 1 def move_ball(): global ball_x, ball_y, ball_speed_x, ball_speed_y, score1, score2 # Двигаем мяч ball_x += ball_speed_x ball_y += ball_speed_y # Отскок от верхней и нижней стенки if ball_y <= 0 or ball_y >= HEIGHT - 1: ball_speed_y = -ball_speed_y # Проверка столкновения с ракетками if ball_x == 1: # Ракетка игрока 1 if player1_y <= ball_y < player1_y + paddle_height: ball_speed_x = -ball_speed_x # Добавляем случайность к отскоку ball_speed_y += random.choice([-1, 0, 1]) else: # Гол игроку 2 score2 += 1 reset_ball() elif ball_x == WIDTH - 2: # Ракетка игрока 2 if player2_y <= ball_y < player2_y + paddle_height: ball_speed_x = -ball_speed_x # Добавляем случайность к отскоку ball_speed_y += random.choice([-1, 0, 1]) else: # Гол игроку 1 score1 += 1 reset_ball() # Ограничиваем скорость мяча if ball_speed_y > 2: ball_speed_y = 2 elif ball_speed_y < -2: ball_speed_y = -2 def reset_ball(): global ball_x, ball_y, ball_speed_x, ball_speed_y ball_x = WIDTH // 2 ball_y = HEIGHT // 2 ball_speed_x = random.choice([-1, 1]) ball_speed_y = random.choice([-1, 0, 1]) # Инициализация - рисуем поле один раз print("\033[2J", end="", flush=True) # Очищаем только в начале draw() while True: # Перемещаем курсор в начало и перерисовываем print("\033[H", end="", flush=True) draw() time.sleep(0.1) move_paddles() move_ball() # Проверка на победу (до 10 очков) if score1 >= 10: print(" Игрок 1 победил!") break elif score2 >= 10: print(" Игрок 2 победил!") break