> For the complete documentation index, see [llms.txt](https://pygame.gitbook.io/razrabotchiki/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://pygame.gitbook.io/razrabotchiki/teoriya/mekhaniki/strelba.md).

# Стрельба

Темы для изучения:

* [Управление спрайтами](/razrabotchiki/teoriya/spraity.md)
* [Управление клавиатурой и мышью](/razrabotchiki/teoriya/obrabotka-sobytii.md)
* [Музыка и звуки](/razrabotchiki/teoriya/muzyka-i-zvuki.md)
* [Графика и анимация ](/razrabotchiki/teoriya/grafika-i-animaciya.md)

Добавим механику стрельбы, где игрок может выстреливать снаряды по направлению, указанному мышью.

```python
import pygame
import sys
import math

class Player:
    """
    Класс, представляющий игрока.

    Attributes:
        x (int): Позиция игрока по горизонтали.
        y (int): Позиция игрока по вертикали.
        size (int): Размер игрока.
        speed (int): Скорость перемещения игрока.
    """

    def __init__(self, x, y, size, speed):
        """
        Инициализация игрока.

        Args:
            x (int): Позиция игрока по горизонтали.
            y (int): Позиция игрока по вертикали.
            size (int): Размер игрока.
            speed (int): Скорость перемещения игрока.
        """
        self.x = x
        self.y = y
        self.size = size
        self.speed = speed

    def move(self, keys):
        """
        Перемещение игрока в зависимости от нажатых клавиш.

        Args:
            keys (dict): Словарь, представляющий состояние клавиш на клавиатуре.
        """
        if keys[pygame.K_LEFT]:
            self.x -= self.speed
        if keys[pygame.K_RIGHT]:
            self.x += self.speed
        if keys[pygame.K_UP]:
            self.y -= self.speed
        if keys[pygame.K_DOWN]:
            self.y += self.speed


class Bullet:
    """
    Класс, представляющий пулю.

    Attributes:
        x (float): Позиция пули по горизонтали.
        y (float): Позиция пули по вертикали.
        radius (int): Радиус пули.
        angle (float): Угол направления движения пули.
    """

    def __init__(self, x, y, radius, angle):
        """
        Инициализация пули.

        Args:
            x (int): Позиция пули по горизонтали.
            y (int): Позиция пули по вертикали.
            radius (int): Радиус пули.
            angle (float): Угол направления движения пули.
        """
        self.x = x
        self.y = y
        self.radius = radius
        self.angle = angle

    def move(self):
        """Перемещение пули в соответствии с углом движения."""
        self.x += math.cos(self.angle)
        self.y += math.sin(self.angle)


pygame.init()

WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Shooting")

WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)

player = Player(WIDTH // 2, HEIGHT // 2, 50, 5)
bullets = []

clock = pygame.time.Clock()

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        if event.type == pygame.MOUSEBUTTONDOWN:
            mx, my = pygame.mouse.get_pos()
            angle = math.atan2(my - player.y, mx - player.x)
            bullets.append(Bullet(player.x, player.y, 5, angle))

    keys = pygame.key.get_pressed()
    player.move(keys)

    screen.fill(WHITE)
    pygame.draw.rect(screen, RED, (player.x, player.y, player.size, player.size))
    for bullet in bullets:
        bullet.move()
        pygame.draw.circle(screen, GREEN, (int(bullet.x), int(bullet.y)), bullet.radius)

    pygame.display.flip()
    clock.tick(30)


```
