我正在使用JavaScript创建一个口袋妖怪卡游戏,但不确定我是否以正确的方式进行操作



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)

我可以看到两个问题:

  1. 您正在调用 splice()错误(第一个参数需要是您要开始拼接的索引,第二个参数应为删除计数:https://developer.mozilla.org/en-us/docs/Web/javascript/reference/global_objects/array/splice)因此,您需要知道您正在随机选择的卡的索引。您可以修改randomCards()功能以实现这一目标。

  2. 您在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());

最新更新