Mi objetivo es hacer un juego de cartas simple. Tengo este error en el que a veces no empuja uno de los objetos a la matriz. Primero pensé que el número elegido no encajaría entre las declaraciones if para declarar los valores de los objetos.
Intenté redefinir el número elegido manualmente justo después de obtener el valor aleatorio. Entonces funcionó. Los números con los que tengo problemas son: 36, 38, 24, 25, 37 cuando era aleatorio, pero cuando definí manualmente el var PickedNumber funcionó como debería.
¿Cómo puedo arreglar esto?
foto de cuando falla el codigo
function log(txt) { console.log(txt); } let cards = []; let hand = []; // fill card deck for (let i = 1; i < 53; i++) { cards.push(i); } // index for to make the random math not to choose a number over the highest index of cards[] // loop for picking some random card with a value for (let i = 0; i < 3; i++) { // random index to choose let randomNumber = Math.floor(Math.random() * cards.length); log(randomNumber); // random number let pickedNumber = cards[randomNumber]; log(pickedNumber); // remove the picked card const index = cards.indexOf(pickedNumber); if (index > -1) { cards.splice(index, 1); } let finalValue; let card = { value: finalValue, suit: "", }; // these if statements are for deviding the cards from 52 to 4x13 if (pickedNumber < 14) { card.value = pickedNumber; card.suit = "♥"; hand.push(card); } else if (pickedNumber > 13 && pickedNumber < 26) { card.value = pickedNumber -= 13; card.suit = "♣"; hand.push(card); } else if (pickedNumber > 26 && pickedNumber < 39) { card.value = pickedNumber -= 26; card.suit = "♦"; hand.push(card); } else if (pickedNumber > 39 && pickedNumber < 53) { card.value = pickedNumber -= 39; card.suit = "♠"; hand.push(card); } // reduce maxIndex to dont overpick index } log(hand);Tiene un error en sus declaraciones IF. Te falta un número en cada conjunto
if (pickedNumber < 14) { ... } else if (pickedNumber > 13 && pickedNumber < 26) { ... } else if (pickedNumber > 26 && pickedNumber < 39) { ... } else if (pickedNumber > 39 && pickedNumber < 53) { ... } Vea cómo, en el bloque de código anterior, si el número es 26 o 39, no se recogerá. Cuando cambiamos el < 26 a <= 26 , eso permite que sea detectado.
if (pickedNumber <= 14) { // ... } else if (pickedNumber > 14 && pickedNumber <= 26) { ... } else if (pickedNumber > 26 && pickedNumber <= 39) { ... } else if (pickedNumber > 39 && pickedNumber <= 53) { ... }Una representación más completa de una baraja de cartas es bastante simple y aconsejable.
En el fragmento a continuación, freshDeck enumera un mazo estándar completo, usando push() para agregar cartas. Fisher-Yates shuffle() baraja la baraja, slice() mira las cartas y splice() mueve las cartas de una pila (matriz) a otra.
function freshDeck() { const suits = [ "♥", "♣", "♦","♠"]; const values = ["A","2","3","4","5","6","7","8","9", "10","J","Q","K"] let deck = [] for (const suit of suits) { for (const value of values) { deck.push({ suit, value }) } } return deck } // fy shuffle, thanks to https://stackoverflow.com/a/2450976/294949 function shuffle(array) { let currentIndex = array.length, randomIndex; while (currentIndex != 0) { randomIndex = Math.floor(Math.random() * currentIndex); currentIndex--; [array[currentIndex], array[randomIndex]] = [ array[randomIndex], array[currentIndex]]; } return array; } // create a deck let deck = freshDeck() console.log(`the deck has ${deck.length} cards`) console.log(`the first few cards are ${JSON.stringify(deck.slice(0,3))}`) // suffle the deck shuffle(deck) console.log(`\nafter a shuffle, the first few cards are ${JSON.stringify(deck.slice(0,3))}`) // deal a hand of cards let hand = deck.splice(0, 5) console.log(`\ndealt a hand with ${JSON.stringify(hand, null, 0)}`) console.log(`\nafter dealing, the deck has ${deck.length} cards`)