2015-07-26 11 views
5

Ich implementiere eine einfache Version des Cluedo Spiels. Es gibt 3 Arten von Karten im Spiel, Charakter, Waffe und Raum. Da eine Karte nicht mehr als ein String ist (d. H. Keine Funktionalität oder andere Informationen als der Name auf einer Karte gespeichert sind), habe ich entschieden, keine Kartenschnittstelle zu haben, und jeder Typ erweitert die Karte. Vielmehr hatte ich drei Aufzählungen in meinem Spiel, das sind:Java bekomme einen zufälligen Wert von 3 verschiedenen Enums

public enum Character {Scarlett, Mustard, White, Green, Peacock, Plum;} 
public enum Weapon {Candlestick, Dagger, LeadPipe, Revolver, Rope, Spanner;} 
public enum Room {Kitchen, Ballroom, Conservatory, BilliardRoom, Library, Study, Hall;} 

Jedoch gibt es einen Fall, in dem drei Arten von Karten zusammengesetzt werden und behandelt gleichmäßig an jeden Spieler des Spiels. Zum Beispiel kann ein Spieler eine Hand von 2 Charakteren, 2 Waffen und 1 Raum haben, ein anderer Spieler kann 3 Räume und 2 Charaktere haben, so lange die Gesamtzahl der Karten gleich ist, ist es egal, welcher Typ das ist.

Und deshalb frage ich mich, ob es eine Möglichkeit gibt, zufällig einen einzigen Wert aus allen drei Enums in Java auszuwählen?

Oder sollte ich nicht diese drei enums Sache in erster Linie tun? (Schlecht entworfen)

Antwort

5

Ein einfacher Weg ist, alle enum Mitglieder in einen einzelnen Object[] zu sammeln, dann nehmen Sie ein zufälliges Element von ihm.

Beachten Sie, dass eine Enumeration auch eine Schnittstelle implementieren kann, sodass Sie sogar eine gemeinsame API für alle Enums verwenden können. In der Regel werden Sie eine Menge von switch Aussagen über den Wert der Enum schreiben; Diese können meistens durch dynamischen Versand gegen solche Schnittstellenmethoden ersetzt werden. Beachten Sie außerdem, dass jedes Enum-Member eine eigene Methodenimplementierung bereitstellen kann.

+0

„Ein ENUM kann auch eine Schnittstelle implementieren“, die sehr geholfen! Es stellte sich heraus, dass ich eine Kartenschnittstelle brauche! Danke vielmals! – Shenbo

2

Ich denke, Sie sollten es halten wie es ist, aber sie dann alle in der gleichen Liste setzen:

List<Enum> enums = new ArrayList<>(); 
enums.addAll(Arrays.asList(Character.values())); 
enums.addAll(Arrays.asList(Weapon.values())); 
enums.addAll(Arrays.asList(Room.values())); 

Und dann nehmen Sie zufällige Werte dieser Liste. Näher ähnelt, was Sie im wirklichen Leben tun.

1

Sie so etwas schreiben kann:

public enum Character {Scarlett, Mustard, White, Green, Peacock, Plum;} 
public enum Weapon {Candlestick, Dagger, LeadPipe, Revolver, Rope, Spanner;} 
public enum Room {Kitchen, Ballroom, Conservatory, BilliardRoom, Library, Study, Hall;} 

private static final Random RANDOM = new Random(); // random number generator - declared static, because we need only one for whole program 
private static final int TOTAL_CARDS = Character.values().length + Weapon.values().length + Room.values().length; // sum up all enum lenghts - in this case, it will be 6 + 6 + 7 = 19 

private Enum<?> getRandomCard() { 
    int randomNumber = RANDOM.nextInt(TOTAL_CARDS); // we "roll a dice" to get some random number. Let's assume that we get "15" 
    if (randomNumber < Character.values().length) { // is 15 less then 6? No, so we skip this part 
     return Character.values()[randomNumber]; 
    } 
    randomNumber -= Character.values().length; // randomNumber = 15 - 6 = 9 
    if (randomNumber < Weapon.values().length) { // is 9 < 6 ? No, so we skip this 
     return Weapon.values()[randomNumber]; 
    } 
    randomNumber -= Weapon.values().length; // randomNumber = 9 - 6 = 3 
    if (randomNumber < Room.values().length) { // Is 3 < 7 ? Yes! 
     // so it means that our "dice" has chosen a Room with array index 3 
     // We call Room.values() to get all room types as an array and then we pick one with index 3 
     return Room.values()[randomNumber]; 
    } 
    return null; // should never happen 
} 

Wenn Sie einen Teil davon nicht verstehen, lassen Sie es mich wissen - ich einige Kommentare hinzufügen werde.

Ich glaube jedoch, dass Lösung von Oskar Kjellin vorgeschlagen ist viel eleganter dann dieses :)

+0

Dies könnte eine nützliche Antwort sein. Aber versuchen Sie es einfach mit diesem Code. Einige Antworten sind für andere Leser nicht hilfreich. Stattdessen sollten Sie eine minimale Beschreibung über den Code hinzufügen, die für den anderen zukünftigen Leser hilfreich ist. ;) – Lucky

+0

@Lucky Ich habe meine Antwort erweitert :) –

Verwandte Themen