Schleifen

  • GM 8

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

  • Guten Tag alle miteinander,
    ich habe in den letzten Tagen mal wieder vorsichtig den Game Maker angefasst, und kam schon nach kurzer Zeit zu diesem Problem:
    Ich benutzte in meinem Code die "do" Schleife. (im Step Event)

    GML-Quellcode

    1. do
    2. {
    3. idmerk[i]=instance_create(-99,-99,object_karte)
    4. i+=1
    5. }
    6. until (i<39)
    7. if i==39
    8. {
    9. sort_cards_into_map_used_old()
    10. }
    Alles anzeigen


    Mit diesem Code endetet das Spiel nach noch nicht einmal einer Sekunde mit einem Stillstand.
    Also überlegte ich mir die "While" Schleife zu benutzen, mit welcher es keine auffallenden Schwierigkeiten gab.
    Ich frage mich jetzt was die "do" Schleife für Probleme hatte, und bitte um eine aufklärende Antwort,

    DANKE . :)

    PS: Ich besitze Game Maker: Studio!
  • Semantik ist manchmal ein Arsch.
    while(...){...}, do{...}while(...) und do{...}until(...) sind drei Beschreibungen des selben Mechanismus, die sich aber subtil voneinander unterscheiden:

    while(...){...} wird übersetzt in: Prüf mal, ob die Bedingung in den ()n erfüllt ist. Wenn ja, führ den Code in den {}n aus und mach das Ganze nochmal von vorne. Wenn nein, Schleife fertig.

    do{...}while(...) bedeutet: Führ mal den Code aus und prüf danach, ob die Bedingung erfüllt ist. Der Code wird also auf jeden Fall mindestens ein mal ausgeführt. Ansonsten selbes Prinzip wie Fall 1.

    Und bei do{...}until(...) wird auch wieder erst der Code ausgeführt und dann die Bedingung geprüft. Allerdings wiederholt sich hier die Schleife, wenn die Bedingung nicht erfüllt ist. Kommt da true raus, wird abgebrochen. Siehe auch die deutsche Bedeutung von while und until: "So lange..." und "bis...".

    Und das ist genau, was in deinem Fall passiert ist. Du bist in eine Endlosschleife geraten, und zwar folgendermaßen:
    Davon ausgehend, dass dein i bei 0 anfängt, ist in den ersten 39 Steps (was bei einem room speed von 30 etwas über einer Sekunde liegt) der Schleifenkörper ausgeführt worden und es wurde jeweils eine Instanz von object_karte in dein idmerk-Array gepackt - (i<39) war erfüllt, also gab's keine Schleifenwiederholungen.
    Dann kam aber der nächste Programmschritt, wo i=39 war. Jetzt wurde dein i über die Schleifenausführung immer weiter hochgezählt, bis es irgendwann einen Wert erreichen sollte, der wieder unter 39 liegt. Und ich glaub, du siehst das Problem schon, wenn man von 39 aus immer weiter hochzählt, um wieder was kleineres als 39 zu erreichen. Rein mathematisch gesehen ist das Sauerrahm, auf Computern geht das aber sogar, wenn man nur lang genug zählt. Aber halt WIRKLICH lang. ^^ Auf jeden Fall ist es nicht, was du eigentlich machen wolltest.