Eine HighScore Liste erstellen
Diese FAQ ist vor allem an Anfänger gerichtet, dir ihr Spiel durch eine HighScore Liste aufwerten wollen
Während sich auf den ersten Blick die TListBox so schön anbietet, müssen wir schon bald merken, dass wir hier unsere Einträge selbst sortieren müssten - möglich, aber es geht natürlich einfacher, und zwar so:
Wir benötigen eine globale
TStringList, die dann unseren HighScore in sich trägt.
Also deklarieren wir diese erst einmal in der
Var-Klausel
Delphi-Quelltext
1: 2: 3: 4:
| var Form1 : TForm1; [...] HighScore : TStringList; |
Diese StringList muss natürlich zunächst einmal erstellt werden, evt. soll auch eine bereits existierende HighScore-Liste geladen werden. Dafür bietet sich natürlich das OnCreate Ereigniss der Form an.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| procedure TForm1.FormCreate(Sender: TObject); var i : integer; begin HighScorePfad := ('c:\MeineHighScoreDatei.dat'); try HighScore := TStringList.Create; finally if FileExists(HighScorePfad) then HighScore.LoadFromFile(HighScorePfad) else begin HighScore.Add('00550 Unknown'); HighScore.Add('01250 Unknown'); HighScore.Add('02250 Unknown'); end; end; end; |
So, das hätten wir. Jetzt brauchen wir noch eine Prozedur, die einen Namen und den dazugehörigen Score in die Liste einträgt, und am besten direkt sotiert, schließlich wollen wir ja, dass unser TopScorer ganz oben steht.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53:
| procedure TForm1.FuegeZumHighScoreHinzu(Name : String; Score : Integer; Trennzeichen : Char; Trennzeichenmenge : integer; ScoreLength : integer); var neuerEintrag : String; i : integer; ATrennzeichen : String; TempStrList : TStringList; AScore : String; begin if HighScore.Count < 2 then Exit; if Trennzeichenmenge < 1 then Exit; for i := 1 to Trennzeichenmenge do begin ATrennzeichen := ATrennzeichen + Trennzeichen; end; AScore := intToStr(Score); while Length(AScore) <> ScoreLength do begin AScore := '0' + AScore; end; TempStrList := TStringList.Create; try for i := 0 to HighScore.Count-1 do begin TempStrList.add(HighScore[i]); end; finally try TempStrList.add(AScore + ATrennzeichen + Name); TempStrList.Sort; HighScore.clear; finally try for i := (TempStrList.Count - 1) downto 0 do begin HighScore.add(TempStrList[i]); end; HighScore.SaveToFile(HighScorePfad); finally TempStrList.Free; end; end; end; end; |
Nachdem wir unsere Procedure
geforwardet haben - wir greifen schließlich auf ein Element aus der Unit zu (HighScore), können wir sie benutzen.
Zunächst aber noch kurz den Forward:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| type TForm = Class(TForm); [...] private [...] HighScorePfad : String; public procedure FuegeZumHighScoreHinzu(Name : String; Score : Integer; Trennzeichen : Char; Trennzeichenmenge : integer; ScoreLength : integer); [...] |
Diese Highscore-Liste können wir jetzt
speichern, ins Internet
hochladen,
verschlüsseln und natürlich, das wichtigste auch
anzeigen bzw. einen Eintrag zum Highscore
hinzufügen lassen.
Anzeigen können wir sie z.B. so:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TForm1.Button1Click(Sender: TObject); var i : integer; begin for i := 0 to highscore.count - 1 do begin memo1.lines.add(HighScore[i]); Listbox1.items.add(HighScore[i]); end; end; |
Einen Eintrag fügen wir so hinzu:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm1.Button2Click(Sender: TObject); begin FuegeZumHighScoreHinzu('Karlson', 5000, #32, 5, 5); end; |
Ich hoffe nichts vergessen zu haben. Noch zu sagen ist, dass ich den Code nicht getestet habe, falls was nicht klappt, ->PM oder, aber selber regeln, durch die Kommentare sollte hoffentlich alles verständlich sein.
Es handelt sich hier wie gesagt um eine einfache, sehr ausführliche und verständliche Lösung um eine HighScoreliste zu realisieren. Es geht sicherlich kürzer.
gruss
Karlson
Moderiert von jasocul: Kleine Korrekturen am Source durchgeführt. Source ist jetzt auch getestet
Moderiert von jasocul: Beitrag geprüft am 26.06.2006