verflixtes Array

  • GM 8

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • verflixtes Array

    Hi Leute,
    bin offenbar zu blöde für das Forum - hab meine Anfrage schon wieder im falschen Unterforum abgegeben. Also alles noch einmal:

    Ich habe ein Array, in dem ich 15 verschiedene Objekte genau einmal unterbringen möchte. Nach dem Zufallsprinzip natürlich. Jedoch: Mein Computer versteht mich einfach nicht!! :motz:
    Statt 15 mal packt er mir es 100 mal rein und obendrein interessiert es ihn nicht, ob da welche doppelt sind oder nicht. :(
    Hier mein Code:

    GML-Quellcode

    1. var i,j,k,n ;
    2. // Anzahl der Objekte
    3. n = 15;
    4. for (i = 0; i < 10; i += 1) {
    5. for (j = 0; j < 10; j += 1) {
    6. k = floor(random(n));
    7. ds_grid_set(global.grid,i,j,k);
    8. instance_create(i*40+80,j*40+80,choose(obj_1,obj_2,obj_3....obj_15));
    9. n -= 1;
    10. }
    11. }
    Alles anzeigen


    Bitte: was muss ich ändern, damit er mir jedes der 15 Objekte genau einmal in das Array legt???
    Bedanke mich für fachkundige Hilfe schon mal im voraus.
    Und an den/die Modi: bitte den falschen Eintrag löschen, sorry, war keine Absicht.
    CB
    PS: Warum sind denn plötzlich die Einzüge im Code alle weg??
  • Also wenn ich dich richtig verstanden habe, dann unterscheidet sich deine Frage im Wesentlichen kaum von der, die du hier gestellt hast: GM 8 ds_grid - und nun? Zufallswerte zuweisen?

    Es sollte eigentlich kein Problem sein, die dort genannten Lösungsvorschläge auf dein jetziges Problem zu übertragen. Wie Tice schon geschrieben hat, durchläufst du das Grid gerade 100 mal und nicht nur 15 mal. Wenn ich deine Frage richtig interpretiere, willst du auch gar nicht ein Grid sondern ein normales eindimensionales Array verwenden. Andernfalls musst du uns mal erklären, wie man 15 Objekte auf 100 Felder in einem Array verteilen soll. Sollen dann vielleicht einfach nur genau 15 Felder belegt werden und alle anderen 85 frei bleiben?

    Für den eindimensionalen Fall:

    GML-Quellcode

    1. var i, k, n, m, remain;
    2. // Anzahl der Objekte.
    3. n = 15;
    4. // Verfügbare Objekte auflisten.
    5. remain[0] = obj_1;
    6. ...
    7. remain[14] = obj_15;
    8. for (i = 0; i < 15; i += 1) {
    9. // Anzahl der verbleibenden Objekte.
    10. m = n-i;
    11. // Wähle ein zufälliges der verbleibenden Objekte.
    12. k = floor(random(m));
    13. // Füge es dem Array der Objekte hinzu.
    14. array[i] = remain[k];
    15. // Array der verbleibenden Objekte neu anordnen.
    16. remain[k] = remain[m-1];
    17. }
    18. // "array" enthält jetzt die 15 Objekte in zufälliger Reihenfolge.
    Alles anzeigen
  • Ähm, danke erst mal, aber ich fürchte, hier liegt jetzt ein Missverständnis vor. Ich möchte nicht 15 Objekte in eine beliebige Reihenfolge bringen,
    sondern in einem Array von 10 x 10 Feldern (=100 Felder) diese 15 Objekte an einem beliebigen Platz unterbringen und zwar so, dass jedes Element
    nur genau einmal vorkommt.
    Das ist aber mit Deinem Lösungsvorschlag nicht so ganz möglich...
    Kann mir evtl. jemand noch mal weiterhelfen? Und ich hätte auch gerne gewusst, was dieses Wort "remain" bedeutet. Ist dies irgendwie vordefiniert?
    Sorry, aber so ganz firm bin ich in gml noch nicht...
    Gruss CB
    PS: zu Deinem Link: genau da hab ich angesetzt, wollte das so abändern, dass es bei mir auch hinhaut. Tut es aber nicht, da derjenige dort andere Bedingungen hat als ich jetzt...
  • Ich gehe jetzt einfach mal davon aus, dass

    Sollen dann vielleicht einfach nur genau 15 Felder belegt werden und alle anderen 85 frei bleiben?

    zutrifft und zudem, dass nicht mehrere Objekte auf einem Feld liegen dürfen. In diesem Fall funktioniert es nun wirklich sehr ähnlich zu dem anderen Thread. Lediglich das Array remain muss am Anfang anders gefüllt werden. Nämlich mit den 15 Objekten und die restlichen 85 Felder mit -1, um diese Felder als leer zu markieren.

    GML-Quellcode

    1. var i, j, k, n, obj, remain;
    2. // Anzahl der Felder.
    3. n = 100;
    4. // Verfügbare Objekte auflisten.
    5. remain[0] = obj_1;
    6. ...
    7. remain[14] = obj_15;
    8. // Der Rest wird mit -1 gefüllt, was den leeren Feldern entspricht.
    9. for (i = 15; i < n; i += 1) {
    10. remain[i] = -1;
    11. }
    12. // Die Elemente in remain zufällig im Grid verteilen.
    13. for (i = 0; i < 10; i += 1) {
    14. for (j = 0; j < 10; j += 1) {
    15. k = floor(random(n));
    16. obj = remain[k];
    17. ds_grid_set(grid,i,j,obj);
    18. // Prüfen, ob das aktuelle Feld leer bleiben soll.
    19. if (obj != -1) {
    20. instance_create(i*40+80,j*40+80,obj);
    21. }
    22. // Array der verfügbaren Objekte neu anordnen.
    23. n -= 1;
    24. remain[k] = remain[n];
    25. }
    26. }
    Alles anzeigen

    Es funktioniert also im Wesentlichen genaz genauso wie in deinem anderen Thread. Du musst dir einfach vorstellen, dass du eigentlich 100 Objekte hast, die du im Grid verteilen willst. Darunter sind deine 15 verschiedenen Objekte und 85 Objekte vom Typ "leeres Feld".

    Und ich hätte auch gerne gewusst, was dieses Wort "remain" bedeutet. Ist dies irgendwie vordefiniert?

    Nein, das ist ein ganz normales Array. Es wird dazu benutzt, um alle noch nicht gesetzten Objekte festzuhalten. Denn nur aus diesen sollen ja weitere Objekte auf dem Feld platziert werden. Der oben angegebene Algorithmus folgt eigentlich dem intuitiven Vorgehen: Man nimmt sich aus einer Menge von Gegenständen (entspricht dem Array remain) nacheinander zufällig welche heraus und platziert sie der Reihe nach auf dem Spielfeld.