Комментарии 15
document.getElementById(«spnCoppersValue»)
1. Зачем вы каждый раз дёргаете document.getElementById? Логичнее было бы вынести все DOM-элементы в константы.
2. Зачем вы используете innerHTML если вставляете строки? Для этого есть более легкий путь — textContent.
document.getElementById(«btnUpgSilverMine»).innerHTML = «Улучшить серебряную шахту, »;
document.getElementById(«btnUpgSilverMine»).innerHTML += silversUpgCost().toString();
document.getElementById(«btnUpgSilverMine»).innerHTML += " серебряных монет";
Зачем вы три раза дёргаете элемент? Это дорогое удовольствие. Логичнее сформировать строку и добавить её готовой:
const btnUpgSilverMine = document.getElementById("btnUpgSilverMine");
// code
btnUpgSilverMine.textContent = `Улучшить серебряную шахту, ${silversUpgCost().toString()} серебряных монет`;
let importString = prompt('Введите длинную строку экспорта');
gameTemp = JSON.parse(atob(importString));
for (var propertyName in gameTemp) { game[propertyName] = gameTemp[propertyName]; }
Зачем тут нужен let, если переменная importString не меняется? Откуда var в цикле? Если уж вы перешли на const-let, о var надо забыть.
onclick в атрибутах выглядит архаично. Я бы заменил на addEventListener.
Да, наверное положить объекты в константу и дергать константу лучше было бы.
Второе тоже правильно, обычно я так собираю текстовую переменную из нескольких частей и потом уже собранную переменную присваиваем свойству объекта. Видимо, поторопился и решил пропустить шаг сбора переменной.
var перекочевал из старого проекта, просмотрел.
Что плохого в её применении?
Могу ошибаться, но в данном случае она позволяет не создавать 100500 областей видимости (или не выносить обьявление сётчика на уровень выше).
Или таки есть какой-то вред от неё?
Это, конечно, скорее субъективный выбор, но попробую обосновать следующим образом. У var есть свои свойства, например:
- поддержка хойстинга
- scope на уровне функций
У let/const:
- блоковая видимость
- нет хойстинга (но есть TDZ)
Чаще более "предиктивно" работать как раз с правилами чем проще — тем лучше: то есть без хойстинга + чтобы разделение переменных было более простым (например, в цикле свои переменные, в общем потоке свои). Из-за этого иногда удобнее (или даже, возможно, правильнее, чем удобнее) использовать let/const.
Получается, что у вас в коде будут и let и const и var. Поэтому люди предпочитают исключать var для консистентности кода. Есть даже более жесткие eslint-конфиги, где не только var запрещен, но и let.
Использование var — это легаси. Ни один линтер такое не пропустит. А отказаться от него решили, видимо, как раз, чтобы не засорять окружение переменными-счетчиками.
Если вы новичок в js, я бы не советовал рассматривать код из статьи как хороший пример.
Рост доходов тоже может быть экспоненциальным, главное, чтобы он был медленнее роста расходов.
Таким образом цена улучшения шахты до второго уровня будет примерно следующей:
10*(1,07)^2
Именно так: утром открывалась вкладка, в остальных вкладках шла работа, ресурсы потихоньку копились в первой вкладке, раз в день тратили ресурсы, сохранялся прогресс и компьютер выключался перед окончанием дня. На следующий день цикл повторялся.
Учитывая, что в мобильных браузерах по понятной причине с подобным бороться начали сильно раньше, то для мобильных веб и нативных игр идет расчёт основанный на разнице между двумя таймстампами.
Если вкладка закрыта
Наверное хотели сказать не активна, однако в моём представлении Idle игра должна «продолжаться» даже когда компьютер вообще выключен.
В самом простом случае это просто сохранённое время, например в localStorage. При загрузке игры она мгновенно «проматывается» исходя из разницы во времени, а для этого endOfTurnCalc нужно переписать с учётом что пройдёт намного больше одного «хода».
Сохранение игры тоже можно сделать автоматическое, на каком-нибудь window.onbeforeunload
P.S. Я не против авторского подхода, тем более что ни одной Idle игры я не выпустил, просто принцип работы представлял несколько иначе.
[Туториал] Как создать вашу первую инкрементальную IDLE игру на JavaScript