Строковое представление объекта — колода карт

#javascript #card #deck.js

#javascript #карта #deck.js

Вопрос:

Я хочу создать функцию, содержащую две строковые переменные, и вернуть комбинацию каждой карте колоды.

     playCard({ suit: 'HEARTS', value: 2 }) to return 2playCard({ suit: 'SPADES', value: 10 }) to return T♠
    playCard({ suit: 'SPADES', value: 11 }) to return J♠
  

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

1. { suit: 'HEARTS', value: 1 } — это даже не правильная функция

Ответ №1:

Вы могли бы сделать это с помощью 2 простых таблиц поиска или ассоциативных массивов

 const suitsMap = {
  'HEARTS' : '♥',
  'SPADES' : '♠'
  // etc
}

const valuesMap = {
  2 : '2',
  10: 'T',
  11: 'J'
  // etc
}

function playCard({value,suit}){
  return valuesMap[value]   suitsMap[suit];
}

console.log(playCard({ suit: 'HEARTS', value: 2 }))
console.log(playCard({ suit: 'SPADES', value: 10 }))
console.log(playCard({ suit: 'SPADES', value: 11 }))  

playCard можно было бы также написать так:

 function playCard(card){
  return valuesMap[card.value]   suitsMap[card.suit];
}
  

В моем примере выше он просто использовал назначение деструктурирования объекта: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment

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

1. поиск значений должен быть только 1,10,11,12,13 … затем вы используете values[value]||value.toString()

2. @JaromandaX вы могли бы это сделать, да. Я лично предпочел бы простоту и прозрачность наличия таблицы поиска всего из 13 значений.

3. хороший момент — я придерживаюсь старой школы — минимизируйте код, не теряя слишком много ясности (и хорошее имя переменной для значений «map» прояснило бы намерение): p

4. Спасибо. здорово, что это хорошо объяснено! очень признателен

5. @learnjspsde существует только 1 аргумент. Его ваш объект { suit: 'HEARTS', value: 2 } просто деконструирует свойства объекта. Смотрите developer.mozilla.org/en-US/docs/Web/JavaScript/Reference /… — смотрите обновленный ответ.

Ответ №2:

Я написал карточную игру, чтобы поделиться ею со своими друзьями, которые играли лично до эпидемии. Он использует firebase для состояния игроков в реальном времени и использует эти классы карт и колод, к которым вы можете присоединиться.

Ответ на отображение карты в виде строки ( asString() ) соответствует вполне приемлемому уже опубликованному ответу, ищущему масть и значение в карте.

Иногда у нас слишком много игроков, играющих в большие карточные игры, поэтому я добавил a deckId к объекту Card и позволил объекту Deck работать с несколькими «ботинками».

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

  static isEqual(card) {
    return this.value === card.value amp;amp; this.suit === card.suit amp;amp; this.deckId === card.deckId
  }

  asString() {
    const valueNames = { 1:'A', 2:'2', 3:'3', 4:'4', 5:'5', 6:'6', 7:'7', 8:'8', 9:'9', 10:'19', 11:'J', 12:'Q', 13:'K' }
    // feel free to replace these with unicode equivalents (my UI uses images)
    const suitNames = { 'h': 'hearts', 'd': 'diamonds', 'c':'clubs', 's':'spades' }
    return `${valuesNames[this.value]} of ${suitNames[this.suit]}`
  }
}

class Deck {
  constructor() {
    this.deckId = this.randomId()
    this.cards = this.freshDeck()
  }

  static randomId () {
    let chars ='abcdefghijklmnopqrstuvwxyz0123456789'.split('')
    this.shuffle(chars)
    return chars.join('').substring(0,8)
  }

  freshDeck () {
    let cards = []
    let suits = ['h', 'c', 'd', 's']
    suits.forEach(suit => {
      for (let value = 1; value <= 13; value  ) {
        cards.push(new Card(suit, value, this.deckId))
      }
    })
    return cards
  }

  // fischer-yates shuffle
  static shuffle (array) {
    let currentIndex = array.length, temp, randomIndex;
    while (0 !== currentIndex) {
      randomIndex = Math.floor(Math.random() * currentIndex)
      currentIndex -= 1
      temp = array[currentIndex]
      array[currentIndex] = array[randomIndex]
      array[randomIndex] = temp
    }
  }

  shuffle () {
    Deck.shuffle(this.cards)
    return this
  }

  dealOne () {
    if (this.cards.length === 0) {
      this.deckId = this.randomId()
      this.cards = this.freshDeck()
      this.shuffle()
    }
    let card = this.cards[0]
    this.cards = this.cards.slice(1)
    return card
  }
}