> 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/primer-prostoi-igry/sozdanie-klikera/sozdanie-igry-klikera.md).

# Создание игры-кликера

## Класс для шариков:

класс это лишь шаблон для наших будущих шаров, здесь нам важно указать где они будут появляться, какого размера, какого цвета, их время жизни. Также нам потребуются методы для их отрисовки (рендеринга)

Этот класс пойдет в блок настроек, так как его надо создать один раз и потом  к нему обращаться для создания новых шаров

Давайте подробно разберем код и объясним его пошагово:

### Определение класса `Ball`

```python
class Ball:
   def __init__(self, x, y, radius, color, lifetime):
       self.x = x
       self.y = y
       self.radius = radius
       self.color = color
       self.lifetime = lifetime

   def draw(self, surface):
       pygame.draw.circle(surface, self.color, (self.x, self.y), self.radius)

   def update(self):
       self.lifetime -= 1
       return self.lifetime <= 0
```

1. **`__init__` метод:**
   * Инициализирует объект `Ball` с заданными координатами `(x, y)`, радиусом `radius`, цветом `color` и временем жизни `lifetime`.
2. **`draw` метод:**
   * Рисует шарик на указанной поверхности (`surface`) с заданными параметрами (`color`, `(x, y)`, `radius`) с помощью функции `pygame.draw.circle`.
3. **`update` метод:**
   * Уменьшает время жизни `lifetime` шарика на 1 на каждом обновлении.
   * Возвращает `True`, если `lifetime` стало меньше или равно 0, что означает, что шарик должен быть удален из списка. Иначе возвращает `False`.

### Переменные для управления шариками и игровой цикл

```python
balls = []
ball_spawn_time = 30
ball_timer = 0
score = 0
font = pygame.font.SysFont(None, 36)
```

* **`balls`:** Список для хранения всех созданных объектов `Ball`.
* **`ball_spawn_time`:** Время, через которое будет создаваться новый шарик (в кадрах).
* **`ball_timer`:** Текущее время до создания нового шарика.
* **`score`:** Переменная для хранения текущего счета игрока.
* **`font`:** Объект шрифта для отображения текста (используется для отображения счета).

### Создание шаров и отрисовка

```python
while True:
   window.fill(NEON_BLUE)  # Заливка окна голубым цветом

   # Обработка событий
   for event in pygame.event.get():
       if event.type == QUIT:
           pygame.quit()
           sys.exit()

   # Обновление и отрисовка шариков
   for ball in balls[:]:
       if ball.update():
           balls.remove(ball)
       else:
           ball.draw(window)

   # Создание нового шарика по таймеру
   ball_timer += 1
   if ball_timer >= ball_spawn_time:
       ball_timer = 0
       new_ball = Ball(
           x=random.randint(20, WINDOW_WIDTH - 20),
           y=random.randint(20, WINDOW_HEIGHT - 20),
           radius=random.randint(10, 30),
           color=RED,
           lifetime=random.randint(60, 120)
       )
       balls.append(new_ball)

   # Отрисовка счета игрока
   draw_score(window, score)

   # Обновление экрана
   pygame.display.update()

   # Задержка и обновление частоты кадров
   clock.tick(FPS)
  
```

### Добавляем ломание шаров

```python
while True:
   window.fill(NEON_BLUE)  # Заливка окна голубым цветом

   # Обработка событий
   for event in pygame.event.get():
       if event.type == QUIT:
           pygame.quit()
           sys.exit()
       #------------ДОбавили лопание шаров-----------------#
       elif event.type == MOUSEBUTTONDOWN:
           mouse_x, mouse_y = event.pos
           for ball in balls[:]: # перебираем каждый шар
               # если нажали именно на шар
               if (mouse_x - ball.x) ** 2 + (mouse_y - ball.y) ** 2 <= ball.radius ** 2:
                   balls.remove(ball) # удаляем шар
                   score += 1

   # Обновление и отрисовка шариков
   for ball in balls[:]:
       if ball.update():
           balls.remove(ball)
       else:
           ball.draw(window)

   # Создание нового шарика по таймеру
   ball_timer += 1
   if ball_timer >= ball_spawn_time:
       ball_timer = 0
       new_ball = Ball(
           x=random.randint(20, WINDOW_WIDTH - 20),
           y=random.randint(20, WINDOW_HEIGHT - 20),
           radius=random.randint(10, 30),
           color=RED,
           lifetime=random.randint(60, 120)
       )
       balls.append(new_ball)

   # Отрисовка счета игрока
   draw_score(window, score)

   # Обновление экрана
   pygame.display.update()

   # Задержка и обновление частоты кадров
   clock.tick(FPS)
```
