从一副牌中发牌和从阵列中取出牌

Dealing Cards from a Deck and Removing the Cards from an Array

我有这样一组卡片名称:

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 函数时,它会从数组中随机选择并 returns 一张卡片,但是 deckNames 数组本身并没有得到发牌从阵列中移除。我怎样才能做到这一点?谢谢。

它不拼接,因为splice调用是死代码;这意味着它永远不可能 运行。

一旦你 return,你 "exit" 函数。返回前需要拼接:

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 以确保您没有尝试发牌(这将导致 "array out of bounds" 错误)。

您的 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 returns 删除的元素,包装在一个新数组中)。


其他一些需要考虑的事情:

  • 数组索引从 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];
};

首先,您可以摆脱您的 "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

现在学习这个:

function CardGame(deck){
  this.deck = deck;
  this.deal = function(){
    return this.deck.splice(Math.random()*this.deck.length, 1)[0];
  }
  this.shuffle = function(){{
    var l = this.deck.length;
    this.deck.sort(function(a, b){
      return 0.5 - Math.floor(Math.random()*(l+1))/l;
    });
    return this.deck;
  }
}
var game = new CardGame(deckNames);
var alteredDeck = game.shuffle(); // alteredDeck is same as game.deck;
var singleCard = game.deal(); // game.deck is spliced