Search code examples
javascriptloopsblackjack

Shuffle / display cards to a blackjack game (Javascript)


Does you know why "card2" randomly puts a object into the array? It should always put a object into the array.

const cards=[
  {
    card: '&#127137',
    value: '1'
  },
  {
    card: '&#127138',
    value: '2'
  },
  {
    card: '&#127139',
    value: '3'
  },
  {
    card: '&#127140',
    value: '4'
  },
  {
    card: '&#127141',
    value: '5'
  },
  {
    card: '&#127142',
    value: '6'
  },
  {
    card: '&#127143',
    value: '7'
  },
  {
    card: '&#127144',
    value: '8'
  },
  {
    card: '&#127145',
    value: '9'
  },
  {
    card: '&#127146',
    value: '10'
  }
];

var deck = [];

shuffleDeck = () =>{
    var tempDeck = [...cards];
    var card1 = [0];
    var card2 = [0];

    while(0 !== tempDeck.length) {
        var randomIndex = Math.floor(Math.random() * tempDeck.length);
        card1 = tempDeck.splice(randomIndex, 1);
        card2 = tempDeck.splice(randomIndex, 1); 
        deck = [...card1, ...card2];
      }
}
shuffleDeck();

 for(var i = 0; i <= deck.length; i++){
     console.log(deck[i]);
} 


Solution

  • You have two things to fix in your code:

    1. In the while you set randomIndex just once and use it for botth, card1 and card2, but when you set card1 it uses splice and remove that index, so card2 is undefined.
      FIX: set randomIndex once again after setting card1

    2. In the for loop, you need i < deck.length and not i <= deck.length, this will avoid an undefined value, because when i equals to deck.length it would be 2, and deck hasn't index 2, it has only indexes 0 and 1.

    const cards = [{card: '&#127137', value: '1'}, {card: '&#127138', value: '2'}, {card: '&#127139', value: '3'}, {card: '&#127140', value: '4'}, {card: '&#127141', value: '5'}, {card: '&#127142', value: '6'}, {card: '&#127143', value: '7'}, {card: '&#127144', value: '8'}, {card: '&#127145', value: '9'}, {card: '&#127146', value: '10'}];
    
    var deck = [];
    shuffleDeck = () =>{
      var tempDeck = [...cards];
      var card1 = [0];
      var card2 = [0];
    
      while(0 !== tempDeck.length) {
        var randomIndex = Math.floor(Math.random() * tempDeck.length);
        card1 = tempDeck.splice(randomIndex, 1);
    
        randomIndex = Math.floor(Math.random() * tempDeck.length);
        card2 = tempDeck.splice(randomIndex, 1); 
        deck = [...card1, ...card2];
      }
    }
    
    shuffleDeck();
    
    for(var i = 0; i < deck.length; i++){
         console.log(deck[i]);
    }