Home Tutorials Game Maker Mehrfache Sortierung von Arrays

Mehrfache Sortierung von Arrays

0
Bild von OpenClipart-Vectors auf Pixabay
  • 2Minuten

Häufig steht man bei Spielen vor dem Problem, dass man Tabellen (meistens Arrays) nach mehreren Kriterien sortieren möchte. Dieses Tutorial zeigt anhand einer Sport-Tabelle, wie man das einfach realisiert.

Die Tabelle

In einem der letzten Tutorials ging es um einen Spielplangenerator. Diesen Gedanken möchte ich aufgreifen, um das Tutorial zu erklären. Angenommen, wir haben ein Spiel, in dem in einem Ligamodus mehrere Spieler gegeneinander spielen. Nach jedem Spieltag wollen wir eine Tabelle sehen. Diese sieht zufällig wie eine Fußballtabelle aus.

Sortiertes Array
Sortierte Tabelle

Wir haben Platzierung, Name, Spiele, Siege, Unentschieden, Niederlagen, Tore, Tordifferenz und die Punkte. Sortiert wurde die Tabelle wie folgt:

  • Alphabetisch
  • nach Punkten
  • nach der Tordifferenz
  • Siege
  • Anzahl Spiele

Das ist ein bisschen komplexer, aber ich denke, dass viele von euch mehrere solcher Kriterien suchen. Bevor es los geht, brauchen wir aber ein Array, welches sortiert werden kann.

Array und Structs

Bevor wir Daten verarbeiten, müssen wir uns darüber Gedanken machen, wie wir Daten erfassen. Um GameMaker Studio gibt es dazu sehr viele verschiedene Methoden, die alle ihre Vor- und Nachteile haben. Ich bin generell ein großer Fan von Arrays, weil die in nahezu jeder Sprache funktionieren und ich dadurch die Option behalte, Code einfach von einer Sprache in die andere zu konvertieren (etwa in PHP oder JavaScript).

Nun gibt es aber auch die Möglichkeit von Structs. Ein Struct ist eine Variable, die eine Sammlung von anderen Variablen enthält. Die Variablen, die ein Struct enthält, können verschiedene Datentypen haben, und diese Variablen können nach der anfänglichen Struct-Deklaration gelesen und beschrieben werden.

Man kann Structs und Arrays kombinieren, was im Code große Vorteile bringt. Um das zu demonstrieren, zeige ich gleich das Create-Event:

Wir haben das Array arr_clubs angelegt. Hier befinden sich die 18 Vereine (0 bis 17). Doch anstatt wie in einem 2D-Array mit Nummern zu arbeiten, enthält jedes Array weitere Variablen. In diesem Fall:

  • league (die Liga, falls es mehrere Ligen geben sollte)
  • wins
  • draws
  • defeat
  • go (die Tore)
  • goa (die Gegentore)
  • player

Im Beispiel wird es drei menschliche Spieler geben, die in der Tabelle mit ihren eigenen Farben angezeigt werden.

Wenn man sich das anschaut, ist der Vorteil von Structs offensichtlich: Statt bspw. nach arr_table[i][2] zu suchen, suchen wir arr_table[i].wins. So lässt sich der Code leichter schreiben und lesen.

Wichtig ist noch folgendes: Das Array arr_clubs wird nicht sortiert. Hier verändern wir lediglich die Werte. Sortiert wird das Array arr_table. Dafür nutzen wir die Funktion give_club_table, welche wiederum auf drei kleine Funktionen zugreift.

Die Hilfsfunktionen

Wie man aus dem Array sehen kann, speichern wir nicht die Anzahl der gespielten Spiele, Punkte und die Tordifferenz. Das berechnen wir, bevor die Tabelle sortiert wird. Da es jeweils nur eine Zeile ist, könnte man das auch in die Hauptfunktion legen, aber ich fand es so eleganter. Hier sind die drei selbsterklärenden Funktionen:

Array sortieren

Nun geht es an die Hauptfunktion. Zunächst der Code:

Wir übergeben zwei Argumente: Array und Liga. Zuerst deklarieren wir die lokale Variable arr_table. Daraufhin gehen wir das übergebene Array arr in einer Schleife durch. Wenn der Verein der jeweiligen Liga entspricht, übergeben wir die Zeile an das lokale Array. Anschließend berechnen wir Punkte, Spiele und Differenz mit den Hilfsfunktionen.

Sobald das geschafft ist, haben wir das lokale Array vorbereitet und können es nun sortieren. Dafür benötigen wir zwei Schleifen. In der ersten Schleife greifen wir uns einen Verein. Dann gehen wir in der zweiten Schleife alle Vereine durch, die darauf folgen.

Zuerst sortieren wir das Array alphabetisch. In der Praxis ist das vor allem vor dem ersten Spieltag wichtig, da wir keine anderen Werte haben bzw. alles andere auf null steht. Mit string_lower wandeln wir intern die Vereinsnamen in Kleinbuchstaben um und Vergleichen dann ihre „größe“. Bspw. ist „b“ größer „a“, „c“ größer „b“ etc. Wenn aus den beiden Schleifen i größer ist als j, tauschen die Vereine die Plätze. Hierfür wird die Hilfsvariable a benutzt.

Nachdem das getan ist, geht es an die Punkte. Im Kern funktioniert das ebenso, nur verschieben wir hier i nur, wenn es kleiner ist als j.

Ab der Tordifferenz läuft es etwas anders, weil hier erst sichergestellt werden muss, dass die Punktzahl gleich ist. So geht das stufenweise weiter. Ist die Tordifferenz ebenfalls identisch, geht es um die Siege. Man könnte hier natürlich auch nach der Anzahl erzielter Tore sortieren. Und wenn das ebenfalls gleich ist, sortieren wir nach den Spielen, wobei die Mannschaft höher steht, die mehr Spiele gespielt hat.

Noch einmal zum Verständnis: Wenn die Punkte unterschiedlich sind, spielt der Rest keine Rolle mehr.

Das Prinzip lässt sich beliebig erweitern, etwa mit der Anzahl der Karten, Platzverweise, Fans und was auch immer.

Draw-Event

Die sortierte Tabelle soll angezeigt werden. Hier ein Beispiel:

Mit startx und starty kann man die Tabelle beliebig verschieben. In der Switch unterscheiden wir die Farben für die drei Spieler. Selbstredend ist, dass wir erst die Kopfzeile der Tabelle zeichnen und dann in der Schleife die einzelnen Vereine darstellen.

Mögliche Variationen

In solchen Spielen gibt es häufig die Möglichkeit, dass verschiedene Arten von Tabellen angezeigt werden. So gibt es eine sehr ausführliche Tabelle und vielleicht eine verkürzte Fassung, die lediglich Mannschaft, Spiele, Differenz und Punkte anzeigt.

Dafür kann man entweder die vorhandene Funktion anpassen oder eine neue schreiben. Dann wird auch der Vorteil der Hilfsfunktionen deutlich: Man muss später nicht in jeder Hauptfunktion die Berechnungen ändern, sollte dies erforderlich sein.

Beispiele für weitere Anwendungen gibt es genug. Man kann das auch bei einem Array für die besten Torschützen machen, Vereine mit Titeln, eine Highscore-Liste, die mehr Werte hat als nur die Punktzahl u. v. m.

Viel Spaß dabei!

Autor

Abonnieren
Benachrichtige mich bei

0 Comments
Inline Feedbacks
Alle Kommentare anzeigen
wpDiscuz
0
0
Ich würde mich über Ihre Meinung freuen, bitte kommentiere.x
Die mobile Version verlassen