我在正确填充数组时遇到了一些麻烦。我试图将一副卡片加载到一个阵列然后洗牌,最初工作正常,但是,在我检查是否有足够的卡片后,阵列无法正常加载,等等或者更少的休息。
这是相关代码。任何帮助将不胜感激。谢谢!
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)
麻烦在于:
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
引用。
答案 1 :(得分:0)
随机数存在2个问题,1)它永远不会是0
- 卡片中的第一张卡片,2)它可能会超出数组大小。
请改用:
var randomPlace = Math.floor(Math.random() * this.shoe.length);