Hej,
Das muss solange durchlaufen werden, bis eine eindeutige höchste Zahl ermittelt worden ist.
Das ist der Trick! Ein schönes Beispiel für Rekursion.
Geh davon aus, dass grundsätzlich nach einem Durchlauf (Rekursionsanfang) alle Spieler einen weiteren Durchlauf machen. Von diesem werden diejenigen ausgeschlossen, die nicht die maximale Zahl gewürfelt haben (Rekursionsschritt). Das wird so lange durchgeführt, bis die Menge der Spieler nur noch einen Spieler enthält (Rekursionsende).
Aber jetzt muss ich ja das Array auf die oben genannten Bedingungen testen.
Du meinst, ob eine höchste Zahl, zwei mal drin vorkommt? Das Array durchlaufen, bei jedem Durchlauf prüfen, ob der Wurf höher ist der maximal gewürfelte und dir die Indizes merken, für die der maximale Wurf mehrmals vorkam. Für diese Indizes erneut würfeln lassen. Ein Problem sehe ich nur bei diesem Verfahren über mehrere Rekursionsschichten hinweg, die Indizes wieder zuzuordnen, weshalb ich einen Objektorientierten Ansatz vorziehen würde.
PS: Ich erwarte hier keine Lösung, sondern lediglich ein paar Denkanstöße.
Die Lösung die ich dir zeigen möchte, ist soweit von deiner entfernt, dass sie dir hoffentlich mehr Denkanstoß als Lösung ist.
private Set<Spieler> stechen( Set<Spieler> spieler ) {
Set<Spieler> anfaenger = new HashSet<Spieler>( 6 );
int max = 0;
for( Spieler s : spieler ) {
int wurf = s.wuerfel();
if( wurf > max ) {
max = wurf;
anfaenger.clear();
anfaenger.add( s );
}
else if(wurf == max) {
anfaenger.add( s );
}
}
return ( anfaenger.size() == 1 ) ? anfaenger : stechen( anfaenger );
}
public Spieler werFaengtAn( Set<Spieler> spieler ) throws AnfaengerException {
if( spieler.isEmpty() ) {
throw new AnfaengerException( "Irgendjemand muss schon anfangen." );
}
return stechen( spieler ).iterator().next();
}
public class Spieler() {
public static int wuerfel() {
return (int) ((Math.random()*6)+1);
}
}
Beste Grüße
Biesterfeld
Art.1: Et es wie et es
Art.2: Et kütt wie et kütt
Art.3: Et hätt noch immer jot jejange
Das Kölsche Grundgesetz