2016-09-29 6 views
0

Also habe ich dieses Mini-Projekt, für das ich arbeite, und es ist im Grunde eine einfache Methode in Java für ein Kartenspiel, das überprüft, ob die Zeichenfolge eine Flush hat. Denken Sie daran, ich bin ein Anfänger in Java (und Cardgames/Poker ...) so bin ich neu bei all dem.Wie kann ich mehrere Bedingungen in einer Schleife verwenden, um verschiedene Indizes einer Zeichenfolge zu vergleichen?

zB: die Zeichenfolge ist "" Kh3h7h8h2s "so ist die Hand König der Herzen , 3 der Herzen, 7 der Herzen, 8 der Herzen, 2 der Spaten usw. Der Rang ist im 1., 3., 5., 7., 9. Index der Zeichenfolge. Die Zeichenkette muss 5 des gleichen Ranges haben, um eine Spülung zu haben

public class CardProblemss { 

String hand = "Kh3h7h8h2h"; 

public boolean hasFlush(String hand) { 
    String suit1 = Character.toString(hand.charAt(1)); 
    String suit2 = Character.toString(hand.charAt(3)); 
    String suit3 = Character.toString(hand.charAt(5)); 
    String suit4 = Character.toString(hand.charAt(7)); 
    String suit5 = Character.toString(hand.charAt(9)); 
    int flushcounter = 0; 

    while (true) { 
    if (suit1.equals(suit2)) { 
     flushcounter++; 
    }    
    else if (suit2.equals(suit3)) { 
     flushcounter++; 
    } 
    else if (suit3.equals(suit4)) { 
     flushcounter++; 
    } 
    else if (suit4.equals(suit5)) { 
     flushcounter++; 
    } 
    System.out.println(flushcounter); 
    if (flushcounter >= 5) { 
     return true; 
    } 
    else { 
     return false; 
    } 
    } 

} 

Jetzt kann ich bereits sagen, dass mein Code blech ist. Aber meine Frage ist, kann ich eine Schleife formulieren, die im Grunde genommen die charAt (index) -Methode verwenden würde? Da der Rang der Hand bei Index 1,3,5,7,9 liegt, kann ich eine Schleife schreiben, die den Index dieser Methode bei jedem Durchlauf um 2 erhöht? Oder gibt es einen effizienteren Weg, dies zu tun? Vielen Dank.

+1

ja, u kann ... 'for (int i = 0; i sidgate

Antwort

1

Würde so etwas funktionieren?

int flushCounter = 0; 

char s = hand.charAt(1); // s for suite 
for (int i = 3; i < hand.length(); i = i + 2) { 
    if (s == hand.charAt(i)) { 
    flushCounter++; 
    } 
} 

if (flushCounter >= 5) { 
    return true; 
} else { 
    return false; 
} 

Auf diese Weise, der einzige Weg, durch den Strang durchlaufen werden und dann auf immer ungerade Wert, werden Sie die Suite vergleichen. Ich gehe davon aus, dass deine Handgröße immer 3 oder mehr beträgt. Wenn Sie möchten, dass i bei 1 beginnt, können Sie das auch tun.

int flushCounter = 0; 
char s; // s for suite 

for (int i = 1; i < hand.length(); i = i + 2) { 
    if (i == 1) { 
    s = hand.charAt(1); 
    } else if (s == hand.charAt(i)) { 
    flushCounter++; 
    } 
} 

if (flushCounter >= 5) { 
    return true; 
} else { 
    return false; 
} 

Mit letzterem muss man vorsichtig sein, nicht s innerhalb der if-Anweisung initialisieren sonst wird es den Gültigkeitsbereich verlassen, bevor Sie es verwenden können.

Hinweis:

if (flushCounter >= 5) { 
    return true; 
} else { 
    return false; 
} 

kann

return flushCounter >= 5; 

reduziert werden, da sie den Ausdruck auswerten und dann das Ergebnis zurück. Der frühere Weg ist viel ausführlicher. Da Sie einfach den Wert des Ausdrucks zurückgeben, würde ich argumentieren, dass Letzteres einfacher ist.

+0

oder 'return flushCounter == 5'! – flakes

+0

Das wäre meine Vorliebe, aber OP erwähnt, dass er/sie ein Anfänger ist, also dachte ich, dass es hier besser wäre, ausführlich zu sein. – Nefari0uss

+0

Denken Sie daran, in diesem Fall falsch zurückzugeben! : P – flakes

0

Nur zum Spaß, hier ist, wie Sie dies mit Streams tun können!

public static boolean hasFlush(final String hand) { 
    final char first = hand.charAt(1); 
    final long count = hand.chars().filter(c -> c == first).count(); 
    return count == 5; 
} 
Verwandte Themen