room_goto Random

  • GM 7

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

  • room_goto Random

    Fehlermeldung:
    -----------
    FATAL ERROR in

    action number 2

    of Mouse Event for Left Button

    for object object_richtig:



    Unexisting room number: 4
    -----------
    Habe 43 Räume und es sollen zufällige geöffnet werden. Raum 0 ausgenommen. Bisher so gelöst:
    room_goto(1 + random(42))
    Die Fehlermeldung kommt erst nach einiger Zeit.
    Zuerst war das Problem immer schon früher mit Raum 2. Ich habe dann die Räume unter 10 mit einer Null versehen, also room_01, room_02, ...
    Hatte schon gedacht es wäre damit gelöst. Jetzt kommt die Fehlermeldung erst später im Spiel.
    Was könnte ich noch versuchen?
  • Das liegt einfach daran, das die Räume keine Zahlenwerte zwischen 0 und 42 sind. Der Name eines Raumes ist eine ID... die sind soweit ich mich erinnern kann alle größer als 10000 (gib einfach mal irgendwo diesen Befehl ein und staune: show_message(string(raumname)); ).

    Anyway, deines rätsels löung währe ein Array, das alle Räume beinhaltet. Also im Create Event des Objektes, das die Räume wechselt brauchst dann so was in der richtung:

    GML-Quellcode

    1. raumliste[0] = raum1;
    2. raumliste[1] = raum2;
    3. raumliste[2] = raum3;
    4. raumanzahl = 3;


    dann kannst im evento wo der Raumwechsel ausgeführt wird einfach folgendes machen:

    GML-Quellcode

    1. room_goto(raumliste[floor(random(raumanzahl))]);

    floor und random deswegen in kombination, weil random afair nur kommazahlen zurückgibt.
    ...
  • Das liegt daran, weil eventuell nicht alle Räume durchgehende ID's haben. Nehmen wir an du erstellst den ersten Raum - dieser hat dann die ID 0. Der zweite raum hat die Id 1 und der dritte 2. Löscht du jetzt zum Beispiel den zweiten Raum, bleiben die ID's allerdings gleich und es gibt keinen Raum mit der ID 1 mehr. Deshalb würde ich einfach nochmal, bevor du den Raum wechselst abfragen, ob dieser existiert. Optimal wäre natürlich eine do- until Schleife:

    GML-Quellcode

    1. // Zufällige Raumauswahl
    2. var anzahl,auswahl,erster;
    3. anzahl=room_last; // Speichert die ID des letzten Raums, der höchste Wert, der erreicht werden soll.
    4. erster=room_first; // Der Raum, der nicht gezählt werden soll.
    5. // Die Schleife führt den Zufallsgenerator so lange aus, bis der Raum existiert und es nicht der in der Variable erster festgelegte Raum ist.
    6. do
    7. {
    8. auswahl=irandom(anzahl);
    9. }
    10. until (room_exists(auswahl)&&auswahl!=erster)
    11. room_goto(auswahl);
    Alles anzeigen

    © 2008 by Teamgrill Productions
  • Hi,

    ich würd einfach nicht nach der ID gehen sondern nach dem Namen.

    GML-Quellcode

    1. random = floor(random(42))+1;
    2. execute_string('room_goto(room' + string(random) + ')'); // room + zahl < Name event. ändern


    Mein Code setzt allerding vorraus ,dass deine Räume so heißen: room0, room1, room2.
    Wenn nicht änder das in der 2 Code-Zeile

    MfG xxskxx
    -
  • Tice schrieb:

    Und ausserdem ist Shoba´s lösung die beste hier ;)
    Ich mische mich ungern hier ein, möchte aber ebens was klar stellen:

    jürgen2009s Lösung ist komplett irrelevant. Nicht nur falsch, sondern auch das ultimative Beispiel für geschlampten Code.

    Henriks Lösung ist zwar die einfachste, leider nicht sonderlich flexibel. (mal abgesehen davon, dass execute_string() schlechter Stil ist)

    Shobas Lösung wird zwar mit hoher Wahrscheinlichkeit funktionieren, ist aber alles andere als DRY (oder DIE). Das wird alles anderes als ein schöner und besonders pflegeleichter Code.

    MasterXYs Lösung ist und bleibt die beste. Sie ist schnell, DRY, pflegeleicht (falls mal was geändert werden muss) und flexibel.
    Ich frage mich, warum es hier überhaupt noch Diskussion gibt, und jeder so tut, als hätte seinen Post nie gegeben!

    MfG SDX
  • Benutzer online 1

    1 Besucher