Entwickler-Ecke
Sonstiges (Delphi) - HighScore ja, aber wie?
BravoLeader501 - Fr 19.07.02 23:32
Titel: HighScore ja, aber wie?
Ich bin dabei, eine Art Quiz zu schreiben. Nun möchte ich aber dem Nutzer auch die Möglichkeit bieten, Seinen Namen und Punkte zu speichern und in einer HighScore-Liste zu sehen, welche natürlich mit dem höchsten Punktestsand beginnt. Ich habe schon viel versucht, hat aber alles nicht so geklappt. Wer kann mir helfen?
Klabautermann - Sa 20.07.02 01:51
Hallo,
informiere dich mal in der Delphi Hilfe zum Thema
Typisierte Dateien. Damit kriegst du deine Highscores gut auf die Festplatte und wieder Runter. Das mit dem Sortieren must du dann seperat angehen (devide & conquere).
Ein Beispiel zu Typisierten Dateien kannst du
hier [
http://downloads.oitmann.de/samples/TypFileDemo.zip] runterladen. Das habe ich mal für ein Problem im alten Delphi Forum geschrieben aber als Beispiel für die Technik sollte es auch hier herhalten können ;). Um es zu erklären ist es mir aber im Moment zu spät, wie Gesagt die Online-Hilfe kann dir auskunft geben.
Gruß
Klabautermann
Robert - So 21.07.02 15:22
Titel: ich hab das gleiche Problem
Hi! In deinem Programm ist ein Fehler: Es läuft nicht!
Erst sagt mir Delphi (5), dass 'variant.dcu' nicht vorhanden ist; lösche ich es dann aus der uses-Liste, bringt Delphi zwar keine Fehlermeldung mehr, aber man kann auch keinen Namen einfügen :!:
Tschüs
Robert
b.brecht - Mo 22.07.02 11:56
Also ich habe auch mal ein Spiel mit Highscore programmiert und habe es folgendermaßen gelöst:
Einfach wenn Highscore aufgerufen wird (z.B. über ein OnClick Event) liest der Computer die alten Ergebnisse auf einer INI Datei und Listet Sie Z.B in einem "TRichEdit" Feld auf.
Wenn du neue Einträge vornehmen willst einfach Einträge aufrufen, überprüfen an welcher Stelle der Eintrag reinmuss und wieder abspeichern.
Hier eine kleine Hilfe um in INI Dateien zu schreiben/lesen:
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:
| uses IniFiles
...
procedure schreiben; var IniDat:TIniFile; Namen:ARRAY[1..10] of String; Score:ARRAY[1..10] of String; a:integer; begin IniDat := TIniFile.Create('.\highsorce.ini'); with IniDat do FOR a:=1 to 10 do begin Namen[a]:=IntToStr(a); Score[a]:=IntToStr(a*10); WriteString('Highscore',Namen[a],Score[a]); end; IniDat.Free; end;
procedure lesen; var IniDat:TIniFile; Namen:ARRAY[1..10] of String; Score:ARRAY[1..10] of String; a:integer; begin IniDat := TIniFile.Create('.\highsorce.ini'); with IniDat do FOR a:=1 to 10 do begin Namen[a]:=ReadString('Highscore',Namen[a],Namen[a]); Score[a]:=ReadString('Highscore',Score[a],Score[a]); end; IniDat.Free; end; |
Indeterminatus - Do 25.07.02 02:59
Titel: Ein anderer Vorschlag ...
Wenn Du wirklich nicht mit Dateien arbeiten willst (ganz abgesehen davon empfehle ich Dir DRINGEND, Dich mit Dateien und deren Operationen auseinanderzusetzen ...), kannst Du es auch mit Einträgen in die Windows-Registrierung vornehmen, wenn Du willst.
Dazu kann Dir sicher die Delphi-Hilfe weiterhelfen ...
Probiere es doch einfach auf folgende Art und Weise:
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: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170:
| unit HiScore;
interface
uses SysUtils; // meistens bereits automatisch in das Projekt eingebunden
const MAX_NAMEN = 20; // wieviele Namen Du max. in der HighScore aufnehmen lassen willst...
type TName = String[ 30 ]; // für einen einfachen Eintrag in der HighScore brauchen wir keinen // String, der 255 Zeichen Speicherplatz verschlingt. // ein null-terminierter String kommt auch nicht in Frage, da er nicht // in eine typisierte Datei geschrieben werden kann.
TEintrag = record Name : TName; Punkte : Word; end;
THighScore = object // globale Variablen Liste : ARRAY[ 0..MAX_NAMEN ] of TEintrag;
// interne Variablen Max_Eintrag : Byte;
constructor New; destructor Done;
procedure Hinzufuegen( _name : TName; _punkte : Word ); procedure Sortieren; procedure WriteToFile( _dateiname : String ); procedure ReadFromFile( _dateiname : String ); end;
var HighScore : THighScore;
implementation
constructor THighScore.New; begin Max_Eintrag := 0; end;
destructor THighScore.Done; begin // ...dasselbe gilt auch für den Destructor end;
procedure THighScore.Hinzufuegen( _name : TName; _punkte : Word ); var min_punkte : Word; max_punkte : Word; j : Byte; merker : Byte; begin if (Max_Eintrag < MAX_NAMEN) then begin // Sehr schön! Wir können den Namen einfach hinzufügen! // (Die HighScore ist noch nicht voll!) Inc( Max_Eintrag ); Liste[ Max_Eintrag ].Name := _name; Liste[ Max_Eintrag ].Punkte := _punkte; end else begin // Bei diesem Fall müssen wir den Eintrag mit der niedrigsten Punkte- // zahl rauswerfen und den neuen Eintrag hinzufügen ... merker := 0; min_punkte := 65535; for j := 0 to MAX_NAMEN do begin if (Liste[ j ].Punkte < min_punkte) then begin merker := j; min_punkte := Liste[ j ].Punkte; end; end; Liste[ merker ].Name := _name; Liste[ merker ].Punkte := _punkte; end; end;
procedure THighScore.Sortieren; var j : Byte; i : Byte; temp: TEintrag; begin for j := 0 to MAX_NAMEN do begin for i := 0 to MAX_NAMEN do begin if (Liste[ i ].Punkte > Liste[ j ].Punkte) then begin // Elemente vertauschen ... funktioniert nur über Dreieck ... temp.Name := Liste[ j ].Name; temp.Punkte := Liste[ j ].Punkte; Liste[ j ].Name := Liste[ i ].Name; Liste[ j ].Punkte:= Liste[ i ].Punkte; Liste[ i ].Name := temp.Name; Liste[ i ].Punkte:= temp.Punkte; end; end; end; end;
procedure THighScore.WriteToFile( _dateiname : String ); var f : TextFile; j : Byte; s : String; begin AssignFile( f, _dateiname ); Rewrite( f ); Writeln( f, 'HI-SCORE' ); for j := 0 to Max_Eintrag do begin Writeln( f, Liste[j].Name ); Str( Liste[j].Punkte, s ); Writeln( f, s ); end; Writeln( f, '%&/()' ); CloseFile( f ); end;
procedure THighScore.ReadFromFile( _dateiname : String ); var f : TextFile; s : String; punkte_s : String; punkte_i : Word; Ende : Boolean; begin AssignFile( f, _dateiname ); if (not FileExists( f )) then begin // Fehlermeldung ausgeben, Programm abbrechen oder was auch immer exit; end; Reset( f ); Readln( f, s ); if (s='HI-SCORE') then begin Ende := False; while ((not Eof( f )) and (not Ende)) do begin Readln( f, s ); if ( s = '%&/()' ) then Ende:=True; Readln( f, punkte_s ); if ( punkte_s = '%&/()' ) then Ende:=True; if ( Ende = False ) then begin punkte_i := StrToInt( punkte_s ); // wo diese Funktion zu finden ist, schlägst Du am besten in der Delphi-Hilfe nach ... Hinzufuegen( s, punkte_i ); end; end; CloseFile( f ); end else begin CloseFile( f ); end; end; |
Das wäre die Unit, die wir benötigen würden. Eingebunden in unser Programm sähe das dann so aus ...
Laden der Liste
Quelltext
1:
| HighScore.ReadFromFile( {irgendein Dateiname} ); |
Hinzufügen eines neuen Eintrags
Quelltext
1:
| HighScore.Hinzufuegen( {Name}, {Punktezahl} ); |
High-Score ausgeben
Quelltext
1: 2:
| HighScore.Sortieren; // in For-schleife zeichnen oder wie immer Du das machen willst... |
Datei speichern (z.B. beim Beenden des Programms)
Quelltext
1:
| HighScore.WriteToFile( {irgendein Dateiname} ); |
Also dann, ich hoffe, ich konnte Dir etwas helfen ...
P.S.: Ich weiß nicht, ob das Programm funktioniert, ich habe es nicht ausprobiert, sondern hier "on-the-fly" geschrieben ... es werden sich sicherlich ein paar Fehler eingeschlichen haben, aber im Großen und Ganzen müsste es doch laufen ... *gg*
Yours,
Indeterminatus.
Klabautermann - Do 25.07.02 11:05
Titel: Re: ich hab das gleiche Problem
Hallo,
Robert hat folgendes geschrieben: |
Hi! In deinem Programm ist ein Fehler: Es läuft nicht!
Erst sagt mir Delphi (5), dass 'variant.dcu' nicht vorhanden ist; lösche ich es dann aus der uses-Liste, bringt Delphi zwar keine Fehlermeldung mehr, aber man kann auch keinen Namen einfügen :!: |
stimmt, das habe ich seinerzeit mit D6 Personal erstellt. Ich habe es aber in D5 Compilieren und nutzen können nachden ich Variants entfernt habe.
Zur bedienung:
Trage Namen, Vornamen und Geburtstag ein und Klicke auf
hinzufügen sobalt du mindestens zwei einträge hast kannst du durch die Datei Scrollen. Der
übernehmen Kopf ist dazu da einen bereits vorhandenen Datensatz zu ändern. Die bennungen sind vieleicht nicht die Besten aber das ganze soll ja nur ein Demo sein ;).
Gruß
Klabautermann
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!