Обработка столкновений

  1. Реализуйте игровую сцену, состоящую из движущейся цели и пушки, стреляющей снарядами.

"""
+-----------------------+
|   ||||||              | <- target
|                       |
|                       |
|           *           | <- bullet
|                       |
|                       |
|          /'\          | <- cannon
+-----------------------+
"""

import random
import sys

import pygame
from pygame.color import THECOLORS

pygame.init()

WIDTH = 640
HEIGHT = 480

screen = pygame.display.set_mode((WIDTH, HEIGHT))


class Cannon:
    def __init__(self):
        # TODO(1.1): создайте атрибуты пушки:
        #  * Цвет
        #  * Список точек
        #  Пусть пушка отображается как равнобедренный треугольник с высотой
        #  и основанием по 50px. Отображается в середине окна
        #  на нижней границе, см. схему в начале файла.
        ...

    def draw(self):
        # TODO(1.2): отобразите созданную в __init__ последовательность точек
        #  заданным цветом.
        ...


class Bullet:
    def __init__(self):
        # TODO(2.1): создайте атрибуты снаряда.
        #  * Центр окружности снаряда
        #  * Радиус
        #  * Цвет
        #  * Скорость (для тестов использовать значение 3)
        ...

    def draw(self):
        # TODO(2.2): отобразите снаряд.
        ...

    def move(self):
        # TODO(2.3): реализуйте перемещение снаряда.
        #  Для этого нужно создать его новый центр со смещением speed по оси OY
        #  к началу коориднат.
        ...


class Target:
    def __init__(self):
        # TODO(3.1): создайте атрибуты мишени.
        #  * Цвет
        #  * Скорость
        #  * Прямоугольник
        ...

    def draw(self):
        # TODO(3.2): отобразите мишень.
        ...

    def move(self):
        # TODO(3.3): реализуйте движение мишени.
        #  При достижении края окна мишень должна менять направление движения
        #  на противположное. Это можно реализовать сменой знака сокрости.
        ...


colors = list(THECOLORS.values())
def get_random_color():
    return random.choice(colors)


cannon = Cannon()
target = Target()
bullet = Bullet()

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

    screen.fill(THECOLORS['black'])

    target.move()
    bullet.move()

    # TODO(2.4): если снаряд достиг верхней границы окна, создать новый снаряд.

    # TODO(4.1): если мишень и снаряд пересеклись, сменить цвет мишени на
    #  случайный, создать новй снаряд.
    #  Для определения пересечения используйте метод прямоугольника:
    #    Rect.collidepoint(point)

    cannon.draw()
    target.draw()
    bullet.draw()

    pygame.display.flip()
    pygame.time.wait(33)
  1. Реализуйте простейший тир, в котором игрок должен кликать по цели.

import math
import random
import sys

import pygame
from pygame.color import THECOLORS

pygame.mixer.init(22050, -16, 2, 64)
pygame.init()

WIDTH = 640
HEIGHT = 480

screen = pygame.display.set_mode((WIDTH, HEIGHT))

color = THECOLORS['purple1']

circle_radius = 50


def distance(p1, p2):
    # TODO(3.3): Реализуйте функцию, которая вычисляет
    #  расстояние между точками p1 и p2.
    ...


def point_in_circle(p, circle_center, circle_radius):
    # TODO(3.2): Реализуйте функцию, которая возвращает True,
    #  если точка находится внутри круга.
    #  Для полноценной работы функции вам понадобится
    #  реализовать функцию distance, но написать определение
    #  принадлежности точки кругу вы можете уже сейчас.
    ...


def place_circle():
    # TODO(1.1): Функция должна вернуть кортеж, состоящий из
    #   координат центра круга: (x, y)
    ...

# TODO(1.2): инициализируйте центр круга
circle_center = ...

# TODO(5.1): Загрузите звук выстрела.
#  Воспользуйтесь конструктором
#  pygame.mixer.Sound(file_path: str) -> Sound
shot = ...

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

        # TODO(2.1): Обработайте событие нажатия кнопки мыши
        #  pygame.MOUSEBUTTONDOWN
        # TODO(2.2): При нажатии кнопки мыши смените цвет круга.
        # TODO(3.1): Доработайте приложение так, чтобы круг менял цвет только
        #  если вы кликаете по нему. Для этого вам понадобирся реализовать
        #  функции point_in_circle и distance.
        # TODO(4.1): доработайте приложение так, чтобы при
        #  клике по кругу он появлялся в случайной точке
        #  экрана.
        # TODO(5.2): Воспроизведите звук выстрела в случае попадания по кругу.
        #  Используйте метод play() объекта класса Sound.
        # TODO(6.1): Реализуйте подсчет очков. Если игрок попал в круг за
        #  секунду, то он получает 100 очков. За 2 секунды - 50. Дольше - 1.
        ...

    screen.fill(THECOLORS['black'])

    # TODO(1.3) Нарисуйте круг выбранного цвета.
    ...

    pygame.display.flip()
    pygame.time.wait(33)
  1. Реализуйте движущийся шар, отскакивающий от стен.

import math
import sys

import pygame
from pygame.color import THECOLORS

pygame.init()

WIDTH = 1280
HEIGHT = 800

screen = pygame.display.set_mode((WIDTH, HEIGHT))

circle_center = (WIDTH // 2, HEIGHT // 2)
circle_radius = 50
circle_color = THECOLORS['purple2']

SPEED = 20

current_angle = -10


def get_move(angle):
    angle = angle / 180. * math.pi
    return (
        int(SPEED * math.cos(angle)),
        int(SPEED * math.sin(angle)))


def move_circle(center, move):
    # TODO(1): функция возвращает новый центр окружности после смещения.
    ...


def get_angle(center):
    # TODO(2): Функция принимает текущий центр круга и определяет,
    #  под каким углом он должен продолжать движение.
    ...

move = get_move(current_angle)

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

    screen.fill(THECOLORS['black'])

    # TODO(3):
    #  * Вычислить угол движения круга.
    #  * Вычислить вектор движения
    #  * Вычислить новый центр окружности

    pygame.draw.circle(screen, circle_color, circle_center, circle_radius)

    pygame.display.flip()
    pygame.time.wait(33)

Звук выстрела: shot.wav.