2017-11-06 17 views
2

ich in ein Problem bin mit der Berechnung, ob der Ace Wert 1 sein soll oder 11.Programmierung Asse in JavaScript

Zum Beispiel: Hand ({Wert: 11, Anzug: 2}, {Wert: 3 , Farbe: 1}); // Ace-3 könnte 4 oder 14 sein, abhängig von der nächsten Karte, die kommt

meine aktuelle Berechnung behandelt das nicht und ich kann nicht scheinen, mit einer Möglichkeit zu kommen, es zu implementieren.

Erstbefüllung ich ein Array mit Kartenobjekten

function fillDeck(numDecks, deck){ 
    cardNum = 0; 
    for(let i =0;i <= numDecks -1; i++){ 
     for(let s = 1; s<=4; s++){ 
      for(let v = 2; v <= 14; v++){ 
       cardType = calcCard(v); 
       value = calcValue(v); 
       suit = calcSuit(s); 
      deck[cardNum] = new Card(value, s, 'img/cards/' + cardType + '_' + 'of_' + suit + '.png'); 
      cardNum++; 
      } 
     } 
    } 
} 
Deck = []; 
fillDeck(5, Deck); 

Deal Karten:

function dealCards(player, dealer, deck){ 
    player.push(deck.pop()); 
    dealer.push(deck.pop()); 
    player.push(deck.pop()); 
    dealer.push(deck.pop()); 

} 

Dann ist meine Art und Weise ein Hands

function calcHand(Hand){ 
    var handValue = 0; 
    for(let hand of Hand){ 
     handValue += hand.value; 
    } 
    return handValue; 
} 

dies einfach nur zu berechnen, gibt den Wert 14.

so auf dem nächsten Hit

Hand.push(Deck.pop()); 

ich eine neue Karte auf die Hand

Hand({value: 11, suit: 2}, {value: 3, suit: 1}, {value: 2, suit: 1}); 

jetzt hinzufügen, die Hand ist 16.06

Aber was, wenn die 3. oder 4. Karte ist ein Ass ? Hier komme ich immer wieder auf ein Problem mit der Lösung dieses Problems zu sprechen.

Meine aktuelle Lösung ist:

while(calcHand(playerHand) <=16 && dealerHand[1].value > 6 | calcHand(playerHand) <12) 
    { 
      var currentCard = Deck.pop(); 


      if(currentCard.value === 11 && calcHand(playerHand) < 11){ 
       currentCard.value = 11; 
       console.log("Ace = 11 : Value : " + currentCard.value); 

      }else if(currentCard.value === 11 && calcHand(playerHand) >= 11){ 
       currentCard.value = 1; 
       console.log("Ace = 1 : Value : " + currentCard.value); 
      } 
      if(hasAce && (calcHand(playerHand) + currentCard.value) > 21 && 
       playerHand.map(x => x.value).indexOf(11) > -1){ 
       var acePosition = playerHand.map(x => x.value).indexOf(11); 
       playerHand[acePosition].value = 1; 

      } 
     playerHand.push(currentCard); 
     } 
+0

Ihre Summierungslogik muss speziell über Asse wissen. Dein erster Pass sollte Asse als ihren maximalen Wert zählen (11) und wenn du über das Limit schiebst, dann klopfe einen runter auf 1. Wenn du immer noch über dem Limit bist, klopfe den nächsten auf 1 und so weiter. Entweder das oder Sie berechnen alle möglichen Summen, die Ihre Hand haben könnte, und basieren Ihre Spielentscheidung auf der Grundlage der besten Summe. – jfriend00

+0

Haben Sie versucht, das Ass als Array zu definieren? [1, 11] '? – guest271314

+0

Wenn der Spieler keinen Treffer mehr möchte, muss er wählen, was er für den Ace-Wert haben möchte. – PHPglue

Antwort

0

Handhabung Asse im Blackjack ist einfach, wenn Sie erkennen, dass es nie eine Wahl. Die Regeln sind:

  1. Aces zählen eins. Zeitraum. Jetzt summiere die Hand.
  2. Wenn die Summe weniger als 12 ist, UND die Hand mindestens ein Ass enthält, 10 hinzufügen und als "weich" markieren.

Fertig.

Verwandte Themen