Я работаю над сканером подземелий в node.js. Мне нужен элегантный способ отслеживать концовки пользователя. Я подумал, что было бы неплохо, если бы я мог иметь массив каждого из окончаний, а затем просто установить для элемента значение true, если это окончание будет достигнуто. Это упростит просмотр списка и распечатку достигнутых концовок, а затем вычисление процента завершения.

Моя попытка сделать это:

var end1 = true
var end2 = true
var end3 = false
var end4 = true
var end5 = false

var endings = [end1, end2, end3, end4, end5]

function listEndings() {
  console.log("You have found these endings:")
  var total = 0

  for (let i = 0; i < endings.length; i++) {
    if (endings[i] = true) {
      console.log(String(endings[i]))
      total = total + 1
    }
  }

  console.log(`\nIn total you have ${total}/${endings.length + 1} endings. (${(total/(endings.length + 1))*100}%)`)
}

На выходе я бы хотел

You have found these endings:
end1
end2
end4

In total you have 3/5 endings. (60%)

Можно ли использовать такой метод? Вы бы порекомендовали другой метод?

Огромное спасибо за помощь!

1
Benjamin Hewitt 17 Сен 2021 в 04:41

3 ответа

Лучший ответ

Было бы легко и просто использовать object вместо array и использовать Object.entries, чтобы перебрать key и value для получения желаемого результата.

var end1 = true;
var end2 = true;
var end3 = false;
var end4 = true;
var end5 = false;

var endings = { end1, end2, end3, end4, end5 };

function listEndings() {
  let count = 0, entries = Object.entries(endings);
  
  console.log("You have found these endings:");
  for (let [k, v] of entries) {
    if (v) {
      console.log(`${k}`);
      ++count;
    }
  }

  console.log(
    `In total you have ${count}/${entries.length} endings. (${
      (count * 100) / entries.length
    }%)`
  );
}

listEndings();
0
HR01M8055 17 Сен 2021 в 02:29

В этом случае объявите переменную массива, которая содержит объект. Итак, ваши данные гибкие. вы можете добавить данные в любое время, если вам понадобится какое-то условие.

Используйте функцию фильтра и карты для создания такого вывода

var endings = [
{"no": 1,"bool": true},
{"no": 2,"bool": true},
{"no": 3,"bool": false},
{"no": 4,"bool": true},
{"no": 5,"bool": false},
{"no": 6,"bool": true},
{"no": 7,"bool": false}
]

var result = endings.filter((a)=>a.bool==true)
var resultMsg = result.map((a)=> `end${a.no}\n`)
var resultVal = parseInt((result.length/endings.length)*100)

console.log(`You have found these endings:\n ${resultMsg}`)
console.log(`\nIn total you have ${result.length}/${endings.length} endings. (${resultVal}%)`)
0
Nanda Fitra 17 Сен 2021 в 03:05

Я думаю, что лучше хранить значения в виде массива, в котором хранятся концовки, которые игрок уже нашел:

let endingsFound = []
const totalEndings = 5
//(as a side note, better use let than var)

console.log('Endings found')
//suppose we find endings three and four
endingsFound.push(3)
endingsFound.push(4)

endingsFound.forEach((end) => console.log(`Ending ${end}`))

console.log(`In total you have found ${endingsFound.length +1}/${totalEndings}`);

Если вы по-прежнему полны решимости сохранить его как массив логических значений, используйте следующую функцию:

const indices = arr.reduce(
    (out, bool, index) => bool ? out.concat(index) : out, 
    []
  )

Как было представлено здесь, чтобы перейти к массив найденных окончаний, а затем сделайте то же самое.

0
Ivan Moreno 17 Сен 2021 в 02:15