Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 20 von 24

Thema: Algorithmus zum anordnen von Gegenstaende...

  1. #1

    Algorithmus zum anordnen von Gegenstaende...

    Also ich wollte meine Gegenstaende anordnen lassen. Dazu habe ich auch schon was versucht zu schreiben. Will aber nicht funktonieren. Dabei sollte aber gesagt sein, dass ich nur aufruecken will. D.h. wenn z.B. wenn der dritte Slot leer ist, wird dieser von dem vierten aufgefuellt... usw. Also will ich euch fragen wo der Fehler steckt oder ob ich an das Problem ganz falsch ran gehe.

    Zum Verstaendnis, erklaere ich erst mal meine Vergabe der Variablen.

    901 Itempointer: Ist wie gesagt der Pointer der die Items aufuellt. Er faengt dabei bei 921 an und sollte bei 960 aufhoeren.

    902 LastSlot: Wie der Name schon sagt, ermittelt diese Variablen den letzten Slot. Sie laeuft mit und ist die Abruchbediengung.

    903 Itemvergleich:In dieser Variable wird der Wert des Pointers gespeichert. Sie dient als Vergleich, ob der jeweilige Slot besetzt ist oder nicht

    905 ItemID: Hier wird der Wert zugewiesen. D.h. im Shop kauft man nun einen kleinen Heiltrank und die Variablen nimmt in diesem Fall 1 an.

    914 Itempointsaver: Diese Variable soll als Zwischenspeicher dienen. Geht der Pointer z.B. auf 922 Speicher er den Wert und uebertraegt diesen auf 921 (siehe screenshot).

    Nun gut. Das ist was man alles ueber mein Spiel wissen sollte.

    Hier ist nun das Script fuer das "Aufuellen (erhalten) von Gegenstaenden". Dieses funktioniert. Ist ja aber auch nicht so schwer.



    Das Script zum ordnen funktioniert gar nicht. Also als erstes wird der Pointer auf den Anfang gestellt. Nun wird in einer Schleife gefragt ob der Slot 0 ist oder nicht ist er 0, sollte der Pointer einen Slot weiter gehen. Ist der naechste groesser als 0, wird der Wert gespeichert (914). Der Pointer geht zureuck und gibt den Wert an den vorhergehenden Slot. Leider funktioniert das gar nicht.

    Toll waere aber, wenn mein Ordnungsscript nach Zahlen ordnet. D.h. Zuerst alle Slots mit einsen bestuecken, dann mit zweien usw. Z.B:

    1.Slot=1
    2.Slot=3
    3.Slot=1
    4.Slot=2

    Nach dem Ordnen sollte es wie folgt aussehen:

    1.Slot=1
    2.Slot=1
    3.Slot=2
    4.Slot=3


    Ich hoffe ihr wisst was ich meine... Danke schon mal im voraus...

    Geändert von lokipoki (11.10.2006 um 15:33 Uhr) Grund: Rechtschreibung

  2. #2
    Also wenn du nur die leeren Stellen im Inventar weghaben willst, würde ich das so machen (ich gehe mal beim Beispiel davon aus, dass Variablen 1-50 das Inventar sind):

    Code:
    Label 1
    Switch "Verschoben" = OFF
    Forc Variable 50 > 0
      Forc Variable 49 = 0
        Variable 49 = Variable 50
        Variable 50 = 0
        "Verschoben" = ON
      end
    end
    ... Das Gleiche mit 49/48, 48/47 usw. Der letzte Vergleich ist 2/1.
    
    Forc "Verschoben" = ON 
      goto label 1
    end
    Vielleicht gibt es eine bessere Methode, bei der man nicht für jede Variable eine Forc braucht, aber funktionieren tut diese auf jeden Fall. Falls du nach anderen Kriterien (wie z.B. der größten Menge oder so) ordnen willst, müßte das Script natürlich ein wenig verändert werden.

    Geändert von Kelven (11.10.2006 um 15:44 Uhr)

  3. #3
    Zitat Zitat von Kelven Beitrag anzeigen
    Also wenn du nur die leeren Stellen im Inventar weghaben willst, würde ich das so machen (ich gehe mal beim Beispiel davon aus, dass Variablen 1-50 das Inventar sind):

    Code:
    Label 1
    Switch "Verschoben" = OFF
    Forc Variable 50 > 0
      Forc Variable 49 = 0
        Variable 49 = Variable 50
        Variable 50 = 0
        "Verschoben" = ON
      end
    end
    ... Das Gleiche mit 49/48, 48/47 usw. Der letzte Vergleich ist 2/1.
    
    Forc "Verschoben" = ON 
      goto label 1
    end
    Vielleicht gibt es eine bessere Methode, bei der man nicht für jede Variable eine Forc braucht, aber funktionieren tut diese auf jeden Fall. Falls du nach anderen Kriterien (wie z.B. der größten Menge oder so) ordnen willst, müßte das Script natürlich ein wenig verändert werden.
    So kann man das machen. Aber ich wollte doch eigentlich das erst alle einsen und dann alle zweien... Wie ich es oben beschrieben habe. Kann man irgendwie mit einen Pointer machen. Dein Code ist zwar gut, aber leider nicht die Loesung fuer mein Problem

    Hast du dir mal mein Script angesehen? Weist du wo der Fehler liegt?

  4. #4
    Bei deinem Script blicke ich nicht wirklich durch. Wobei das ja auch zum Auffüllen der Gegenstände sein soll. Da fehlen aber irgendwie die Variablen in die die Gegenstände geschrieben werden, oder nicht? Falls es bei dir überhaupt Variablen sind. Ich hätte das ganz stumpf so gescriptet (wieder sind 1-50 die "Slots" für Gegenstände, die ID vom Gegenstand ist Variable 51):

    Code:
    Forc Variable 1 = 0
      Variable 1 = Variable 51
      Goto label 1
    end
    Forc Variable 2 ... usw.
    Label 1
    Sortieren könntest du mit meinem Algorithmus so:
    Code:
    Label 1
    Switch "Verschoben" = OFF
    Forc Variable 50 > 0
      Forc Variable 49 = 0
        Variable 49 = Variable 50
        Variable 50 = 0
        "Verschoben" = ON
      else
        Forc Variable 50 < Variable 49
          Variable 51 (temporäre Variable) = Variable 50
          Variable 50 = Variable 49
          Variable 49 = Variable 51
          "Verschoben" = ON
        end
      end
    end
    ... Das Gleiche mit 49/48, 48/47 usw. Der letzte Vergleich ist 2/1.
    
    Forc "Verschoben" = ON 
      goto label 1
    end
    Das müßte eigentlich klappen.

  5. #5
    Erstmal
    @Kelven: lokipoki arbeitet mit Pointern, also "Variablen-Numbers" oder wie das im RPG-Maker heißt (Bei welchem Maker sind wir eigentlich?). Dadurch braucht er nicht für jede Variable eine Fork/Branch machen. Das Programm macht es selbst, indem es an diese Poitervariablen den Inhalt einer anderen, wechselnden Variable übergibt. Außerdem müsste man deine Reihenfolge umdrehen, also von der ersten bis zum letzten Item gehen (1 bis 50), sonst entstehen immer wieder Lücken. Stell dir einen Stau vor in dem das letzte Auto als erstes an den Vordermann aufschließt und danach nichts mehr macht. Nicht effektiv...

    Eh, zu dem Script... Ich versteh jetzt noch nicht wo das Problem liegt: Funktioniert das gezeigte Script oder nicht? Am Anfang hast du geschrieben, dass das Auffüllen Script funktioniert und dann, dass es dort einen Fehler gibt. Ich gucks mir jetzt estmal an und editiere dann hier rein oder poste neu.


    EDIT:
    Fürs Sortieren würd ich bei so wenig Objekten das einfache Bubble Sort nehmen (man könnte zwar auch Einfüge-Algorithmen nehmen, die sind aber komplizierter und bringen nur zeitliche Vorteile)



    Geändert von CapSeb (11.10.2006 um 18:45 Uhr)

  6. #6
    dashier ordnet der reihe nach...


    wobei die vari 0020 slotdurchlauf ganz am anfang den wert des anfangsitemsslots-1 bekommt..
    in deinem falle also 920
    und die abbruchsbedingungen (die forks wo dann zu den labels gesprungen wird...) sind dann nicht bei <10 sondern bei <960 (also die nummer des letzten itemslots)

    mfg
    üH

  7. #7
    @CapSeb
    So was gibt es beim Maker? Ich sollte mir die Funktionen vielleicht doch lieber mal genauer ansehen. XD Hm ja, von oben anfangen sollte auch gehen, so genau kenne ich mich mit der Effizienz von Sortieralgorithmen nicht aus. Bei der kleinen Menge Datein beim Makern macht es aber wohl keinen Unterschied.

    Mit meinen neugewonnenen Makerkenntnissen hab ich jetzt nochmal versucht den Algorithmus zu überarbeiten Der Faulheit halber schreibe ich das aber wieder in Pseudocode.

    Variablen 1-20 sind Inventar
    Variable 21 ist der Counter
    Variable 22 ist der Nachfolger des Counters
    Variablen 23-25 sind temporäre Variablen zum Testen
    Switch 1 ist zum Testen ob getauscht wurde

    Code:
    Label 1
    Variable21 = 1
    Switch1 = OFF
    
    Loop
      if Variable21 = 20
         Break
      else
         Variable22 = Variable 21
         Variable22 += 1 #Der Nachfolger vom Counter
         Variable23 = Pointer[Variable21] #Inhalt von Counter
         Variable24 = Pointer[Variable22] #Inhalt vom Nachfolger
         if Variable23 = 0
           if Variable24 > 0
             Pointer[Variable21] = Variable24
             Pointer[Variable22] = 0 #Die Null wird nach unten geschoben
             Switch1 = ON
           end
         else
           if Variable23 > Variable24
             if Variable24 != 0
               Pointer[Variable21] = Variable24
               Pointer[Variable22] = Variable23 #Beide Werte werden getauscht
               Switch1 = ON
             end
           end
         end
      end
      Variable21 += 1
    end
    
    if Switch1 = ON
      Goto Label 1
    end

    Geändert von Kelven (11.10.2006 um 18:43 Uhr)

  8. #8
    Boah, was Text!
    (Ich hab übrigens die Lösung in meinen älteren Beitrag reineditiert)

    Zitat Zitat von Kelven
    Hm ja, von oben anfangen sollte auch gehen, so genau kenne ich mich mit der Effizienz von Sortieralgorithmen nicht aus. Bei der kleinen Menge Datein beim Makern macht es aber wohl keinen Unterschied.
    Leider geht es von "unten" garnicht. Nochmal zum Stau-Beispiel: Platz 1, 2,3, 5 und 6 sind besetzt. Platz 4 frei. Auto 6 kann nicht fahren. Auto 5 geht an Stelle 4. Auto 3 bis 1 sind korrekt vorne.
    Aber jetzt müsste Auto 6 fahren, denn Platz 5 ist frei geworden. Seine Fork ist aber schon vorbei, bleibt also stehen. Andersrum geht das Auffahren auch nur dann, wenn man nach dem Weiterfahren auch die nächste Lücke beachtet: Auto 1, 2 und 3 bleiben stehen. Auto 5 schließt auf, fährt aber nicht weiter, denn Platz 3 ist voll. Auto 6 fährt auf Platz 5. Da er weiterfahren könnte, muss man auch Platz 4 überprüfen. Weil dieser frei ist, muss er auch dorthin fahren.

    Insgesamt also nicht so einfach wies am Anfang scheint.

    Zitat Zitat von Kelven
    Mit meinen neugewonnenen Makerkenntnissen hab ich jetzt nochmal versucht den Algorithmus zu überarbeiten. Der Faulheit halber schreibe ich das aber wieder in Pseudocode.
    Jo, das mit den Pointern sieht richtig aus. Nur:
    wenn 0 < Variable23 < Variable24 wird der Schlalter nicht aktiviert. Bei teils vorsortierten Feldern kann das durchaus passieren.
    Außerdem muss beim Tauschen die eine Variable zwischengespeichert werden, weil sie sonst überschrieben wird. Die erste Variable erhält den Wert der zweiten. Aber welchen Wert bekommt die zweite Variable, den Wert der ersten gibt es ja nicht mehr!?
    Auch wird der Sortiervorgang leider nicht funktionieren. Wenn zum Beispiel Zahl sechs (10 Einheiten groß) und Zahl fünf (18 Einheiten groß) gleich am Anfang sortiert werden, wird eine von beiden als die kleinere definiert (10 Einheiten groß) und deshalb nachher nicht mehr beachtet auch wenn Zahl zwei viel kleiner ist. So sieht es zumindest meinem Wissensstand nach aus.

    @übelster Held
    ..kann sein. Sorry, hab da kein Durchblick.

  9. #9
    @CapSeb
    Zitat Zitat
    Leider geht es von "unten" garnicht.
    Ne, das kann nicht sein, ich hab das schon seit Ewigkeiten so bei meinen Spielen gemacht. Klappte ohne Probleme. Die Liste wird durch den Switch solange durchlaufen bis nicht getauscht wurde. Man hat zwar mehr Durchläufe, aber bei der geringen Datenmenge geht das nicht auf die Performance.

    Zitat Zitat
    wenn 0 < Variable23 < Variable24
    Wenn dieser Fall eintritt steht Variable24 an der richtigen Stelle. Es soll ja von klein nach groß sortiert werden (und die Nullen ans Ende).

    Zitat Zitat
    Außerdem muss beim Tauschen die eine Variable zwischengespeichert werden, weil sie sonst überschrieben wird. Die erste Variable erhält den Wert der zweiten. Aber welchen Wert bekommt die zweite Variable, den Wert der ersten gibt es ja nicht mehr!?
    Die beiden Testvariablen werden nicht überschrieben und die weise ich dann den Inventarvariablen zu. Deswegen ist ein Zwischenspeichern nicht nötig (da sie ja schon zwischengespeichert sind).

    Zitat Zitat
    Auch wird der Sortiervorgang leider nicht funktionieren. Wenn zum Beispiel Zahl sechs (10 Einheiten groß) und Zahl fünf (18 Einheiten groß) gleich am Anfang sortiert werden, wird eine von beiden als die kleinere definiert (10 Einheiten groß) und deshalb nachher nicht mehr beachtet auch wenn Zahl zwei viel kleiner ist. So sieht es zumindest meinem Wissensstand nach aus.
    Im Maker hat das bei mir allen Anschein nach funktioniert. Es wird auch bei diesem Algorithmus solange von vorne angefangen, bis nicht getauscht wurde.

  10. #10
    Zitat Zitat von Kelven
    Die Liste wird durch den Switch solange durchlaufen bis nicht getauscht wurde.
    Ich bin irgendwie blind heute. Hab den Label garnicht beachtet. Stimmt, dann gehts auf jeden Fall.

    Zitat Zitat von Kelven
    Wenn dieser Fall eintritt steht Variable24 an der richtigen Stelle.
    em, ja... das gleiche wie beim ersten. Das Switch Ausschalten steht ja im Loop, es muss also nur ein einziges Mal getauscht werden, damit er angeht.

    Zitat Zitat von Kelven
    Die beiden Testvariablen werden nicht überschrieben und die weise ich dann den Inventarvariablen zu.
    Ich hab... egal. Du hast einfach nur Recht ...

    Zitat Zitat von Kelven
    Im Maker hat das bei mir allen Anschein nach funktioniert. Es wird auch bei diesem Algorithmus solange von vorne angefangen, bis nicht getauscht wurde.
    Ich geb mich geschlagen. Das nächste Mal werd ich wohl etwas genauer hingucken müssen.
    ..Nur ein Problem bleibt: Es enthält sehr viele ungenutzte Durchgänge. Bei 50 Items denk ich aber, dass es da "noch" keine Probleme geben dürfte.

  11. #11
    Danke erstmal an alle. Ich werde es mal ausprobieren.

  12. #12
    @CapSeb:

    Ok der Alogrithmus hat zwei Nachteile.

    1.Erverschiebt alle Items nach "hinten". D.h. wenn ich z.B. 5 Items habe, werden diese auch sortiert, erscheinen aber auf den hinteren Slots.

    2. "Luecken" werden nicht aufgefuellt. D.h. wenn z.B. Slot 1 und Slot 3 belegt sind, werden diese Stellen zwar verreuckt/geordnet, aber die Luecke bleibt.

    Kannst mir dabei helfen die beiden Probleme zu beseitigen?

  13. #13
    naja... mein code hätte das prob nich...^^"

  14. #14
    Es lässt vermuten, dass du verschiedene Variablen hast, die als Namen das Item und als Wert die Position haben.
    Du müsstest es genau andersrum machen, so dass die Variable "ItemPosi1" einen Wert hat, der die ItemID angibt. "ItemPosi1 = 6" heißt dann, dass an erster Stelle das Item mit der ID 6 steht (zB. Antidote). Somit würde Bubble Sort komplett funktionieren, wenn man es richtig umstellt.
    Das Ganze hat sogar noch den Vorteil, dass du nur so viele "ItemPosiX"-Variablen brauchst, wie du maximal Items aufnehmen kannst, auch wenn es theoretisch 1000 verschiedene Items gibt.
    Dieser Vorteil tritt aber nur auf, wenn du nicht alle Items unsortiert in die ItemPosi-Liste kopieren müsstests, was bei Bubble Sort leider der Fall ist. Denn man kann nur das tauschen, was schon existiert. Aber die ItemPosis sind ja am Anfang noch leer...
    Deswegen würde ich ein anderes Verfahren benutzen: Strait Insertion.






    ...Wer Fehler findet, bitte melden.
    ...Wer Verständnis-Fragen hat, genau nachhaken.
    ..und, ach ja: Der Doppel-Pointer ist schon richtig so (ItemPosi-->ItemID-->Anzahl)

    Geändert von CapSeb (14.10.2006 um 00:34 Uhr)

  15. #15
    Also welches Verfahren, das Bubble oder das Strait Insertion Verfahren, laesst sich auf mein "Problem" anwenden?

    Wie es fuer mich aussieht, wuerde ich erst mal das Strait Insertion Verfahren...

  16. #16
    Zitat Zitat von CapSeb Beitrag anzeigen




    ...Wer Fehler findet, bitte melden.
    ...Wer Verständnis-Fragen hat, genau nachhaken.
    ..und, ach ja: Der Doppel-Pointer ist schon richtig so (ItemPosi-->ItemID-->Anzahl)

    Habe ich das richtig verstanden, dass das Strait Insertion Verfahren aufgerufen wird wenn ich ein Item aufnehme und es dann automatisch geordnet wird?

    Und wieso "*Komlette ItemPosi-Liste leeren mit Schleife oder einzeln*"? Hab ich auch nicht ganz verstanden...

  17. #17
    Ist es denn eigentlich notwendig, dass gleiche Items doppelt vorkommen können? Weil wenn alle gleichen Items zusammengefasst werden, gibt es auch einfachere Methoden, bei denen man ohne Sortierung auskommt.

  18. #18
    Zitat Zitat von Kelven Beitrag anzeigen
    Ist es denn eigentlich notwendig, dass gleiche Items doppelt vorkommen können? Weil wenn alle gleichen Items zusammengefasst werden, gibt es auch einfachere Methoden, bei denen man ohne Sortierung auskommt.
    Das hat mich an den meisten alten RPgs schon immer gestoert. Z.B. Breath of Fire 2. Man hatte dort einen Slot und konnte 9 Gegenstaende "reinhauen". Heut zu tage, z.B. Diablo, Gothic oder Morrowind, haben Slots auch ihre Berechtigung, auch wirklich fuer einen Gegenstande da zu sein...

    Und so wollte ich das auch in meinem Spiel haben. Ein Slot, ein Gegenstand. So wie es sein sollte. Anders seids, verliert der Bergiff Slot, in meinen Augen, seine Bedeutung...

  19. #19
    Bei den östlichen Spielen hat man auch heute noch unbegrenzte Inventare. Das ist zwar unrealistisch, aber mMn praktischer.

  20. #20
    Zitat Zitat von Kelven Beitrag anzeigen
    Bei den östlichen Spielen hat man auch heute noch unbegrenzte Inventare. Das ist zwar unrealistisch, aber mMn praktischer.
    So geht aber irgendwie der Taktik im KS floeten. So kann man soviele Heiltraenke wie man will mit sich rumschleppen und sich immer wieder heilen...

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •