Javascript - цикл по объекту со свойством массива - PullRequest
1 голос
/ 29 апреля 2019

Я пробую простую игру в блэкджек с JS. Вот некоторые из моих кодов:

 function card(suit, face) {
    this.suit = suit;
    this.face = face;

    switch (face) {
        case "A":
            this.faceValue = 11;
            break;
        case "J":
        case "Q":
        case "K":
            this.faceValue = 10;
            break;
        default:
            this.faceValue = parseInt(face);
            break;
    }
};

const player = {
    cards: [],
    handValue: 0
}

const dealOneCardToPlayer = () => {     
    tempCard = deck.cards.splice(0, 1);
    player.cards.push(tempCard);
    player.handValue = countHandValue(player.cards);
}

Я застрял с методом countHandValue, который мне не удалось получить faceValue Cards для объекта игрока. Я пробую несколько типов для цикла, но безуспешно. Как только я смогу получить faceValue, я могу суммировать его и присвоить свойству handValue.

const countHandValue = (cardsOnHand) => {    
    for (const key of cardsOnHand) {
        console.log(key.faceValue);
    }

    for (const key in cardsOnHand) {
        console.log(key.faceValue);
    }
}

[Код отредактирован] Я искал и нашел этот код, который я могу извлечь из своего свойства faceValue, но я считаю, что есть много дополнительного кода:

    const countHandValue = (cardsOnHand) => {
    let sum = 0;
    for (var key in cardsOnHand) {
        var arr = cardsOnHand[key];
        for (var i = 0; i < arr.length; i++) {
            var obj = arr[i];
            for (var prop in obj) {
                if (prop === "faceValue") {
                    console.log(prop + " = " + obj[prop]);
                    sum = sum + obj[prop];                        
                }                    
            }
        }
    }        
    return sum;
}

Ответы [ 2 ]

1 голос
/ 29 апреля 2019

Учтите, что A может быть оценен как 1 или 11. Эта программа показывает вам, как с этим справиться -

const add = (x = 0, y = 0) =>
  x + y

const sum = (a = []) =>
  a .reduce (add, 0)

const scoreCard = (face = "") =>
  face === "A"
    ? [ 11, 1 ]
: (face === "K") || (face === "Q") || (face === "J")
    ? [ 10 ]
: [ Number (face) ]

const allScores = ([ face = "", ...more ]) =>
  face === ""
    ? [ scoreCard (face) ]
    : allScores (more)
        .flatMap
          ( hand =>
              scoreCard (face) .map (v => [ v, ...hand ])
          )

const scoreHand = (...hand) =>
{ const [ best = "Bust" ] =
    allScores (hand)
      .map (sum)
      .filter (score => score <= 21)
  
  if (best === 21)
    return "Blackjack!"
  else
    return String (best)
}

console .log
  ( scoreHand ("A", "K")                     // Blackjack!
  , scoreHand ("A", "A", "K")                // 12
  , scoreHand ("A", "A", "K", "7")           // 19
  , scoreHand ("J", "4", "K")                // Bust
  , scoreHand ("A", "A", "A", "A", "K", "7") // Blackjack!
  )
1 голос
/ 29 апреля 2019

Вы можете просто использовать reduce:

const coundHandValue = cards => cards.reduce((acc, { faceValue }) => acc + faceValue, 0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...