frage zu ds_list

  • GM 8

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

  • frage zu ds_list

    Da ich hier kein richtiges Tuturial finde über ds_list mit Beispiel fragich hier mal nach. Am besten wäre ein Inventar-Beispiel mit einem Example, weil im GM Handbuch sind meistens keine Beispiele vorhanden. Ich verstehe es nicht wie oder wozu und warum man die anwendet. Es ist irgenwie eine Liste wo man Werte speichert?!

    THX im Voraus :)
  • Du kannst sie dir im Prinzip wie ein Array vorstellen, nur ist sie:
    1. Schneller als normale Arrays.
    2. Hat keine Größenbegrenzung.
    3. Bequemer (man kann Werte einfach suchen und einfügen)
    Hier ein Vergleich in GML:

    GML-Quellcode

    1. // Array Version
    2. array[0] = "Test";
    3. array[1] = "Test2"
    4. // usw...
    5. // ds_list_Version
    6. list = ds_list_create(); // Erstellt erstmal eine Liste zur Verwendung
    7. ds_list_add(list, "Test");
    8. ds_list_add(list, "Test2");


    Das bequeme an lists ist, dass man ganz einfach Werte an jeder beliebigen Stelle einfügen kann und sich umständliches Neusortieren wie bei Arrays sparen kann.
    Natürlich kann man Lists auch für andere Zwecke verwenden, für ein Inventar würde sich aber ds_map oder ds_grid eignen.

    © 2008 by Teamgrill Productions
  • MasterXY schrieb:

    Du kannst sie dir im Prinzip wie ein Array vorstellen, nur ist sie:



    Schneller als normale Arrays.
    Das ist nicht so. Jedenfalls stimmt das nicht, wenn die Listen im Game Maker einfach verkettet sind. Wenn du ein Element aus einer einfach verketteten Liste nehmen oder anschauen willst, musst du im schlimmsten Fall bis an das Ende der Liste laufen, was eine Zeitkomplexität von n (n := Anzahl Elemente in der Liste) hat. Beim Array geschieht das Lesen in konstanter Zeit, was in der Regel nicht so lange dauert.
    Von daher ist eine Liste nicht unbedingt schneller als ein Array.

    Aber du kannst dir die ds_list eben so vorstellen wie MasterXY gesagt hat. Im Prinzip ist es ein "unendlich" großes Array, wobei die Elemente, die du da speicherst, keinen Index haben. In einer Liste hast du Knoten, die Schlüsselwerte enthalten (das können primitive Datentypen oder Objekte sein). Jeder Knoten zeigt entweder auf einen nächsten Knoten oder auf ein NIL-Objekt (bei doppelt verketteten und zyklischen Listen hast du noch einen Zeiger, der auf den vorherigen Knoten zeigt). Beim Suchen, Einfügen und Löschen musst du eben durch die Liste iterieren um deine gewünschten Operationen auszuführen. Wenn du Elemente in deine Liste einfügen bzw. löschen willst, dann musst du einfach nur die Zeiger der jeweiligen Knoten "umbiegen".

    Hier mal ein Bild, um es sich besser vorstellen zu können:

    Spoiler anzeigen


    (das ist jetzt eine einfach verkettete Liste)

    Ah ja gut, das war jetzt nur Theorie-Gedöns. Ich hoffe das hilft dir ein wenig. Ein Beispiel hat ja MasterXY gepostet. ;)

    MfG

    Albert Einstein schrieb:

    Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.
  • für inventar ds_map?

    danke Masterxy und Trixt0r ^^
    mit dem Beispiel komme ich bestimmt weiter : )

    mit welchem ist es besser oder einfacher ein inventar zu erstellen, ich will nicht auf arrays zugreifen...
    ds_map
    oder
    ds_grid?

    tut mir leid das ich so viel frage, aber ich versteh meinches nicht aus dem Gamemaker Handbuch :)
  • MasterXY schrieb:


    Du kannst sie dir im Prinzip wie ein Array vorstellen, nur ist sie:
    Schneller als normale Arrays.Hat keine Größenbegrenzung.Bequemer (man kann Werte einfach suchen und einfügen)Hier ein Vergleich in GML:








    GML




    1
    2
    3
    4
    5
    6
    7
    8
    9



    // Array Version
    array[0] = "Test";
    array[1] = "Test2"
    // usw...

    // ds_list_Version
    list = ds_list_create(); // Erstellt erstmal eine Liste zur Verwendung
    ds_list_add(list, "Test");
    ds_list_add(list, "Test2");






    Das bequeme an lists ist, dass man ganz einfach Werte an jeder beliebigen Stelle einfügen kann und sich umständliches Neusortieren wie bei Arrays sparen kann.
    Natürlich kann man Lists auch für andere Zwecke verwenden, für ein Inventar würde sich aber ds_map oder ds_grid eignen.

    Wie greife ich jetzt auf ein teil einer liste zu, also verändere ihn oder weise ihm einen Wert zu?
  • mar92k schrieb:

    Wie greife ich jetzt auf ein teil einer liste zu, also verändere ihn oder weise ihm einen Wert zu?
    Ein Blick in die Hilfe hätte es auch getan, genauer gesagt hier .

    ds_list_add(id,val) Fügt einen Wert ans Ende der Liste an.
    ds_list_insert(id,pos,val) Fügt einen Wert an der Position "pos" der Liste ein. Die erste Position ist Position 0, die letzte "size-1".
    ds_list_replace(id,pos,val) Ersetzt den Wert an Position "pos" in der Liste durch den neuen Wert (val).
    [...]
    ds_list_find_index(id,val) Finde die Position, die den angegebenen Wert beinhaltet. Falls der Wert nicht vorhanden ist, > wird -1 zurückgegeben.


    -Tobi97