相同的值传递到单独的对象的数组

如何解决相同的值传递到单独的对象的数组

我正在尝试制作纸牌游戏,并且我包含了大部分代码,因为老实说我不确定是什么原因造成的,尽管我会尝试尽可能具体。当与3个玩家一起玩时,它们被存储为每个带有“手”数组的对象,我将所有这些玩家对象推入了名为humanPlayers的数组中。我的问题虽然存在于DealCards函数中。它成功地将牌从卡组阵列推入玩家对象手阵列。我的问题是,在DealCards的switch语句中,当我希望它们成为独立的卡时,它会将相同的7张卡推入每个对象。我有console.log()dealtCards,每次要将它们推入玩家数组时似乎都是7张不同的牌,但最终却总是给所有手牌分配相同的7张牌?感谢您的任何帮助或建议。

|         Method |      Mean |    Error |   StdDev |
|--------------- |---------- |--------- |--------- |
| DeclaredFields |  94.12 ns | 0.878 ns | 0.778 ns |
|       GetNames |  47.15 ns | 0.554 ns | 0.491 ns |
|      GetValues | 671.30 ns | 5.667 ns | 4.732 ns |

解决方法

问题在于players数组中的所有player对象都是对同一对象的引用。检查添加这些内容的循环,您将添加两次Player1,三次添加Player2或四次Player3

解决此问题的一种简单方法是删除let Player1 = new player();等,然后直接将new player()放入该循环内的push方法中。 (然后switch也变得毫无意义。)这确保了播放器对象是完全不同的。

,

问题是您的switch/case语句要填写humanPlayers。您正在使用initializePlayers作为变量来在每次循环中进行测试。始终为3,因此您需要向阵列中添加Player3

您应该测试j,并且情况应该是012

let deck = [
  "r0","r1","r2","r3","r4","r5","r6","r7","r8","r9","rSkip","rReverse","r+2","b0","b1","b2","b3","b4","b5","b6","b7","b8","b9","bSkip","bReverse","b+2","g0","g1","g2","g3","g4","g5","g6","g7","g8","g9","gSkip","gReverse","g+2","y0","y1","y2","y3","y4","y5","y6","y7","y8","y9","ySkip","yReverse","y+2","Wild","Wild+4","Wild+4"
];

function shuffleDeck() {
  for (let i = 0; i <= deck.length; i++) {
    let randomNum = Math.floor(Math.random() * deck.length);
    deck.splice(randomNum,deck[0]);
    deck.splice(0,1,deck[randomNum + 1]);
    deck.splice(randomNum + 1,1);
  }
}

function player() {
  this.hand = [];
};

let Player1 = new player();
let Player2 = new player();
let Player3 = new player();

let humanPlayers = [];

//initialize the participants
initializePlayers = prompt("How many players? (1-4)");

if (initializePlayers < 4) {
  let initializeString2Num = parseInt(initializePlayers);
  for (let j = 0; j < initializeString2Num; j++) {
    //pushing human objects into array
    switch (j) {
      case 0:
        humanPlayers.push(Player1);
        break;
      case 1:
        humanPlayers.push(Player2);
        break;
      case 2:
        humanPlayers.push(Player3);
        break;
    }
  }
}
shuffleDeck();
dealCards(humanPlayers.length);

function dealCards(humans) {
  console.log("number of humans to deal to " + humanPlayers.length);

  switch (humans) {
    case 3:
      let dealtCard;
      console.log("case 3");
      for (let l = 0; l <= 7; l++) {
        if (l <= 6) {
          dealtCard = deck.shift();
        }
        if (humanPlayers[0].hand.length <= 6) {
          humanPlayers[0].hand.push(dealtCard);
          console.log(dealtCard);
        }
      }

      for (let m = 0; m <= 7; m++) {
        if (m <= 6) {
          dealtCard = deck.shift();
        }
        if (humanPlayers[1].hand.length <= 6) {
          humanPlayers[1].hand.push(dealtCard);
          console.log(dealtCard);
        }
      }
      for (let n = 0; n <= 7; n++) {
        if (n <= 6) {
          dealtCard = deck.shift();
        }
        if (humanPlayers[2].hand.length <= 6) {
          humanPlayers[2].hand.push(dealtCard);
          console.log(dealtCard);
        }
      }
      break;
  }
}

console.log(humanPlayers);

,

您的代码有点不清楚,似乎您的分配玩家在询问有多少人在玩之前,然后以复杂的方式发牌。

您有多张同等价值的卡,因此您会得到一些重复。

下面是一个简化的重写,它将产生与n *个玩家相同的结果。

// deck
const deck = {
  cards: [
    "r0","Wild+4"
  ],shuffle() {
    for (let i = this.cards.length - 1; i > 0; i--) {
      const j = Math.floor(Math.random() * (i + 1));
      [this.cards[i],this.cards[j]] = [this.cards[j],this.cards[i]];
    }
    return this.cards;
  }
}

// table
const table = []

// player
function player() {
  this.hand = []
  return this
}

// amount of cards to deal
const card_count = 3

// ask players
let player_count = 0
if (player_count = parseInt(prompt("How many players? (1-4)",1),10)) {

  // shuffle deck
  const cards = deck.shuffle()

  // create players and deal cards 
  for (let i = 1; i <= player_count; i++) {
    // new player
    let plr = new player()
    // assign player cards from shuffle deck
    plr.hand = cards.slice((i - 1) * card_count,((i - 1) * card_count) + card_count)

    // add player to table
    table.push(plr)
  }
}

console.log(JSON.stringify(table))

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?