player1和player2都应该从数组中接收3个随机卡。绘制卡片后,应丢弃卡片。我无法将3张随机卡收到玩家卡[]并丢弃。剪接是完成此操作的最佳方法吗?
let pokemonCards =
[
{ name: "Bulbasaur", damage: 60 },
{ name: "Caterpie", damage: 40 },
{ name: "Charmander", damage: 60 },
{ name: "Clefairy", damage: 50 },
{ name: "Jigglypuff", damage: 60 },
{ name: "Mankey", damage: 30 },
{ name: "Meowth", damage: 60 },
{ name: "Nidoran - female", damage: 60 },
{ name: "Nidoran - male", damage: 50 },
{ name: "Oddish", damage: 40 },
{ name: "Pidgey", damage: 50 },
{ name: "Pikachu", damage: 50 },
{ name: "Poliwag", damage: 50 },
{ name: "Psyduck", damage: 60 },
{ name: "Rattata", damage: 30 },
{ name: "Squirtle", damage: 60 },
{ name: "Vulpix", damage: 50 },
{ name: "Weedle", damage: 40 }
]
// assign AI to player1 and player 2
// They should each draw 3 cards
let player1 = {
cards: [],
}
let player2 = {
cards: [],
}
//functions
let randomCard = function(){
return randomCardValue = pokemonCards[Math.floor(Math.random()*pokemonCards.length)]
}
let drawCards = function(){
for(i = 0; i < 3; i++){
player1.cards.push(randomCard())
pokemonCards.splice(randomCard(),1)
}
}
drawCards()
尝试一下。我将随机选择的卡存储,然后使用剪接()从甲板上卸下卡,然后将卡推入玩家的手中。它应该起作用。
let pokemonCards =
[
{ name: "Bulbasaur", damage: 60 },
{ name: "Caterpie", damage: 40 },
{ name: "Charmander", damage: 60 },
{ name: "Clefairy", damage: 50 },
{ name: "Jigglypuff", damage: 60 },
{ name: "Mankey", damage: 30 },
{ name: "Meowth", damage: 60 },
{ name: "Nidoran - female", damage: 60 },
{ name: "Nidoran - male", damage: 50 },
{ name: "Oddish", damage: 40 },
{ name: "Pidgey", damage: 50 },
{ name: "Pikachu", damage: 50 },
{ name: "Poliwag", damage: 50 },
{ name: "Psyduck", damage: 60 },
{ name: "Rattata", damage: 30 },
{ name: "Squirtle", damage: 60 },
{ name: "Vulpix", damage: 50 },
{ name: "Weedle", damage: 40 }
]
// assign AI to player1 and player 2
// They should each draw 3 cards
let player1 = {
cards: [],
}
let player2 = {
cards: [],
}
//functions
let randomCard = function(){
return randomCardValue = pokemonCards[Math.floor(Math.random()*pokemonCards.length)]
}
let drawCards = function(){
for(i = 0; i < 3; i++){
let selectedRandomCard = pokemonCards.splice(randomCard(),1)[0];
console.log(selectedRandomCard);
player1.cards.push(selectedRandomCard);
}
}
drawCards()
我建议整理甲板。那么,您不必担心跟踪任何内容。您可以像在真实甲板中一样流行卡。
这是关于改组的标准堆栈溢出答案,我在下面(精神)使用了。如果需要,您可以在循环中 pop()
取下卡片。但是下面使用Array.from()
,这是一种不明确循环的数组的快速方法:
// shuffles the deck in place
function shuffle(array) {
var currentIndex = array.length;
while (0 !== --currentIndex) {
let randomIndex = Math.floor(Math.random() * currentIndex);
[array[currentIndex], array[randomIndex]] = [array[randomIndex], array[currentIndex]];
}
return array;
}
let pokemonCards =
[
{ name: "Bulbasaur", damage: 60 },
{ name: "Caterpie", damage: 40 },
{ name: "Charmander", damage: 60 },
{ name: "Clefairy", damage: 50 },
{ name: "Jigglypuff", damage: 60 },
{ name: "Mankey", damage: 30 },
{ name: "Meowth", damage: 60 },
{ name: "Nidoran - female", damage: 60 },
{ name: "Nidoran - male", damage: 50 },
{ name: "Oddish", damage: 40 },
{ name: "Pidgey", damage: 50 },
{ name: "Pikachu", damage: 50 },
{ name: "Poliwag", damage: 50 },
{ name: "Psyduck", damage: 60 },
{ name: "Rattata", damage: 30 },
{ name: "Squirtle", damage: 60 },
{ name: "Vulpix", damage: 50 },
{ name: "Weedle", damage: 40 }
]
function deal(num_of_cards){
// return an array of n cards
return Array.from({length:num_of_cards}, () => pokemonCards.pop())
}
// randomize the deck order:
shuffle(pokemonCards)
console.log("deck length: ", pokemonCards.length)
// players should be in a datastructure of some sort
// not individual variables
let players = []
players.push({name: "player 1", cards: deal(3)})
players.push({name: "player 2", cards: deal(3)})
console.log(players[0])
console.log(players[1])
// double check deck length
console.log("deck length: ", pokemonCards.length)
我可以看到两个问题:
-
您正在调用
splice()
错误(第一个参数需要是您要开始拼接的索引,第二个参数应为删除计数:https://developer.mozilla.org/en-us/docs/Web/javascript/reference/global_objects/array/splice)因此,您需要知道您正在随机选择的卡的索引。您可以修改randomCards()
功能以实现这一目标。 -
您在
drawCards
函数中两次调用randomCards
,这两者都返回不同的结果。为了保持一致性在每个循环中一次调用,请将结果分配给一个变量,并在按下和拼接时使用该变量。
我相信以下片段可以执行您想要的代码:
//functions
let randomCard = function() {
let randomCardIndex = Math.floor(Math.random() * pokemonCards.length)
let randomCardValue = pokemonCards[randomCardIndex]
return [randomCardIndex, randomCardValue]
}
let drawCards = function() {
for(i = 0; i < 3; i++){
let card = randomCard();
player1.cards.push(card[1])
pokemonCards.splice(card[0], 1)
}
}
使用此解决方案,并非所有内容都是全球性的,就像游戏一样重要……但是,除了那些东西,我会说使用剪接可能是最好的方法,这是简单,易于阅读等...
我还花时间为您创建一个config
对象,我的意思是您可能喜欢它,不喜欢它,那是您的喊叫,我只是这样做了,因为我喜欢这样看到它。
const PokemonApp = function(myNameSpace) {
const publicProps = {};
const config = {
cards: [
{ name: "Bulbasaur", damage: 60 },
{ name: "Caterpie", damage: 40 },
{ name: "Charmander", damage: 60 },
{ name: "Clefairy", damage: 50 },
{ name: "Jigglypuff", damage: 60 },
{ name: "Mankey", damage: 30 },
{ name: "Meowth", damage: 60 },
{ name: "Nidoran - female", damage: 60 },
{ name: "Nidoran - male", damage: 50 },
{ name: "Oddish", damage: 40 },
{ name: "Pidgey", damage: 50 },
{ name: "Pikachu", damage: 50 },
{ name: "Poliwag", damage: 50 },
{ name: "Psyduck", damage: 60 },
{ name: "Rattata", damage: 30 },
{ name: "Squirtle", damage: 60 },
{ name: "Vulpix", damage: 50 },
{ name: "Weedle", damage: 40 }
],
cardLimit: 3,
players: [{ cards: [] }, { cards: [] }]
};
publicProps.getPlayer1 = () => { return {...config.players[0]} };
publicProps.getPlayer2 = () => { return {...config.players[1]} };
publicProps.getCards = () => { return [...config.cards] };
const randomCard = () => {
const index = Math.floor(Math.random() * config.cards.length);
return {
index: index,
card: config.cards[index]
}
};
publicProps.drawCards = () => config.players.map(p =>
Array.from({length: config.cardLimit}, () => {
const cardObject = randomCard();
p.cards.push(cardObject.card);
config.cards.splice(cardObject.index, 1);
}));
myNameSpace.launch = () => {
console.log('Launching App...');
return publicProps;
};
return myNameSpace;
}({});
const app = PokemonApp.launch();
console.log(app.getCards()); // before.
app.drawCards();
console.log(app.getCards()); // after.
console.log(app.getPlayer1());
console.log(app.getPlayer2());