Я изучаю JavaScript. Я нашел этот вопрос в Интернете и пытался это сделать.

Создайте 2 класса «Карта» и «Колода», которые будут представлять стандартную колоду из 52 игральных карт. Пример туз пик или 5 червей.

Класс карты, который принимает 2 параметра «масть» и «ранг» и сохраняет их как общедоступные свойства. Класс колоды имеет постоянный массив мастей [S, C, D, H]. Колода имеет постоянный массив рангов [2,3,4,5,6,7,8,9,10, J, Q, K, A]. В колоде есть пустой массив «карт»

При создании Deck заполните массив карт всеми 52 стандартными игральными картами, используя класс «Card».

Я сделал это только с классом Deck, перебирая массив в цикле. Но как это сделать с отдельным классом?

class Deck {
  suits = ["S", "C", "D", "H"];
  ranks = [2, 3, 4, 5, 6, 7, 8, 9, 10, "J", "Q", "K", "A"];
  constructor(suits, ranks) {
    this.suits = suits;
    this.ranks = ranks;
    this.cards = [];
  }
  getAllCards() {
    var cards = new Array();

    for (var i = 0; i < suits.length; i++) {
      for (var x = 0; x < cards.length; x++) {
        var card = {
          Value: cards[x],
          Suit: suits[i]
        };
        cards.push(card);
      }
    }
  }
  return cards;
}
1
amar 4 Дек 2020 в 21:13

1 ответ

Лучший ответ

Вы можете использовать класс Card вместо объекта для представления каждой карты.

class Card {
  constructor(suit, rank) {
    this.suit = suit;
    this.rank = rank;
  }
}
class Deck {
  static suits = ["S", "C", "D", "H"];
  static ranks = [2, 3, 4, 5, 6, 7, 8, 9, 10, "J", "Q", "K", "A"];
  constructor() {
    this.cards = this.getAllCards();
  }
  getAllCards() {
    var cards = [];

    for (var i = 0; i < Deck.suits.length; i++) {
      for (var j = 0; j < Deck.ranks.length; j++) {
        var card = new Card(Deck.suits[i], Deck.ranks[j]);
        cards.push(card);
      }
    }
    return cards;
  }
}
console.log(new Deck().cards);

Как предлагает Скотт Сойет, операции flatMap и map также могут применяться для большего краткий код.

class Card {
  constructor(suit, rank) {
    this.suit = suit;
    this.rank = rank;
  }
}
class Deck {
  static suits = ["S", "C", "D", "H"];
  static ranks = [2, 3, 4, 5, 6, 7, 8, 9, 10, "J", "Q", "K", "A"];
  constructor() {
    this.cards = Deck.suits.flatMap(suit => Deck.ranks.map(rank => new Card(suit, rank)));
  }
}
console.log(new Deck().cards);
1
iota 4 Дек 2020 в 23:32