从甲板处理卡片并从阵列中取出卡片

时间:2016-10-10 22:47:01

标签: javascript arrays playing-cards

我有一系列像这样的名片:

var deckNames = [ "unused",
  "sA", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10", "sJ", "sQ", "sK",
  "hA", "h2", "h3", "h4", "h5", "h6", "h7", "h8", "h9", "h10", "hJ", "hQ", "hK",
  "cA", "c2", "c3", "c4", "c5", "c6", "c7", "c8", "c9", "c10", "cJ", "cQ", "cK",
  "dA", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10", "dJ", "dQ", "dK",
  ];

我想编写一个从数组中随机选择一张卡的函数,并将其从上面的“deckNames”数组中删除。我写了以下内容,但它似乎没有起作用。

var deal = function(){
    var card = Math.floor(Math.random() * 52) + 1;
    return deckNames[card];
    deckNames.splice(card,1);
};

当我在控制台中运行deal函数时,它会从数组中随机选择并返回一张卡片,但deckNames数组本身并不会从阵列中删除已发出的卡片。我怎样才能做到这一点?谢谢。

3 个答案:

答案 0 :(得分:3)

它没有拼接,因为splice调用是死代码;这意味着它永远无法运行。

return后,您“退出”该功能。你需要在返回前拼接:

var deal = function(){
    var card = Math.floor(Math.random() * 52) + 1;
    deckNames.splice(card,1);
    return deckNames[card];
};

考虑:

var test = function(){
    console.log("Hello");
    return;
    console.log("World");
};

test();

你认为这些印刷品是什么?

编辑:

再次重读你的代码,我意识到如果你处理足够的卡片,仍然会出现一个重大问题。您已将52硬编码到您的功能中,但每次通话时都会移除一张卡。如果只有10张卡会发生什么,但随机数生成器会给你50?将52更改为deckNames.length以确保您不会尝试处理不存在的卡(这会导致“数组越界”错误)。

答案 1 :(得分:3)

您的return语句在修改卡组之前结束您的功能。切换语句,以便return是函数中的最后一个。另外,正如@DavidE指出的那样,你已经删除它后无法从阵列中获取该卡,所以你必须在删除它之前检索它:

var deal = function(){
    var index = Math.floor(Math.random() * 52) + 1;
    var card = deckNames[index];
    deckNames.splice(index, 1);
    return card;
};

或者简单地说:

var deal = function(){
    var card = Math.floor(Math.random() * 52) + 1;
    return deckNames.splice(card, 1)[0];
};

(因为splice返回被删除的元素,包装在一个新数组中)。

还需要考虑其他一些事项:

  • 数组索引从0开始,因此您可能不希望随机数生成器中的+1。你实际上想要0到51 *之间的数字:

    var card = Math.floor(Math.random() * 52);

  • 每次发牌都会减少牌组的大小。而不是每次生成最多51个随机数,而是在调用函数时将该数字基于卡座的大小。否则你会得到索引超出范围的错误。见下文。

最终,这会给你这样的东西:

var deal = function(){
    var card = Math.floor(Math.random() * deckNames.length);
    return deckNames.splice(card, 1)[0];
};

答案 2 :(得分:0)

首先,你可以摆脱你的string,然后检查出来:

"unused"

现在了解这一点:

function deal(deck){
  var card = Math.floor(Math.random()*deck.length); // notice you add the one later - that's not right
  return deck.splice(card, 1);
}
var pulledCard = deal(deckNames); // now deckNames array is altered