Детали
Фактически код работает, но не дает пройти дальше. Разными нелогичными манипуляциями (дублирование if структуры внутрь checkInitCompleted ) удавалось уменьшить кол-во НЕпройденных шагов, но в любом случае программа сама по себе работает так как надо. Очень хочется разобраться, где я все таки ошибся или сломал тесты.
checkInitCompleted должен вызываться из handleKeyPress, если у пользователя достаточно золота для первой покупки.
Аргументы handleKeyPress должны быть переданы в checkInitCompleted
checkInitCompleted должен вызываться из handleKeyPress только один раз за время существования игры.
checkInitCompleted нужно использовать term.moveTo три раза, чтобы перейти в нужное место на экране
checkInitCompleted должна вывести сообщение 'You can purchase producers by clicking the number button (1, 2, 3, ...)'
checkInitCompleted должна вывести сообщение 'PRODUCTION RATE:'
checkInitCompleted должно вывести сообщение 'GOLD:'
constant.js
import terminalKit from "terminal-kit";
export const term = terminalKit.terminal;
export const config = {
gold: 0,
producers: [
{
id: 1,
title: "Miner",
cost: 10,
growthRate: 1.13,
baseProduction: 0.1,
count: 0,
},
{
id: 2,
title: "Adventurer",
cost: 100,
growthRate: 1.17,
baseProduction: 1,
count: 0,
},
{
id: 3,
title: "Professional",
cost: 1200,
growthRate: 1.14,
baseProduction: 9,
count: 0,
},
],
productionRate: 0,
//
isInitCompleted: false,
isProducerListUpdated: true,
};
functions.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 + " ");
};
export const checkInitCompleted = (term, state) => {
term.moveTo(1, 1);
term.eraseLineAfter();
term.defaultColor(
"You can purchase producers by clicking the number button (1, 2, 3, ...)"
);
term.moveTo(1, 2);
term.eraseLineAfter();
term.defaultColor("GOLD:");
term.moveTo(1, 3);
term.eraseLineAfter();
term.defaultColor("PRODUCTION RATE:");
state.isInitCompleted = true;
};
gameEngine.js
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, checkInitCompleted } from "./functions.js";
export const handleKeyPress = (term, state) => {
return (name, matches, data) => {
//
if (
String.fromCharCode(data.code) === "G" ||
String.fromCharCode(data.code) === "g"
) {
state.gold += 1;
} else {
//
const producers = state.producers;
producers.forEach((element) => {
if (
element.id == String.fromCharCode(data.code) &&
state.gold >= element.cost
) {
//
//
state.gold -= element.cost;
element.cost *= element.growthRate;
//element.cost = element.cost.toFixed(0);
element.count++;
//
state.productionRate += element.baseProduction;
}
});
}
const minCost = Math.min(
...state.producers.map((elem) => {
return elem.cost;
//
})
);
if (state.isInitCompleted === false && state.gold >= minCost) {
checkInitCompleted(term, state);
}
};
};
export const handleStateChange = (term, state) => {
//
return () => {
updateGold(term, state);
};
};
solution.js
import { startMiningGame } from "./gameEngine.js";
import { term, config } from "./constants.js";
startMiningGame(term, config);