Чтобы потренироваться использовать промисы, напишем простую консольную игру, симуляцию лошадиных скачек.
Перед стартом игрок делает ставки на лошадей. После старта лошади через непредсказуемое время достигают финиша. После того, как все они финишируют, подсчитывается выигрыш
В игре будут доступны следующие функции:
Эти функции должны лежать в глобальной области видимости. Остальные переменные и вспомогательные функции спрячьте в отдельную область видимости
1. Напишите функцию showHorses(), которая выводит имена всех лошадей. Создайте массив лошадей.
2. Напишите функцию showAccount(), которая отображает текущий счёт игрока.
3. Напишите функцию setWager(), с помощью которой можно создать ставку - поставить сумму со счёта на конкретную лошадь. Сохраняйте ставки в массив.
4. Добавьте в функцию setWager() проверку, что на счету есть средства, достаточные для ставки.
5. Для того, чтобы скачки работали, лошади должны бегать. При этом результат должен быть разный и отложенный по времени.
Добавьте лошадям метод run(). Этот метод должен возвращать промис, выполняющийся через случайное время, от 500 до 3000 мс.
Для этого вам понадобятся функции new Promise(), setTimeout(), Math.random().
6. Напишите функцию startRacing(), которая даёт старт скачкам. Лошади должны начать бежать. Выведите в консоль каждую добежавшаю до финиша лошадь.
Для этого вам понадобиться функция .then().
7. Для того, чтобы посчитать результат всех ставок, нужно узнать победителя, то есть первый выполнившийся промис.
Сделайте это с помощью функции Promise.race().
8. Итог скачек можно подвести и вывести на экран после того, как все лошади доберутся до финиша, то есть все промисы выполнятся.
Используйте функцию Promise.all(), чтобы поймать этот момент.
9. В качестве итога скачек выведите, сколько выиграл игрок и какой у него счёт в результате. Если он ничего не выиграл, выведите только счёт.
Если в ставке было указана лошадь-победитель, удвойте сумму и верните на счёт.
10. После завершения скачки не забудьте почистить данные о ставках
11. Напишите функцию newGame(), дающую возможность начать игру заново.