Estoy trabajando en un rastreador de mazmorras en node.js. Quería una forma elegante de realizar un seguimiento de las terminaciones que tiene un usuario. Estaba pensando que sería bueno si pudiera tener una matriz de cada uno de los finales y luego establecer un elemento en verdadero si se logra ese final. Esto facilitaría revisar la lista e imprimir los finales logrados y luego calcular el porcentaje de finalización.
Mi intento de hacer esto:
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}%)`) }La salida que me gustaría
You have found these endings: end1 end2 end4 In total you have 3/5 endings. (60%)¿Es posible utilizar un método como este? ¿Hay otro método que recomendarías?
¡Muchas gracias por la ayuda!
Creo que es mejor almacenar los valores como una matriz que almacena las terminaciones que el jugador ya ha encontrado:
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}`);si todavía está decidido a almacenarlo como una matriz de valores booleanos, utilice la siguiente función:
const indices = arr.reduce( (out, bool, index) => bool ? out.concat(index) : out, [] )como se presentó aquí para llegar a una serie de terminaciones encontradas y luego hacer lo mismo.
Sería fácil y directo usar un object en lugar de una array y usar Object.entries para recorrer la key y el value para obtener el resultado deseado.
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();en este caso, declare la variable de matriz que contiene el objeto. por lo tanto, sus datos son flexibles. puede agregar datos en cualquier momento si necesita alguna condición.
use la función de filtro y mapa para crear una salida como esa
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}%)`)