bräuchte Hilfe bei einem Skript

  • GM 8
  • bräuchte Hilfe bei einem Skript

    Hallo, ich bräuchte hilfe bei einem Skript:

    hier erstmal was es können soll:
    Ich hab eine Liste in der die Ids von bis zu 16 Objekten drinn sind.
    Das skript sollte jetzt die Objekte durchsehen und zählen wie jeweils der Objekttyp (also nach dem object_index).
    Zudem sollen alle objekte von der durchsucheung von vornherein ausgeschlossen werden bei denen var1, var2, var3, oder var4, = 1 ist.
    In diesen Objekte soll die variable "marked" auf 0 gesetzt werden.
    Zum schluss soll die object_index der meistvorhandenen Objekte returnt werden.
    Die object_index der anderen Objekte werden nicht benötigt.
    Wenn 2 Objekte gleich oft vorkommen ist es im Grunde egal welches genommen wird (ideal wäre das das am obersten in der Liste ist).

    Wollte nun fragen wie ich das am besten lösen könnte.
    Ich könnte natürlich durch die objekte in der Liste gehen, jeweils in einen Array den index speichern und dann anschließend vergleichen welches nun am häufigsten vorkommt :/

    Aber ich denke das wär äußerst langsam da theoretisch später 16 verschiedene Objekte da sein könnten.

    Für antworten und hilfen wär ich sehr sehr dankbar :)
    Danke auch schon mal im Vorraus xD

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)
  • Wollt erst nich gleich nen ganzen Script schreiben, aber dann hab ichs doch gemacht :P(Als Herausforderung für mich selbst ^^ ).
    Das ist rausgekommen(noch nicht gestestet, aber 2x durchgelesen ^^ :(

    GML-Quellcode

    1. list_objects=ds_list_create() //list_objects = id der Liste mit deinen Objecten
    2. ds_list_add(list_objects,obj_1)
    3. ds_list_add(list_objects,obj_2)
    4. ds_list_add(list_objects,obj_3)
    5. //^^^^zu testzwecken
    6. max_index = 0 //max_index = id einer Instanz des Objects mit der größten Anzahl
    7. for (i = ds_list_size(list_objects); i>0; i-=1) //for-Statement -> die Liste wird von oben durchgegangen
    8. {
    9. object = ds_list_find_value(list_objects,i) //object = id des Objects, das gerade geprüft wird
    10. if (objet.var1 || object.var2 || object.var3 || object.var4) //Wenn eine der Variablen des Objects true(1) ist...
    11. {
    12. object.marked = 0 //...wird marked auf 0 gesetzt...
    13. }
    14. else //...wenn nicht...
    15. {
    16. if object.object_index > max_index.object_index //wird geprüft, ob die Anzahl des aktuellen Objects größer als die, des bisher größten Objects ist.
    17. max_index = object //Wenn ja wird das aktuelle Object das neue häufigste Object
    18. }
    19. }
    20. return max_index //die id des häufigsten Objects wird wiedergegeben
    Alles anzeigen

    Ich hoffe ich hab alles gut kommentiert :D
  • Vielen dank, hätte selber drauf kommen müssen xD
    Denke es sollte gut funktionieren.
    Nur in der fünft-letzen Zeile muss ich noch object.object_index hinschreiben da die index benötigt wird.


    //Edit:
    Blödsinn, es funktioniert nicht, auf sowas ähnliches war ich sehr wohl gekommen aber das returnt nur das Objekt mit dem gröten object_index

    Das Problem ist garnicht so einfach :/

    EDIT: sorry für doppelpost aber wollte den tread hochbringen <- bei nicht mal 3 Stunden ist das keine Entschuldigung. Posts zusammengeschoben.
    -Ih³




    EDIT: hm, ich mach jetzt mal lieber nicht nochmal doppelpost xD

    Habs selbst geschafft, war echt nicht einfach aber es funktioniert einwandfrei und ich glaube es ist auch relativ efektiv.
    Hier falls es jemanden interessiert:

    Quellcode

    1. var i, max_val, num_max, b, num_val, a;
    2. ck_obj = 0; // wichtig, das darf nicht in der oberen Zeile stehen als interne Variable da sonst das execute_string nicht mehr richtig geht (hab 30 Minuten gebraucht um das rauszufinden -.-)
    3. list_size = ds_list_size(marked_units); // erspart ein wenig rechnerei
    4. for(i = list_size-1; i >= 0; i-= 1) // die Liste wird von vorne nach hinten durchgenommen
    5. {
    6. ck_obj = ds_list_find_value(marked_units,i); // die id des Objektes wird in die variable gespeichert
    7. if (ck_obj.stop_build or ck_obj.at_building or ck_obj.stop_ressearch or ck_obj.at_research or ck_obj.stop_adv or ck_obj.at_advance) = true && !(argument1 = 1 && ck_obj.cant_addon = 0 or argument1 = 0) // die variablen die auf 0 sein sollen. Wenn das zweite srgumen 1 ist soll noch eine zusätzliche variable überprüft werden
    8. {
    9. ck_obj.marked = 0; // marked wird für dieses Objekt auf 0 gesetzt
    10. }
    11. else
    12. {
    13. b = execute_string("return(ck_obj."+argument0+");"); // dies sorgt dasfür das man durch das erste Argument bestimmen kann welche variable geprüft werden soll
    14. var_array[i] = b; // der wert wird in das Array gespeichert
    15. for(a = list_size; a > 0; a -= 1) // ein weiterer loop
    16. {
    17. if var_array[a] = b // wenn der momentane Wert der zu überprüfenden Variable an dieser Stelle schon im array ist
    18. num_val += 1; // die Nummer der übereinstimmenden variablen wird erhöht
    19. if num_val > num_max // wenn num_val größer ist als der bisherige num_max
    20. {
    21. num_max = num_val // num_max wird ernäuert
    22. max_val = b // und der wert der variablen wird in max_val gespeichert
    23. }
    24. }
    25. }
    26. }
    27. return(max_val); // der wert der gesuchten variablen das am meisten vohanden ist wird wiedergegeben
    Alles anzeigen

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von DragonGamer ()

  • Kacke. Ich hab object_index und instance_number() verwechselt (Was fürn Anfängerfehler :headtouch: ) und funktionieren tuts dann auch nach Ausbesserung nicht. Da hab ich das Problem wohl ziemlich unterschätzt. Schande über mich :| . Das nächste mal poste ich nicht so voreilig :pinch: .
    Versuche weiterhin herauszufinden was mit meinem code nicht stimmt . :wacko:
    lg peyj
  • mit instance_number hätte es leider auch nicht funktioniert, es sollen nähmlich die Objekte eines typs ja nicht berücksichtigt werden die nicht in der Liste sind.

    Egal, du brauchst dich nicht mehr zu bemühen, hab es ja jetzt gelöst und so funktioniert es noch bessser weil ich damit jede beliebige Variable überprüfen kann.



    Aber trotzdem danke für den Versuch :)

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)
  • Benutzer online 1

    1 Besucher