ds_grid - und nun? Zufallswerte zuweisen?

  • GM 8

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

  • ds_grid - und nun? Zufallswerte zuweisen?

    Hallöchen,

    ich knobel schon ein paar Tage dran rum, habe aber keine Lösung gefunden - vielleicht kann mir hier jemand weiterhelfen *hoff*

    Ich habe ein Spielfeld mit 5 Zeilen und 6 Spalten (= 30 Felder), mit ds_grid ein Raster erstellt (ds_grid_create(5,4)). So weit, so gut.

    Nun möchte ich in jedes Feld ein Bild legen (jedes Feld und Bild ist 128x128 Pixel groß). Ich habe 10 Bilder, von denen jedes genau 3 mal aufs Spielfeld soll. Aber ich kann es nicht per ds_grid_set zuweisen, da die Lage der Bilder bei jedem Durchlauf anders sein soll, sozusagen ein Zufalls-Platz.
    Jetzt weiß ich nicht, wie ich diese 10 Bilder auf das Feld nach dem Zufallsprinzip verteilen kann - wenn ich random benutze, dann belege ich ja dauernd bereits belegte Felder neu und andere bleiben leer!

    Wer kann mir bitte helfen, diese 10 Bilder jeweils 3 mal auf das Feld zu verteilen?
    Danke schon mal im voraus für jede Hilfe,
    CB
  • Du könntest einfach eine Zufallsschleife machen,
    die einen Zufallswert generiert, prüft ob der schon 3 mal im grid vorhanden
    ist und wenn nein, ihn dann per ds_grid_set hinein macht.

    Hier mal die Schleife:

    GML-Quellcode

    1. xx = 1 //Feld-x-Koordinate
    2. yy = 1 //Feld-y-Koordinate
    3. while xx < 5
    4. {
    5. while yy < 4
    6. {
    7. scr_check_grid(xx,yy,round(random_range(0.5,10.49))) //Script
    8. yy += 1
    9. }
    10. xx+=1
    11. yy = 1
    12. }
    Alles anzeigen


    Das Script kannst du bestimmt selbst machen.
    Dann lernst du auch was dabei. :)

    Als Denkansatz:

    Könntest ja hier auch die Schleife benutzen
    Und eine Variable, die immer um 1 erhöht wird, wenn der Wert gefunden wird.
  • @Shapow
    Man beachte, dass die Laufzeit eines solchen Algorithmus' vom Zufall abhängt und er auch nur fast sicher terminiert, d.h. er kann (mit geringer Wahrscheinlichkeit) beliebig lange laufen.

    Ich würde so ein zufälliges Verteilen von Objekten mit einer Liste der noch verbleibenden Objekte lösen. In deinem Beispiel in etwa so:

    GML-Quellcode

    1. var i, j, k, n, remain;
    2. // Anzahl der Karten insgesamt.
    3. n = 30;
    4. // Verfügbare Karten auflisten. Die Zahlen von 0-9 stehen für die 10 verschiedenen Karten.
    5. for (i = 0; i < n; i += 1) {
    6. remain[i] = i mod 10;
    7. }
    8. for (i = 0; i < 6; i += 1) {
    9. for (j = 0; j < 5; j += 1) {
    10. k = floor(random(n));
    11. ds_grid_set(grid,i,j,remain[k]);
    12. n -= 1;
    13. remain[k] = remain[n];
    14. }
    15. }
    Alles anzeigen


    ds_grid_create(5,4)

    Du meinst sicher ds_grid_create(6,5)?
  • Bl@ckSp@rk schrieb:

    Du meinst sicher ds_grid_create(6,5)?

    Nein, ich meine ds_grid_create(5,4). Da die Zählung bekanntlich bei 0 beginnt, wäre ein grid (6,5) ein Raster mit 42 statt 30 Feldern. :whistling:

    Aber erst mal vielen, vielen Dank für die Hilfen! Ich werde mich jetzt noch einmal damit auseinandersetzen und hoffe, dann endlich weiter zu kommen.
    Wenn es im neuen Jahr dann immer noch nicht weitergeht, melde ich mich noch einmal, aber ich denke, mit diesen Hilfen bekomme ich es endlich hin.
    Wünsche allen noch einen guten Rutsch ins neue Jahr!

    Gruß CB
  • Counter-Bike schrieb:

    Bl@ckSp@rk schrieb:

    Du meinst sicher ds_grid_create(6,5)?

    Nein, ich meine ds_grid_create(5,4). Da die Zählung bekanntlich bei 0 beginnt, wäre ein grid (6,5) ein Raster mit 42 statt 30 Feldern.

    Nein, ds_grid_create verlangt die Breite und Höhe des Grids, nicht den jeweils größt möglichen Index. Gibt man also als Breite w an, so darf der Index von 0 bis w-1 laufen, was genau w Werte sind. Daher schreibt man üblicherweise beim Durchlaufen aller Werte auch

    GML-Quellcode

    1. for (i = 0; i < w; i += 1)

    und nicht etwa

    GML-Quellcode

    1. for (i = 0; i <= w; i += 1)


    Shapow schrieb:


    Eine ds_list beginnt bei 0
    Ein ds_grid bei 1,1

    Steht zwar nicht in der Hilfe, ist aber so. ^^

    Steht nicht in der Hilfe und ist auch nicht so. Bei Datenstrukturen beginnen Indizes immer bei 0. Größenangaben, wie bei ds_grid_create Breite und Höhe oder bei ds_list_create die Länge der Liste, haben damit aber nichts zu tun. Einzig bei den Funktionen für Strings beginnen Indizes verwirrenderweise bei 1 statt 0. Was man sich dabei gedacht hat, ist fraglich. Vermutlich soll es für Anfänger einfacher und intuitiver sein. Dann hätte man dies aber konsequenterweise auch bei Arrays und anderen Datenstrukturen machen sollen.

    Auch von mir: Guten Rutsch! :)