如何解决相同的值传递到单独的对象的数组
我正在尝试制作纸牌游戏,并且我包含了大部分代码,因为老实说我不确定是什么原因造成的,尽管我会尝试尽可能具体。当与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
,并且情况应该是0
,1
和2
。
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))