2015-07-26 7 views
5

Sto implementando una versione semplice del gioco Cluedo. Ci sono 3 tipi di carte nel gioco, Personaggio, Arma e Stanza. Poiché una carta non è altro che una stringa (cioè nessuna funzionalità o informazione diversa dal nome è memorizzata in una carta), ho scelto di non avere un'interfaccia della scheda e ogni tipo estende la carta. Piuttosto ho avuto tre enumerazioni nel mio gioco che sono:Java ottiene un valore casuale da 3 enumerazioni diverse

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;} 

Tuttavia, v'è un caso in cui tre tipi di carte sono messi insieme e distribuite in modo uniforme ad ogni giocatore del gioco. Ad esempio, un giocatore può avere una mano di 2 Personaggi, 2 Armi e 1 Stanza, un altro giocatore può avere 3 Camere e 2 Personaggi, quindi è lungo il numero totale di carte che non importa di che tipo si tratta.

Ed è per questo che mi chiedo se c'è un modo per scegliere casualmente un singolo valore da tutte e tre le enumerazioni in Java?

Oppure non dovrei fare questa cosa di tre enum in primo luogo? (Progettato male)

risposta

5

Un modo semplice è quello di raccogliere tutti i membri di enum in un singolo Object[], quindi prelevare un elemento casuale da esso.

Si noti che un enum può anche implementare un'interfaccia, quindi è possibile avere anche qualche API condivisa su tutte le enumerazioni. In genere ti troverai a scrivere un sacco di affermazioni switch sul valore dell'enum; quelli possono essere sostituiti per lo più da una spedizione dinamica contro tali metodi di interfaccia. Nota inoltre che ogni membro di enum può fornire la propria implementazione del metodo.

+0

"Un enum può anche implementare un'interfaccia" che ha aiutato molto! Alla fine ho bisogno di un'interfaccia Card! Molte grazie! – Shenbo

2

Credo che si dovrebbe tenere le cose come stanno, ma poi metterli tutti nella stessa lista:

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

e poi si prende valori casuali di quella lista. Più strettamente ricorda quello che fai nella vita reale.

1

È possibile scrivere qualcosa del genere:

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 
} 

Se non si capisce una parte di questo, per favore fatemelo sapere - aggiungerò alcuni commenti.

Tuttavia, credo che la soluzione proposta da Oskar Kjellin è di gran lunga più elegante allora questo :)

+0

Questa potrebbe essere una risposta utile. Ma prova solo questo codice, le risposte non sono utili per gli altri lettori. Piuttosto dovresti aggiungere una descrizione minimale del codice che sarà utile per l'altro futuro lettore. ;) – Lucky

+0

@Lucky ho esteso la mia risposta :) –