Реализовать простую имплементацию слот-машины "однорукий бандит":

Храните три цифры отдельно от анимации, увеличивайте нужную по onRoll по модулю 10 и проверяйте совпадение только после остановки всех барабанов.

Короткий ответ

Что ответить на собеседовании

Храните три цифры отдельно от анимации, увеличивайте нужную по onRoll по модулю 10 и проверяйте совпадение только после остановки всех барабанов.

Подробный разбор

Ответ с пояснениями

Условие

Реализовать простую имплементацию слот-машины "однорукий бандит":

  • Реализуйте три барабана (с цифрами от 0 до 9, которые меняются по-очереди 0,1,2,...9,0,1,2...)
  • На каждый onRoll на барабане выпадает следующее значение
  • Если все три цифры совпали после остановки - говорим, что победил
  • Дизаблим кнопку на время вращения

Физическая модель колеса уже реализована в методе runSpinner, но она ничего не значит про цифры.

Совет: начните реализацию с первого барабана, потом добавьте остальные по аналогии

Ответ

Храните три цифры отдельно от анимации, увеличивайте нужную по onRoll по модулю 10 и проверяйте совпадение только после остановки всех барабанов.

Ниже адаптер предполагает runSpinner(index, onRoll), возвращающий Promise завершения; его нужно связать с фактическим API анимации. render(values, spinning, result) обновляет цифры, disabled кнопки и сообщение; null скрывает результат.

function createSlots(runSpinner, render) {
  let active = false;
  return async function start() {
    if (active) return;
    active = true;
    const values = [0, 0, 0];
    try {
      render([...values], true, null);
      const settled = await Promise.allSettled(values.map((_, index) =>
        Promise.resolve().then(() => runSpinner(index, () => {
          values[index] = (values[index] + 1) % 10;
          render([...values], true, null);
        }))
      ));
      if (settled.some(r => r.status === 'rejected')) throw new Error('Spin failed');
      const won = values.every(value => value === values[0]);
      render([...values], false, won);
      return won;
    } catch (error) {
      render([...values], false, null);
      throw error;
    } finally {
      active = false;
    }
  };
}

Повторный старт заблокирован до завершения всех анимаций. Ошибку start() должен обработать вызывающий UI.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее