Мой объект имеет свойство внутри него. но все же он выдает ошибку «Не удается прочитать свойство» значение «неопределенного»

#javascript

#javascript

Вопрос:

Я создаю карточную игру в войну на Javascript. Но при использовании Object.value ошибка не может прочитать свойство undefined. внутри этого объекта есть свойство. почему он читает undefined?

В этом коде, когда игрок 1 разыгрывает карту, она совпадает со значением карты игрока 2, и выигрывает тот, у кого более высокая карта. победитель забирает обе карты в свои руки. игра будет продолжаться до тех пор, пока у одного из игроков не будет 52 карты.

этот код дает несколько раз победителя. но в основном выдает ошибку, когда у одного из игроков карта больше 45. после этого он выдает ошибку

console.log( Игрок 1 разыгрывает $ {player1Card.value} из $ {player1Card.suit} ); ^

Ошибка типа: не удается прочитать свойство «значение» неопределенного

Ошибка в

класс Game -> метод turn ()

 let draw = false;
let cardOfPlayer1 = [];
let cardOfPlayer2 = [];

class Deck {
  constructor() {
    this.cards = [];
    ["spades","diamonds",'heart','clubs'].forEach(suit => {
      [2,3,4,5,6,7,8,9,10,11,12,13,14].forEach(value => {
        this.cards.push(new Card(suit, value));
      })
    })
  }

  shuffle() {
    let currentIndex = this.cards.length, temporaryValue, randomIndex;

    while (currentIndex !== 0) {
      randomIndex = Math.floor(Math.random() * currentIndex);
      currentIndex -= 1;
      temporaryValue = this.cards[currentIndex];
      this.cards[currentIndex] = this.cards[randomIndex];
      this.cards[randomIndex] = temporaryValue;
    }
  }
}

class Card {
  constructor(suit, value) {
    this.suit = suit;
    this.value = value;
  }
}

class Player {
  constructor() {
    this.hand = [];
  }
}

class Game {
  constructor(player1, player2, deck) {
    this.players = [player1, player2];
    this.deck = deck;
    this.done = false;
    this.deck.shuffle();
    
  }

  deal() {
    this.deck.cards.forEach((card, index) => {
      this.players[index % 2].hand.push(card);
    });

    console.log(this.players[0].hand, this.players[1].hand);
  }

  play() {
    let count = 0;
    while(!this.done) {
      console.log(`Turn #${count  }`);
      this.turn();
      this.checkWinner();
    }
  }

  turn() {
    const player1Card = this.players[0].hand.shift();
    const player2Card = this.players[1].hand.shift();

    console.log(`Player 1 plays a ${player1Card.value} of ${player1Card.suit}`);
    console.log(`Player 2 plays a ${player2Card.value} of ${player2Card.suit}`);

    if(player1Card.value > player2Card.value) {
      console.log(`Player 1 plays wins this hand`);
      if(!draw){
      this.players[0].hand.push(player1Card);
      this.players[0].hand.push(player2Card);
      }else{
        this.players[0].hand.push(player1Card);
        this.players[0].hand.push(player2Card);
        this.players[0].hand.concat(cardOfPlayer1);
        this.players[0].hand.concat(cardOfPlayer2);
        cardOfPlayer1 = [];
        cardOfPlayer2 = [];
        draw = false;
      }
      console.log(`Player 1 has ${this.players[0].hand.length} cards`);

    } else if(player1Card.value < player2Card.value){
      console.log(`Player 2 plays wins this hand`);
      if(!draw){
        this.players[1].hand.push(player2Card);
        this.players[1].hand.push(player1Card);
        }else{
          this.players[1].hand.push(player2Card);
          this.players[1].hand.push(player1Card);
          this.players[1].hand.concat(cardOfPlayer1);
          this.players[1].hand.concat(cardOfPlayer2);
          cardOfPlayer1 = [];
          cardOfPlayer2 = [];
          draw = false;
        }
      console.log(`Player 2 has ${this.players[1].hand.length} cards`);

    } else if(player1Card.value === player2Card.value){
      
       cardOfPlayer1.push(player1Card);
       cardOfPlayer2.push(player2Card);
      console.log(cardOfPlayer1);
      console.log(cardOfPlayer2);

      draw = true;
      this.turn();

    }
  }

  checkWinner() {
    if (this.players[0].hand.length === this.deck.length) {
      console.log('Player 1 Wins');
      this.done = true;
    } else if (this.players[1].hand.length === this.deck.length) {
      console.log('Player 2 Wins');
      this.done = true;
    }
  }
}

const game = new Game(new Player(), new Player(), new Deck())

game.deal();
game.play();  

Комментарии:

1. это дает игроку, у которого низкая карта в конце игры. тем не менее, у этого игрока есть карты, и он все равно выдает ошибку.

2. да, но я не понимаю, где эти карты исчезают.

3. Похоже, что-то не так с моим условием рисования, но не знаю, что

4. карты исчезают, когда за ничьей следует другая ничья

5. О, вы были правы, но я выполнил условие. сделал cardOfplayer1 массивом и вставил карты, а затем использовал concat (). с картами игрока 1, а затем очистил массив. Я обновил приведенный выше код, можете ли вы понять, почему он по-прежнему выдает ту же ошибку.

Ответ №1:

Ваш код сохраняет только 2 карты для розыгрыша — если у вас будет 2 розыгрыша подряд, вы просто потеряете карты

Вы также проверяете this.deck.длина, но это.deck — это экземпляр Deck — вам нужно проверить this.deck.cards .длина

Я бы предложил, чтобы checkWinner был

   checkWinner() {
    if (this.players[0].hand.length === 0 amp;amp; this.players[1].hand.length === 0) {
      console.log("It's a draw!!!!!");
    } else if (this.players[0].hand.length === 0) {
      console.log('Player 2 Wins');
      this.done = true;
    } else if (this.players[1].hand.length === 0) {
      console.log('Player 1 Wins');
      this.done = true;
    }
  }
}
  

потому что, если последняя раздача ничья, вы не увидите, что у одного игрока нет карт, так что, на самом деле, игрок выигрывает, когда у другого не осталось карт — что и будет делать приведенный выше код

Возможно, вы захотите придумать какую-то другую стратегию для своей логики, чтобы понять, что происходит, когда в этом случае происходит ничья

Существует также очень маловероятное, но статистически возможное обстоятельство, когда подряд 26 ничьих — т. Е. в какой-то момент игры, когда у обоих игроков 26 карт, затем подряд 26 ничьих … у обоих игроков останется ноль карт после последней ничьей … так что это (очень маловероятно) связь: p

Итак, ошибки исправлены ниже

  • не вызывайте this.turn() в условии рисования
  • сравните длину руки каждого игрока с 0, чтобы увидеть, выиграл ли другой
  • если это ничья, переместите текущие карты в массив
  • если это не ничья, извлеките массив ранее нарисованных карт из того места, где они хранятся, затем очистите эти массивы

 let draw = false;
let cardOfPlayer1 = [];
let cardOfPlayer2 = [];

class Deck {
  constructor() {
    this.cards = [];
    ["spades", "diamonds", 'heart', 'clubs'].forEach(suit => {
      [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14].forEach(value => {
        this.cards.push(new Card(suit, value));
      })
    })
  }

  shuffle() {
    let currentIndex = this.cards.length,
      temporaryValue, randomIndex;

    while (currentIndex !== 0) {
      randomIndex = Math.floor(Math.random() * currentIndex);
      currentIndex -= 1;
      temporaryValue = this.cards[currentIndex];
      this.cards[currentIndex] = this.cards[randomIndex];
      this.cards[randomIndex] = temporaryValue;
    }
  }
}

class Card {
  constructor(suit, value) {
    this.suit = suit;
    this.value = value;
  }
}

class Player {
  constructor() {
    this.hand = [];
  }
}

class Game {
  constructor(player1, player2, deck) {
    this.players = [player1, player2];
    this.deck = deck;
    this.done = false;
    this.deck.shuffle();

  }

  deal() {
    this.deck.cards.forEach((card, index) => {
      this.players[index % 2].hand.push(card);
    });

    //console.log(this.players[0].hand, this.players[1].hand);
  }
  play() {
    let count = 0;
    while (!this.done) {
      console.log(`Turn #${count  }`);
      this.turn();
      this.checkWinner();
    }
  }

  turn() {
    const player1Card = this.players[0].hand.shift();
    const player2Card = this.players[1].hand.shift();

    console.log(`Player 1 plays a ${player1Card.value} of ${player1Card.suit}`);
    console.log(`Player 2 plays a ${player2Card.value} of ${player2Card.suit}`);

    if (player1Card.value > player2Card.value) {
      console.log(`Player 1 plays wins this hand`);
      if (!draw) {
        this.players[0].hand.push(player1Card);
        this.players[0].hand.push(player2Card);
      } else {
        this.players[0].hand.push(player1Card);
        this.players[0].hand.push(player2Card);
        this.players[0].hand.push(...cardOfPlayer1.splice(0,26));
        this.players[0].hand.push(...cardOfPlayer2.splice(0,26));
        draw = false;
      }
      console.log(`Player 1 has ${this.players[0].hand.length} cards`);

    } else if (player1Card.value < player2Card.value) {
      console.log(`Player 2 plays wins this hand`);
      if (!draw) {
        this.players[1].hand.push(player2Card);
        this.players[1].hand.push(player1Card);
      } else {
        this.players[1].hand.push(player2Card);
        this.players[1].hand.push(player1Card);
        this.players[1].hand.push(...cardOfPlayer1.splice(0,26));
        this.players[1].hand.push(...cardOfPlayer2.splice(0,26));
        draw = false;
      }
      console.log(`Player 2 has ${this.players[1].hand.length} cards`);

    } else if (player1Card.value === player2Card.value) {
      console.log('Draw');
      cardOfPlayer1.push(player1Card);
      cardOfPlayer2.push(player2Card);
      draw = true;
      //this.turn();

    }
  }

  checkWinner() {
    if (this.players[0].hand.length === 0 amp;amp; this.players[1].hand.length === 0) {
      console.log("It's a draw!!!!!");
    } else if (this.players[0].hand.length === 0) {
      console.log('Player 2 Wins');
      this.done = true;
    } else if (this.players[1].hand.length === 0) {
      console.log('Player 1 Wins');
      this.done = true;
    }
  }
}

const game = new Game(new Player(), new Player(), new Deck())

game.deal();
game.play();  

Ответ №2:

Это происходит потому shift() , что удаляет первый элемент массива.

Комментарии:

1. Да, вот почему я его использовал. но все же у этого игрока есть карты в качестве свойства. эта ошибка должна появиться после того, как у одного игрока будет 52 карты, а у другого — ноль карт. но эта ошибка возникает, когда у одного игрока 44-48 карт, а у другого осталось 8-4 карты.

2. but this error comes on when one player has 44-48 cards and other has 8-4 cards remaining вы предполагаете, что у другого игрока — поскольку вы показываете только, сколько карт у игрока с выигрышной комбинацией — @AbhijeetBrahmbhatt — и, как я вам показал, карты исчезают, когда у вас 2 или более ничьих подряд