[Gelöst] For-Schleife soll mehrmals verschiedene Werte auslesen, miteinander multiplizieren und die Ergebnisse dann miteinander addieren

  • GM 8

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

  • [Gelöst] For-Schleife soll mehrmals verschiedene Werte auslesen, miteinander multiplizieren und die Ergebnisse dann miteinander addieren

    :)

    Ich bin gerade dabei, mit ds_grid mein erstes eigenes Inventar zu bauen. Also wage ich mich gerade an zwei neue Dinge ran: Datenstrukturen und Schleifen. Ich komm einfach nicht mehr drumherum... Verdammt! :D

    Ich hab es hinbekommen, dass ich alle Gegenstände im Inventar (verschiedene Preise) auf einen Schlag verkaufen kann und mir der richtige Betrag gutgeschrieben wird:

    GML-Quellcode

    1. // Alles verkaufen
    2. var i;
    3. for (i = 0; i <= ds_grid_height(obj_ship.inv); i += 1;)
    4. {
    5. global.credits += (ds_grid_get(obj_ship.inv, 4, i)) * (ds_grid_get(obj_ship.inv, 6, i))
    6. }

    Was ich allerdings nicht hinkriege, ist, vorher anzeigen zu lassen, wieviel ich erhalten werde. Ich dachte, weil beim Verkaufen (einmaliges Event) der korrekte Betrag gutgeschrieben wird, müsste doch auch das gleiche Script den Preis vorher anzeigen können (ständig laufendes Event):

    GML-Quellcode

    1. // Alles verkaufen - Preis anzeigen
    2. var i;
    3. for (i = 0; i <= ds_grid_height(obj_ship.inv); i += 1;)
    4. {
    5. return (ds_grid_get(obj_ship.inv, 4, i)) * (ds_grid_get(obj_ship.inv, 6, i))
    6. }

    Komischerweise zeigt mir der Preis-Code aber nur den Preis für die Items in Zeile 0 an, so als ob die For-Schleife danach endet. Und für die Zeile 0 ist der angezeigte Betrag auch korrekt - er wird nur nicht mit den Zeilen darunter addiert. Jemand ne Idee, wie das aussehen muss? Ich muss also alle Zeilen auslesen und dann miteinander addieren.

    Es sieht so aus als hat es was damit zutun, dass der Preis beim Verkaufen nur einmal berechnet wird und beim Anzeigen des Preises ständig. :huh:
    Achja und hat jemand ne Idee, wie ich die beiden Scripts in eins packen kann?

    Zum besseren Verständnis:

    Anzahl | Preis
    10 | 100
    5 | 200
    2 | 500

    = 3000

    Die Schleife soll pro Zeile jeweils die Anzahl mit dem Preis multiplizieren und am Ende sollen die Ergebnisse der einzelnen Zeilen miteinander addiert und angezeigt werden.

    GML-Quellcode

    1. if ! (freedom) { instance_destroy(gamemaker); instance_create(x, y, html5); }

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Bonsaiheld ()

  • Komischerweise zeigt mir der Preis-Code aber nur den Preis für die Items
    in Zeile 0 an, so als ob die For-Schleife danach endet. Und für die
    Zeile 0 ist der angezeigte Betrag auch korrekt - er wird nur nicht mit
    den Zeilen darunter addiert. Jemand ne Idee, wie das aussehen muss? Ich
    muss also alle Zeilen auslesen und dann miteinander addieren.
    return x; sorgt dafür das der Wert x zurückgegeben (=return) wird und das Skript beendet wird (quasi exit mit Rückgabewert), dadurch wird nur das erste Item berechnet und den Wert zurück gegeben, du kannst dir ein Skript machen das das berechnet:

    GML-Quellcode

    1. var i, c;
    2. c = 0; //variable zum zählen
    3. for (i = 0; i <= ds_grid_height(obj_ship.inv); i += 1;)
    4. {
    5. c += ds_grid_get(obj_ship.inv, 4, i) * ds_grid_get(obj_ship.inv, 6, i); //wert auslesen, berechnen und zum zwischenergebniss addieren
    6. }
    7. return c; //zwischen ergebniss zurück geben


    Wenn man alles verkaufen will:

    GML-Quellcode

    1. global.Credits += scriptZumBerechnen();
    2. inventarLeeren();
    wupto.net/ Nicht meine Seite!
    We love Koalas.

    GM-D-Spam-o-Meter: 32%

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von henrik1235 ()

  • Stimmt... c += addiert bis die Schleife zu Ende ist. Das gleiche hab ich beim Verkaufen mit global.credits += ds_grid... gemacht. Da return nichts addiert (allein schon weil ein + fehlt), sondern nur einmalig etwas ausgibt, kann es nur das Ergebnis der ersten durchlaufenen Zeile ausgeben.
    Funktioniert perfekt und ich hab jetzt nur noch ein Script für beides.
    Danke henrik. :)

    GML-Quellcode

    1. if ! (freedom) { instance_destroy(gamemaker); instance_create(x, y, html5); }

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von Bonsaiheld ()