Menu
CoddyTech

Подача

Урок 35 из 41 курса Создавайте игры с Pygame на Coddy.

После розыгрыша мяч должен ждать в центре, пока игрок не будет готов. Флаг указывает, ждёт ли он:

waiting = False

while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
            waiting = False
    # ракетки двигаются всегда
    if not waiting:
        # мяч движется, отскакивает и приносит очки; после набранного очка waiting = True

Ракетки находятся вне if, поэтому игроки могут подготовиться, пока мяч ждёт. Нажатие пробела срабатывает один раз при каждом нажатии, поэтому оно обрабатывается событием KEYDOWN.

Пока мяч ждёт, покажите внизу надпись Press Space to serve, расположенную по центру в точке (300, 360).

challenge icon

Задание

Средне

После каждого очка ждите подачи.

  1. Перед циклом установите waiting = False.
  2. Поместите перемещение мяча, отскоки и начисление очков под if not waiting: и устанавливайте waiting = True после каждого очка.
  3. Событие KEYDOWN при нажатии pygame.K_SPACE устанавливает waiting = False. Во время ожидания показывайте по центру в точке (300, 360) текст Press Space to serve.

Нажмите «Играть» и пропустите мяч: он ждёт посередине, пока не будет нажата клавиша Space. Затем нажмите «Проверить».

Попробуйте сами

import pygame

pygame.init()
screen = pygame.display.set_mode((600, 400))
pygame.display.set_caption("Pong")
clock = pygame.time.Clock()
font = pygame.font.Font(None, 36)

ball = pygame.Rect(293, 193, 14, 14)
vx, vy = 5, 4
left = pygame.Rect(20, 160, 12, 80)
right = pygame.Rect(568, 160, 12, 80)
left_score = 0
right_score = 0

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    keys = pygame.key.get_pressed()
    if keys[pygame.K_w]:
        left.y -= 6
    if keys[pygame.K_s]:
        left.y += 6
    if keys[pygame.K_UP]:
        right.y -= 6
    if keys[pygame.K_DOWN]:
        right.y += 6
    left.clamp_ip(screen.get_rect())
    right.clamp_ip(screen.get_rect())

    ball.x += vx
    ball.y += vy
    if ball.top <= 0 or ball.bottom >= 400:
        vy = -vy
    if ball.colliderect(left):
        vx = abs(vx)
    if ball.colliderect(right):
        vx = -abs(vx)
    if ball.left > 600:
        left_score += 1
        ball.center = (300, 200)
        vx = -vx
    if ball.right < 0:
        right_score += 1
        ball.center = (300, 200)
        vx = -vx

    screen.fill((30, 30, 46))
    pygame.draw.rect(screen, (80, 160, 255), left)
    pygame.draw.rect(screen, (235, 80, 80), right)
    pygame.draw.rect(screen, (255, 196, 0), ball)
    score = font.render(f"{left_score} : {right_score}", True, (240, 240, 240))
    screen.blit(score, score.get_rect(center=(300, 30)))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

Все уроки раздела Создавайте игры с Pygame

Потренируйтесь самостоятельно: Песочница Pygame