首页 > 解决方案 > asignCards() 函数应该将卡片数组中的随机卡片分配给每个玩家

问题描述

这个 asignCards() 函数应该将卡片数组中的随机卡片分配给每个玩家。这些卡片不应该重复,但我得到重复的卡片。

// 对于玩家数组中的每个玩家,每个玩家都会收到两张牌。

    const asignCards = () => {
      players.forEach((player) => {
        let useCards = [];
        let inUse = cards;

        for (let i = 0; i < 1; i++) {
          let random = Math.floor(Math.random() * 52);
          let random2 = Math.floor(Math.random() * 52);
          if (
            useCards.indexOf(JSON.stringify(inUse[random])) === -1 ||
            useCards.indexOf(JSON.stringify(inUse[random2])) === -1 ||
            useCards.indexOf(JSON.stringify(inUse[random])) !==
            useCards.indexOf(JSON.stringify(inUse[random2]))
          ) {
            player.card1 = inUse[random];
            player.card2 = inUse[random2];
           useCards.push(JSON.stringify(player.card1));
          useCards.push(JSON.stringify(player.card2));
          }else {
            i--;
          }
        }
        console.log(player);
      });
   };

   asignCards();

标签: json

解决方案


您应该useCards在循环之外声明您的数组,否则每次迭代都会为空。这么说来,你不能为一个玩家重复,但同一张牌可以分配给更多的玩家。

    const asignCards = () => {

      let useCards = [];

      players.forEach((player) => {
        let inUse = cards;
        for (let i = 0; i < 1; i++) {
          let random = Math.floor(Math.random() * 52);
          let random2 = Math.floor(Math.random() * 52);
          if (
            useCards.indexOf(JSON.stringify(inUse[random])) === -1 ||
            useCards.indexOf(JSON.stringify(inUse[random2])) === -1 ||
            useCards.indexOf(JSON.stringify(inUse[random])) !==
            useCards.indexOf(JSON.stringify(inUse[random2]))
          ) {
            player.card1 = inUse[random];
            player.card2 = inUse[random2];
           useCards.push(JSON.stringify(player.card1));
          useCards.push(JSON.stringify(player.card2));
          }else {
            i--;
          }
        }
        console.log(player);
      });
   };

   asignCards();

奖励:您可能希望使用 double 将您的函数重命名为 assignCards (来自assigns


更新:这是一种不同的方法。每次你想玩时,你先洗牌,然后从牌堆顶部用 选择你的牌数量Array.pop(),这样你就 100% 确定不会有重复的牌。

let players = ["A", "B", "C", "D"];
let cards = [...Array(52).keys()];
const cardsPerPlayer = 2;

const asignCards = () => {

  // Shuffle deck
  var n = cards.length;
  while (n--) {
    var i = Math.floor(n * Math.random());
    var tmp = cards[i];
    cards[i] = cards[n];
    cards[n] = tmp;

  }

  players.forEach((player, index) => {
    let myCards = [];
    for (c = 0; c < cardsPerPlayer; c++) {
      myCards.push(cards.pop());
    }

    console.log(`${player} has the following cards: ${myCards}`);
  });
};

asignCards();


推荐阅读