¡Estoy aprendiendo a codificar Javascript y actualmente estoy probando esto! Tengo un objeto de 'jugador' y con cofreRecompensas. En el cofre, hay algunos elementos que se entregarán al azar. ¿Cómo puedo agregar peso a diferentes elementos en la matriz para que el elemento 'oro' no se dé con tanta frecuencia (elemento raro)? También estoy confundido con la salida, está imprimiendo sin definir pero no entiendo de dónde viene.
const lootBoxA = ['gold', 'silver', 'shirt', 'shorts']; const player = { chestReward: lootBoxA, currentReward(){ while (this.currentReward){ this.currentReward = this.chestReward[Math.floor(Math.random() * 4)]; console.log(this.currentReward); if (this.currentReward === 'gold'){ console.log('Bonus!'); }break; } } } console.log(player.currentReward()); /*Outputs gold Bonus! undefined*/Necesitará más información que solo el nombre de sus artículos. Entonces, en lugar de representar sus elementos con string , puede usar objetos:
const lootBoxA = [ { name: 'gold', probability: 0.1 }, { name: 'silver', probability: 0.3 }, { name: 'shirt', probability: 0.7 }, { name: 'shorts', probability: 0.5 } ];De esa manera, le das a cada artículo una probabilidad de ser elegido.
Entonces, no veo ninguna razón por la que la recompensa actual de su jugador deba ser una función ( currentReward() ). Puede ser solo una propiedad, por lo que tendría algo así:
const player = { name: 'Henry', // for example currentReward: null // the player starts without reward }Puede tener una función para elegir una recompensa para su jugador. Tomará un "lootBox" y elegirá un artículo con la probabilidad correcta:
function pickItemFromLootBox(lootBox) { const randomIndex = Math.floor(Math.random() * lootBox.length); const randomNumber = Math.random(); // between 0 and 1 const selectedLootBoxItem = lootBox[randomIndex]; if (selectedLootBoxItem.probability >= randomNumber) { return selectedLootBoxItem; } else { return null; // no item selected // or if you want to always select an item, replace the above line with this : // return pickItemFromLootBox(lootBox); } }Ahora que tiene un jugador, un botín y una función para elegir un elemento del botín, puede hacer lo que quiera:
player.currentReward = pickItemFromLootBox(lootBoxA); if (player.currentReward !== null && player.currentReward.name === 'gold') { console.log('Bonus !') }