Du machst was falsch
Der Code in dem Tutorial funktioniert zu 100%.
Poste mal was du bis jetzt hast.
Die von dir angesprochenen Fragen, werden im Faq Beitrag übrigens beantwortet!
Aber nochmal verständlicher und zum mitschreiben
Wir wollen:
- Eine StringList, in der die HighScore Daten gespeichert sind. Warum...?
- ...Weil die TStringList über die Procedure Sort verfügt.
Was mach Sort konkret:
Quelltext
1: 2: 3:
| 5000 Karlson 3431 Karlson 3432 Soundso |
Wenn wir die Sort Prozedure aufrufen, sieht die Liste so aus:
Quelltext
1: 2: 3:
| 3431 Karlson 3432 Soundso 5000 Karlson |
Okay, das macht sort, dazu später mehr.
Wie bekommen wir den Punktestand und den Namen des Spieler in diese StringList?
So:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| var H : TStringList; Punkte, NAme : String; begin Punkte := 5000; Name := 'Karlson'; H := TSTringList.Create; H.add(Punkte + ' ' + Name); end; |
Nun haben wir eine Liste mit sagen wir mal 3 Einträgen.
Dann können wir jetzt auch erstmal den Sort Befehl aufrufen:
Delphi-Quelltext
Nun ist unsere Liste sortiert, aber halt leider falschrum. In einer HighScore Liste soll schließlich der beste oben stehen. Das können wir aber berücksichtigen, wenn wir die Liste anzeigen lassen. z.B. in einer ListBox.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| var i : integer; begin ListBox1.Items.Clear; for i := H.Count-1 downto 0 do ListBox1.items.add(H[i]); end; |
Was machen wir hier? Die StringList ist sowas wie ein liniertes Blatt Papier. Jede Zeile hat eine feste Zuordnungszahl. Etwas verwirrend ist, dass die erste Zeile die Zuordnungszahl 0 hat.
Also, wir weissen der Zählvariable i an, bei der letzen Zeile unseres Blatts (die Zeilenanzahl bekommen wir mit StringList.count, da wir bei 0 anfangen zu zählen, ist die letze Zeile natürlich StringList.Count-1) anzufangen, diese Zeile in die ListBox einzutragen. da die Letze Zeile der sortierten StringList den höchsten Wert hat (nicht vergessen, es wurde von unten nach oben sortiert) muss sie als erstes in die Listbox eingeschrieben werden.
Eines noch:
Es gibt ein kleines Problem beim sortieren der Liste:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| 3 6 4 5 1 11
Daraus wird:
1 11 3 usw. |
Die Sort funktion, sortiert leider
Chargebunden. Das bedeutet, dass sie nur den ersten Buchstaben in betracht zieht. Sie intressiert es folglich nicht, dass 11 eigentlich grösser als 3 ist. Sie intressiert nur, dass die erste Ziffer der gesamten Linie kleiner als drei ist.
Das ganze umgehen wir, indem wir alle Punktzahlen auf die gleiche Zeichenlänge bringen.
Bei gleichen Ziffern, wir nämlich immer die nächste genommen, klingt kompliziert, das hier sollte verständlicher sein:
Quelltext
1: 2: 3: 4: 5: 6: 7:
| 01 03 04 05 08 11 40 |
So kommt die Sortierfunktion nicht mehr durcheinander.
Codegebunden machen wir das so, dass wir direkt beim eintragen des Namens und der dazugehörigen Punktzahl in die StringListe den Punktwert auffüllen.
Delphi-Quelltext
1: 2: 3:
| while length(punkte) > 5 do Punkte := '0' + Punkte; Highscore.add(Punkte + ' ' + Name); |
Das ganze ist noch ausführlicher im Faqbeitrag erklärt, also lesen
