2017-12-29 65 views
4

Ich erstelle ein grundlegendes Kartenspiel (21) in JavaScript, wo jeder Spieler eine Hand der Karten hat. Die Spieler beginnen mit 2 Karten, aber ich möchte abhängig vom Gesamtwert der Karten neue Karten hinzufügen und anpassen, ob ein As vorhanden ist oder nicht.Kartenspiel in Javascript, Konstruktor Funktion Fehler

Leider bekomme ich diesen Fehler: FATAL ERROR: CALL_AND_RETRY_LAST Zuweisung fehlgeschlagen - JavaScript-Heap nicht genügend Arbeitsspeicher. Ich denke das Problem muss mit der this.newCard Methode, ich kann einfach nicht verstehen, warum es nicht funktioniert.

function Hand() { 
    this.cards = [] 
    this.cardsAtStart = function() { 
     this.cards.push(new DealCards, new DealCards) 
     return this.cards 
    } 
    this.checkValue = function() { 
     let cardsInHand = this.cardsAtStart() 

     let ace = false 
     let value = 0 
     for (let i = 0; i < cardsInHand.length; i++) { 
      if (cardsInHand[i].cardnumber === 'A' && !ace) { 
       ace = true 
       value = value + 13 
      } 
      value = value + cardsInHand[i].cardvalue 
     } 
     if (ace && value > 21) { 
      value = value - 13 
     } 
     console.log(value) 

     return value 
    } 
    this.newCard = function() { 
     let value = this.checkValue() 
     console.log(value) 
     while (value < 15) { 
      this.cards.push(new DealCards) 
     } 
     if (value > 15) { 
      endGame() 
     } 
     console.log(this.cards) 
    } 
} 

Eine Karte Objekt sieht wie folgt aus: { suit: '♦', cardnumber: 'K', cardvalue: 13 }

+2

wo Ihre break-Anweisung innerhalb der while ist 'while (Wert < 15) { this.cards.push (neue DealCards) } ' –

+0

Wie sieht Ihre Konsolenausgabe aus? wahrscheinlich eine unendliche while-Schleife –

+0

Verpassen Sie das Semikolon ';' absichtlich? – Ivan86

Antwort

2

Sie überprüfen den Wert nicht jede Schleife:

this.newCard = function() { 
    let value = this.checkValue() 
    console.log(value) 
    while (value < 15) { 
     this.cards.push(new DealCards); 
     // check value again here! 
     value = this.checkValue() 
    } 
    if (value > 15) { 
     endGame() 
    } 
    console.log(this.cards) 
} 

Aber auch Checkvalue ändern, um die cardsAtStart zu bewegen draußen aus und in den Konstruktor.

Alternativ können Sie den Wert wie folgt aus:

while (value < 15) { 
    this.cards.push(new DealCards); 
    value = this.cards.reduce((all, current) => all + current.cardvalue, 0), 
} 

Scratch, dass die Ace Logik Verwirrungen mit meinem Minderer. Bleib beim ursprünglichen Plan. Verschieben Sie den Aufruf von cardsAtStart in die Konstruktormethode. Verwenden Sie checkValue, um den Wert zu überprüfen.

2

Sie werden nie die while Schleife verlassen, weil value wird sich nicht ändern:

while (value < 15) { 
    this.cards.push(new DealCards) 
} 

Sie benötigen die value Variable innerhalb der sich ändern while Schleife so kann der Zustand sein false.

Etwas wie folgt aus:

while (value < 15) { 
    this.cards.push(new DealCards); 
    value++; 
} 
+1

Danke für den Downvote, ich denke, meine Antwort ist falsch. Bitte erklären Sie, warum sollte das OP ** NOT ** den "Wert" erhöhen und aus einer Endlosschleife ausbrechen? –

0

Sie diesen Fehler, weil Sie hier in einer Endlosschleife an dieser Linie stecken,

while (value < 15) { 
    this.cards.push(new DealCards) 
} 

Das Problem ist, der Wert ist nie größer als 15 wenn diese Funktion läuft, wiederholt sie sich einfach.

Wenn Sie diese eine Karte zu behandeln, wenn die Karte weniger als 15 dann etwas anderes tun Sie so etwas tun könnte,

if (value < 15) { 
     this.cards.push(new DealCards) 
} 

So, Ihr Problem zu beheben, müssen Sie den Wert jedes aktualisieren Zeit es Schleifen durch den Aufruf Ihrer this.checkValue() Funktion.

while (value < 15) { 
    this.cards.push(new DealCards); 
    value = this.checkValue(); 
} 
+0

checkvalue erstellt immer ein neues Deck. er muss das zuerst ändern. – Zlatko

+0

Ahh ja ich sehe was du sagst. Gutes Auge Mann. Gute Arbeit, ich werde deine Antwort auffrischen. – wuno

0

Diese for-Schleife wird nie

while (value < 15) { 
      this.cards.push(new DealCards) 
     } 

Sie beenden müssen Wert anrufen ++ oder ++ Wert zu

machen Ende
while (value < 15) { 
      this.cards.push(new DealCards); 
      value++; 
     }