Храните три цифры отдельно от анимации, увеличивайте нужную по 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.