Eingeschränktes random?

Hallo!

Ich schreibe gerade ein Puzzle-Spiel…und bin auf ein Problem gestoßen. Ich muss die Steine zufällig durchnummerieren, z.B. 1 - n. Und natürlich darf kein zweiter Stein gleich benannt werden, darum scheidet das Math.random%-zeugs aus.

Wie könnte ich das lösen? Gibt es eine schönere Lösung als z.B. irgendwie mit nem Array wo ich dann benützte Felder markiere?

Evgeni

Und noch ne Frage hätt ich: kann man das so machen dass die Steine bei ihrer Generierung (in einer for-Schleife) eine fortlaufende Nummerierung mitbekommen? z.B. t1, t2, z3…immer die Nummer hinten dranhängen. Ginge das?

ich würds anders machen, schmeiß alle Zahlen die du hast in eine Liste und erzeuge die Indizes per Zufall nach denen du die Zahlen aus der Liste holst.

Was meinst du bei der Generierung ne Nummer erhalten?

naja, dass die Stein-Objekte z.B. nach dem Muster t + zahl benannt werden. Wenn also 15 Objekte erzeugt werden heißen sie t1 bis t15. Und wenn es 20 werden, dann t1 bis t20 .

Die Zahlen in eine List legen, diese Liste dann mit Collections.shuffle(list) durchmischen, und die Zahlen nacheinander rausnehmen wäre auch eine Möglichkeit.

wie willst du das anstellen? Variablennamen kann man nicht zur Laufzeit erzeugen (zumindest ist es in der Regel sinnlos)
Leg sie doch einfach in ner Liste ab wenn du sie nicht fest vorgeben willst.

Danke schön. Ich habs jetzt mit List gelöst.

Und noch eine Frage hätt ich! :stuck_out_tongue:

Ich muss auch die win condition für das Puzzle überprüfen. Also wenn alle Steine (jeder Stein hat eine Zahl) schön nacheinander stehen, hat man gewonnen.

Was denk ihr? Wie mach ich das am umständlichsten? :stuck_out_tongue_winking_eye:

Ich habe mit zwei for() schleifen angefangen, und dann die Steine untereinader verglichen. Aber das war sehr umständlich, ich musste array.getTile(i, j) mit array.getTile(i+1,y) vergleichen, wobei aber die Gefahr besteht vom array runterzufallen.

Fällt euch etwas besseres ein?

nein das ist die gute Methode, aber wenn du es richtig machst fällst du nicht ausm Array :wink:

Ok, danke.

Aber was ich mir da zusammengeschrieben habe wird auf keinen fall gehen.

grnd ist das Objekt mit dem Array. Darauf wend ich Methoden an die mir einmal den Stein und aus diesem dann die Nummer rausholen. Aber es wird an der if-Abfragen scheitern. Und mir fällt momentan nichts besseres ein.

 public boolean winCondition(){
        
        for(int i = 0; i < hi; i++){
            for(int j = 0; j < br; j++){
                if(j+1 < br && grnd.getTile(j, i).getNumber() > grnd.getTile(j+1, i).getNumber()){
                    return false;
                }
                else return true;
            }
        }
    }

Genauer gesagt scheiterts an dem nicht-vom-array-fallen bei mir.

obendrein hat sich da ein fehler eingeschlichen. es hätte j+1 >= br heißen sollen.

warum machst du deine Schleife nicht einfach kürzer? Schon hast du eine Abfrage weniger drin :wink:
Außerdem überdenke mal deine returns

Du meinst j >= br-1? Aber dann wird sie in jeder zeile kürzer. Ich haben aber nur ein Feld das null ist. Die anderen sollen abgefragt werden.

nein ich mein eher for(int j = 0; j < br-1; j++){