#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 или более ничьих подряд