Игра «Кликер» помогает понять базовую экономику браузерных игр: активный клик, пассивный доход, рост цен апгрейдов и сохранение прогресса. В статье разбираем ту же версию, которая доступна в разделе «Поиграть».

Что получится в конце

Рабочий кликер на HTML, CSS и JavaScript: очки за клик, доход в секунду, два апгрейда, динамические цены, автосохранение в localStorage и визуальные эффекты (нажатие, плавающие +очки, серия COMBO).

Сначала попробуйте готовую игру

Сыграйте 1-2 минуты: сделайте быструю серию кликов, активируйте COMBO, купите оба апгрейда и проверьте, как меняется темп накопления очков.

Открыть игру отдельно

Структура проекта

kliker/
├── source.html
├── style.css
└── game.js

HTML: интерфейс и магазин

Разметка состоит из статуса, главной кнопки и двух покупок магазина. Все узлы логики отмечены атрибутами data-clicker-*.

<main class="clicker" data-clicker-game>
  <section class="clicker__stats">
    <p data-clicker-score>Очки: 0</p>
    <p data-clicker-cps>Доход/сек: 0</p>
  </section>

  <button class="clicker__main" type="button" data-clicker-main>Клик!</button>

  <section class="clicker__shop">
    <button type="button" data-buy-click>+1 к клику</button>
    <button type="button" data-buy-cps>+1 к доходу/сек</button>
  </section>
</main>

CSS: единый стиль с остальными играми

Игра оформлена в общей тёмной стилистике проекта: карточный контейнер, яркая основная кнопка и аккуратные кнопки магазина.

JavaScript: состояние и рендер

Состояние игры хранит очки, силу клика, пассивный доход и цены апгрейдов. Отдельные функции отвечают за визуальную обратную связь: анимацию нажатия кнопки, плавающие +очки и короткий подсвет COMBO-серии.

const state = {
  score: 0,
  perClick: 1,
  cps: 0,
  clickUpgradeCost: 20,
  cpsUpgradeCost: 35,
};

function render() {
  scoreEl.textContent = "Очки: " + formatNumber(state.score);
  cpsEl.textContent = "Доход/сек: " + formatNumber(state.cps);
}

Логика апгрейдов и рост стоимости

Покупка работает через универсальную функцию: списывает стоимость, применяет эффект и увеличивает цену. Это упрощает добавление новых апгрейдов.

function buy(costKey, action) {
  const cost = state[costKey];
  if (state.score < cost) return;

  state.score -= cost;
  action();
  state[costKey] = Math.round(cost * 1.58);
  render();
  save();
}

Пассивный доход и сохранение прогресса

Каждую секунду к счёту добавляется cps. Когда автодоход активен, игра показывает +очки/с и пульс показателей, чтобы игрок видел прирост в реальном времени. Состояние периодически сохраняется в localStorage, поэтому прогресс не теряется после перезагрузки.

Проверка

Проверка Ожидаемый результат
Нажать кнопку «Клик!» Очки растут на текущий показатель клика
Купить улучшение клика Увеличивается сила клика и растёт цена следующей покупки
Купить улучшение дохода Доход/сек растёт, очки капают каждую секунду и появляется визуальный тик +очки/с
Сделать быструю серию кликов Срабатывает визуальный COMBO: подсветка кнопки и надпись COMBO xN
Перезагрузить страницу Сохранённый прогресс поднимается из localStorage

FAQ

Как добавить третий апгрейд?

Добавьте новое поле в state, кнопку в HTML и вызов функции buy с нужным эффектом.

Почему цена растёт мультипликатором?

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

Исходники урока

Откройте финальные файлы этой версии. Это тот же код, который работает в демо наверху и на странице «Поиграть».

Обложка книги JavaScript с нуля: учимся программировать, создавая игры

Книга по JavaScript для начинающих

«JavaScript с нуля: учимся программировать, создавая игры»

Пошаговый формат с маленькими практическими задачами: от базового синтаксиса до первых игровых механик без перегруза теорией.

Читать книгу на ЛитРес →