2011-02-13 98 views
2

我在獲取數組時需要正確填充時遇到了一些麻煩。我嘗試着將一副牌加載到一個數組中,然後進行洗牌,然後在開始檢查後看看是否有足夠的牌,陣列無法正確加載,而且更重要或更少的中斷。Javascript Array未被正確填充

下面是相關的代碼。任何幫助將不勝感激。謝謝!

var deck = { 
    //base deck before shuffle 
    baseDeck: ['d02', 'd03', 'd04', 'd05', 'd06', 'd07', 'd08', 'd09', 'd10', 'd11', 'd12', 'd13', 'd14', 'h02', 'h03', 'h04', 'h05', 'h06', 'h07', 'h08', 'h09', 'h10', 'h11', 'h12', 'h13', 'h14', 'c02', 'c03', 'c04', 'c05', 'c06', 'c07', 'c08', 'c09', 'c10', 'c11', 'c12', 'c13', 'c14', 's02', 's03', 's04', 's05', 's06', 's07', 's08', 's09', 's10', 's11', 's12', 's13', 's14'], 
    //Deck Shoe 
    shoe: [], 

    //pull deck #, return to shoe 
    shuffleDeck: function() { 
     this.shoe.length = 0; 
     this.shoe = this.baseDeck; 

     for (i = 0; i < this.shoe.length; i++) { 
      var randomPlace = Math.floor(Math.random() * 50) + 1; 
      var currentPlace = this.shoe[i]; 
      this.shoe[i] = this.shoe[randomPlace]; 
      this.shoe[randomPlace] = currentPlace; 
     } 
     } 


} 

var cardRetrieval = { 

    //return card vals 
    getCard: function (curHand) { 
     var q = curHand.push(deck.shoe.shift()); 
     this.checkValue(curHand); 
     showCards(curHand, q); 
     if (deck.shoe.length <= 40) { 
      deck.shuffleDeck(); 
      } 
    } 

一切正常,直到if語句在底部,檢查鞋陣列中是否有40多張牌。但是當它試圖再次洗牌時,它會破裂。

回答

0

你的隨機數有兩個問題,1)它永遠不會是0 - 卡組中的第一張卡,以及2)它可能會超出數組大小。 使用這個代替:

var randomPlace = Math.floor(Math.random() * this.shoe.length); 
+0

感謝您的建議。這對我來說非常有意義。 – Bernard 2011-02-13 14:22:47

+1

你是否知道爲什麼當deck.shoe.length <= 40時,實際的shuffleDeck函數沒有被正確加載? – Bernard 2011-02-13 14:24:04

1

麻煩的是這個:

this.shoe.length = 0; 
this.shoe = this.baseDeck; 

你沒有使baseDeck副本shoe。相反,您將覆蓋對您爲shoe創建的空陣列的引用,並將其替換爲對baseDeck引用的相同陣列的引用。

因此,它是第一次洗牌,因爲this.shoe.length = 0尚未影響baseDeck。但是當你第二次洗牌時,你會破壞baseDeck。 (基本上,與第一洗牌,您是使用baseDeck,而不是它的一個副本。)

它改成這樣:

this.shoe.length = 0; 
this.shoe = this.baseDeck.slice(0); 

這將使baseDeck全新副本由shoe引用每一次。