Autor Beitrag
Karlson
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 2088



BeitragVerfasst: Di 18.01.05 23:17 
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

ausblenden 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.

ausblenden 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');
   //Wenn keine Liste vorhanden ist, füllen wir sie eben mit ein paar phantasiewerten
   //Aus Optikgründen solltet ihr die selbe ScoreLength und Trennzeichenlaenge verwenden (siehe unten)
  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.

ausblenden volle Höhe Delphi-Quelltext
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;
 // Es müssen mindestens 2 Einträge in der HighScoreliste bereits stehen
 if Trennzeichenmenge < 1 then Exit;
 // Weniger als ein Trennzeichen oder gar negative Trennzeichen sind nicht möglich
 for i := 1 to Trennzeichenmenge do
  begin
   ATrennzeichen := ATrennzeichen + Trennzeichen;
  end;
 // Unser Trenzeichenstring ist fertig
 AScore := intToStr(Score);
 while Length(AScore) <> ScoreLength do
  begin
   AScore := '0' + AScore;
  end;
 // Wir füllen die fehlenden Stellen im Score mit 0 auf. Damit alle Scorewerte in der Tabelle später
 // gleich lang sind. So kommt das Programm beim Sortieren nicht durcheinander, und es sieht besser aus
 TempStrList := TStringList.Create;
 // Wir erstellen eine zweite temporäre Stringlist, in der wir dann sortieren
 try
  for i := 0 to HighScore.Count-1 do
   begin     
    TempStrList.add(HighScore[i]);
   end;
  finally
   try
    TempStrList.add(AScore + ATrennzeichen + Name);
    TempStrList.Sort;
    //Sort ist eine sehr praktische Funktion der TStringList die wir benutzen
    HighScore.clear;
   finally
    try
     for i := (TempStrList.Count - 1downto 0 do
      begin
       HighScore.add(TempStrList[i]);
      end;
      //hier fügen wir in umgekehrter Reihenfolgen die Werte aus der TempStringlist
      //in unsere HighScore Liste
      HighScore.SaveToFile(HighScorePfad); // Speichern nicht vergessen
   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:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
type
 TForm = Class(TForm);
 [...]
 private
 [...]
   HighScorePfad : String// Damit immer die selbe Datei verwendet wird
 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:

ausblenden 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]);
   //z.B. in einem TMemo anzeigen lassen 
   Listbox1.items.add(HighScore[i]);
   //oder in eine TListbox
  end;
end;


Einen Eintrag fügen wir so hinzu:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.Button2Click(Sender: TObject);
begin
 FuegeZumHighScoreHinzu('Karlson'5000#3255);
 // Name ist Karlson
 // Er hat den Score 5000 geschafft
 // Als Trennzeichen zwischen Name und Score soll das Leerzeichen stehen, ihr hättet anstatt der #32 auch einfach ' ' schreiben können
 // Zwischen namen und Score sollen 5 Trennzeichen eingefügt werden
 // Der Score soll auf 5 Stellen verlängert werden, aus 5000 wird als 05000
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 user profile iconjasocul: Kleine Korrekturen am Source durchgeführt. Source ist jetzt auch getestet
Moderiert von user profile iconjasocul: Beitrag geprüft am 26.06.2006