Задание:
Золотая Шахта
Этап 10
После того, как мы купили несколько производителей, мы должны убедится, что они работают!
Каждую секунду, каждый продюсер должен приносить нам количество золота равное baseProduction.
Добавь новое поле productionRate в объект config в файле constants.js.
Начальное значение productionRate должно быть равно 0.
Когда пользователь покупает нового производителя, мы должны увеличивать общий productionRate
Реализуй и экспортируй новый обработчик handleStateChange(term, state) в handlers.js который должен вызвать функцию updateGold(term, state)
При каждом вызове updateGold увеличивай значение золота на величину общего productionRate
В startMiningGame установи интервал, который будет вызывать handleStateChange раз в секунду
handleStateChange должен вернуть замыкание, которое и будет использоваться в setInterval
Удали вызов updateGold из handleKeyPress, чтобы у нас не возникло проблем с бухгалтерией
Результат теста:
Детали
- config должен иметь свойство productionRate, равное 0
- updateGold нужно вызывать один раз из замыкания handleStateChange-----------------
- updateGold не должен вызываться из замыкания handleKeyPress
- Общий объем производства должен правильно увеличиваться после каждой покупки производителя
- setInterval нужно вызывать из startMiningGame и запускать handleStateChange каждую секунду
- updateGold должен увеличивать количество золота на productionRate
Второй пункт не правильно.
Когда запускаю на выполнение:
task250/handlers.js:20
0 internal/process/esm_loader.js:74
internalBinding('errors').triggerUncaughtException(
^
0 internal/process/esm_loader.js:74
internalBinding('errors').triggerUncaughtException(
^
0 internal/process/esm_loader.js:74
internalBinding('errors').triggerUncaughtException(
^
0 internal/process/esm_loader.js:74
internalBinding('errors').triggerUncaughtException(
^
file:///d:/coderslang/task250/handlers.js:21
0 internal/process/esm_loader.js:74
internalBinding('errors').triggerUncaughtException(
^
0 internal/process/esm_loader.js:74
internalBinding('errors').triggerUncaughtException(
^
TypeError [ERR_INVALID_CALLBACK]: Callback must be a function. Received undefined
at setInterval (timers.js:187:3)
at startMiningGame (file:///d:/coderslang/task250/gameEngine.js:6:2)
at file:///d:/coderslang/task250/solution.js:4:1
at ModuleJob.run (internal/modules/esm/module_job.js:152:23)
at async Loader.import (internal/modules/esm/loader.js:166:24)
at async Object.loadESM (internal/process/esm_loader.js:68:5) {
code: 'ERR_INVALID_CALLBACK'
}
Ниже приведен код:
gameEngine
import { init} from "./functions.js"
import { handleKeyPress, handleStateChange } from "./handlers.js";
export const startMiningGame = (term, state) =>{
init(term);
term.on('key', handleKeyPress(term,state));
setInterval(handleStateChange(term,state), 1000);
}
handlers.js
import {updateGold} from "./functions.js"
export const handleKeyPress = (term, state) =>{
return (name, matches, data) => {
var keys = String.fromCharCode(data.code);
if(keys === "G" || keys === "g") {
return state.gold++;
}
for (let producer of state.producers) {
if (String(producer.id) ===keys){
state.gold -= producer.cost;
producer.cost *= producer.growthRate;
producer.count++;
state.productionRate+=producer.baseProduction;
}
}
}
}
export const handleStateChange = (term, state) =>{
return updateGold(term, state);
}
function.js
export const init = (term) =>{
term("Welcome to the mining game!");
term.clear();
term.hideCursor();
term.grabInput();
}
export const updateGold = (term, state) =>{
state.gold +=state.productionRate;
term.moveTo(25, 2);
term.eraseLineAfter();
term.bold.yellow(state.gold+" ");
}