Verwenden eines Arrays durch eine switch () -Anweisung in Javascript

8

Ich versuche ein vereinfachtes Pokerspiel durch Javascript zu entwickeln. Ich habe alle möglichen Kartenkombinationen aufgelistet, die ein Spieler in der Hand haben könnte, geordnet nach seinem Wert, wie folgt:

%Vor%

Obwohl das "sortedHand" -Array erfolgreich Werte speichert (wie ich durch console.log gesehen habe), gibt die switch () -Anweisung immer die Standard-Groß- / Kleinschreibung zurück, und jeder erhält einen Straight-Flush. Ich befürchte, dass dies eine Frage des wörtlichen Ansatzes ist, den ich verwendet habe, um mögliche Array-Werte zu deklarieren, die mit dem gesamten "sortedHand" verglichen werden, aber ich weiß es nicht besser. Ist es überhaupt möglich, switch () so zu benutzen?

    
Guilherme de Abreu 23.07.2013, 18:26
quelle

5 Antworten

12

Sie können switch ing für eine textuelle Darstellung des Arrays ausprobieren.

%Vor%

Als Alternative zur direkten Angabe jedes Falls, erstellen Sie vielleicht eine Funktionstabelle, die ein Objekt verwendet, und entfernen Sie den Schalter vollständig.

%Vor%     
voithos 23.07.2013, 18:31
quelle
6
  

Die Anweisung switch () gibt immer den Standardfall

zurück

Das liegt daran, dass der Vergleich nicht den Array-Inhalt, sondern das Array-Objekt selbst überprüft. Objekte werden durch ihre Identität als gleich angesehen, so dass nichts einem Objekt gleicht, das durch ein Literal instanziiert wird.

  

Ist es überhaupt möglich, switch () so zu benutzen?

Ja, man kann Objekte in switch -Anweisungen verwenden, aber in den Fällen müssten Sie Referenzen verwenden. Nicht anwendbar auf Ihr Problem.

In Ihrem Fall würde ich eine Zeichenfolge vorschlagen:

%Vor%

Aber ich denke, es gibt eine noch bessere, arithmetische Lösung, um die Muster zu erkennen, nach denen Sie suchen. Das wäre kürzer und schneller, aber ich bin mir nicht sicher, was genau dieser Ausschnitt machen soll.

    
Bergi 23.07.2013 18:32
quelle
1

Das wird nicht so funktionieren, wie Sie es haben, aber Sie können sortedHand.join(',') verwenden und es mit [1,1,1,2,5].join(',') vergleichen, was die beiden Arrays vergleicht und wahr sein sollte, wenn ihr Inhalt exakt gleich wäre (Vorsicht mit number s eingegeben als strings !) Um ehrlich zu sein, kann ich mir nicht vorstellen, warum Sie Ihre Logik so gestalten sollten. Selbst ein einfaches Kartenspiel hat Hunderttausende möglicher Hände. Sie könnten besser mit den Funktionen zur Sammlung von Sammlungen von underscore.js arbeiten, da dies einfacher und nur eine bessere Übung ist.

    
Code Whisperer 23.07.2013 18:32
quelle
1

Eine schnellere, potenziell wiederverwendbare und flexiblere Methode ist die Verwendung eines Objekts anstelle von case:

%Vor%

Objekte funktionieren gut, wenn ein Ausgang an einem Eingang hängt. Wenn Sie in jedem Fall fünf Dinge tun müssen, dann müssen Sie Groß- und Kleinschreibung verwenden, aber wenn Sie nur X benötigen, um in Y zu konvertieren (ein 1: 1), sind Nachschlagetabellen in Form von Objekten ideal.

>

Ich stelle mir vor, dass eine RegExp hier funktionieren kann, ich habe sie in einem connect4-Spiel verwendet, um 4 in einer Reihe zu identifizieren, aber die obige Logiktabelle sollte genauso gut oder besser funktionieren als das, was du beschreibst.

    
dandavis 23.07.2013 18:34
quelle
1

Es gibt 1274 mögliche Kombinationen von 5 Karten in einem normalen Deck. Sie alle in einer switch-Anweisung aufzulisten, ist völlig lächerlich. Warum haben Sie nicht einfach eine Funktion, die Duplikate zählt, um nach 2,3,4-von-einer-Art zu suchen und dann nach Geraden zu suchen? (Ihr Array zeigt keine Farbe an, also gehe ich davon aus, dass Sie es auslassen).

Aber wenn Sie es wirklich so machen wollen, könnten Sie eine Zeichenfolge verwenden. Zeichenfolgen arbeiten mit Schaltern und Sie können sie sogar wie Arrays verwenden. z.B. "123" [0] == '1'. Sie können sie Benutzerfunktionen wie parseInt hin und her ändern.

    
milestyle 23.07.2013 18:46
quelle