Привет! Судя по скрину отсюда, люди сумели разобраться с флагом isProducerListUpdated так, как того требовала проверка:
У меня же вновь "головняк": код работает без ошибок, всё соответствует условиям задания, но проверка вываливает кучу несоответствий:
При этом я в уме прокрутил алгоритм работы кода согласно требованиям, указанным в замечаниях, и получается у меня следующее:
- Значение по умолчанию флага isProducerListUpdated (constants.js) = true.
- Вызываться функция updateProducerList (functions.js) должна из функции handleKeyPress (handlers.js) только при условии, что значение флага isProducerListUpdated = false (см. п. 2 в списке замечаний).
- Таким образом, функция updateProducerList первый раз должна быть вызвана из функции handleKeyPress после того, как юзер накопает минимальное количество золота для совершения первой покупки производителя и сработает функция checkInitCompleted (functions.js), которая изменяет значение флага isProducerListUpdated на false (см. п. 6 замечаний).
- Но в конце этого первого срабатывания, согласно п. 10 замечаний, функция updateProducerList должна изменить значение флага isProducerListUpdated на true. Больше никакие действия не могут изменить значение этого флага на false.
- А без этого функция handleKeyPress не может вызывать функцию updateProducerList, согласно условию из п. 2 замечаний. Следовательно, дальнейшее обновление строк с описанием производителей осуществляться не будет.
- Что-то вы усложнили с этим флагом... Можно как-то зачесть без переделки код, выполняющий все условия задания, но работающий по несколько иному алгоритму (см. ниже)?
============
handlers.js
import { updateGold, checkInitCompleted, updateProducerList } from './functions.js';
export const handleKeyPress = (term, state) => {
return (name, matches, data) => {
let key = String.fromCharCode(data.code);
if (key === 'g' || key === 'G') {
state.gold++;
} else {
for (const producer of state.producers) {
if (key === String(producer.id) && state.gold >= producer.cost) {
state.gold -= producer.cost;
producer.cost *= producer.growthRate;
producer.count++;
state.productionRate += producer.baseProduction;
updateProducerList(term, state);
}
}
}
let minCost = 0;
for (const producer of state.producers) {
if (minCost === 0 || minCost > producer.cost) {
minCost = producer.cost;
}
}
if (state.gold >= minCost && !state.isInitCompleted) {
checkInitCompleted(term, state);
updateProducerList(term, state);
}
// updateGold(term, state);
}
}
export const handleStateChange = (term, state) => {
return () => updateGold(term, state);
}
============
functions.js
export const init = (term) => {
term.clear();
term.hideCursor();
term('Welcome to the mining game! Push "G" ten times to mine ten pieces of gold');
term.grabInput();
}
export const updateGold = (term, state) => {
state.gold += state.productionRate;
term.moveTo(25, 2).eraseLineAfter();
term.bold.yellow(`${state.gold.toFixed(1)} `);
term.moveTo(25, 3).bold.green(`${state.productionRate.toFixed(1)}`);
}
export const checkInitCompleted = (term, state) => {
state.isInitCompleted = true;
term.moveTo(1, 1).eraseLine();
term('Now you can purchase producers by clicking the number button (1, 2, 3, ...)');
term.moveTo(1, 2).bold.yellow('GOLD:');
term.moveTo(1, 3).bold.green('PRODUCTION RATE:');
}
export const updateProducerList = (term, state) => {
if (state.isProducerListUpdated) {
term.moveTo(1, 5).blue(`${state.producers[0].title}: ${state.producers[0].count} | Production per second: ${state.producers[0].baseProduction} | Cost: ${state.producers[0].cost.toFixed(1)}`);
state.isProducerListUpdated = false;
} else {
for (let i = 0; i < state.producers.length; i++) {
let n = i + 1;
if (state.producers[i].count > 0) {
if (n != state.producers.length) {
term.moveTo(1, (5 + i)).eraseLine().eraseDisplayBelow();
term.blue(`${state.producers[i].title}: ${state.producers[i].count} | Production per second: ${state.producers[i].baseProduction} | Cost: ${state.producers[i].cost.toFixed(1)} \n`);
term.blue(`${state.producers[n].title}: ${state.producers[n].count} | Production per second: ${state.producers[n].baseProduction} | Cost: ${state.producers[n].cost.toFixed(1)}`);
} else {
term.moveTo(1, (5 + i)).eraseLine().eraseDisplayBelow();
term.blue(`${state.producers[i].title}: ${state.producers[i].count} | Production per second: ${state.producers[i].baseProduction} | Cost: ${state.producers[i].cost.toFixed(1)}`);
}
}
}
}
}
============
solution.js
import { startMiningGame } from './gameEngine.js';
import { term, config } from './constants.js';
startMiningGame(term, config);
============
gameEngine.js
import { init } from './functions.js';
import { handleKeyPress, handleStateChange } from './handlers.js';
import { term } from './constants.js'
export const startMiningGame = (term, config) => {
init(term);
setInterval(handleStateChange(term, config), 1000);
const handler = handleKeyPress(term, config);
term.on('key', handler);
}