Highscoreliste

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
Tessi1998
Beiträge: 16
Registriert: Sa 15. Mär 2014, 21:06

Highscoreliste

Beitrag von Tessi1998 »

Halllooo alle zusammen,

ich habe ein Problem :/
Ich bin immer noch dabei, ein Minispiel zu programmieren und experimentiere schon die ganze Zeit rum, wie ich das am besten mache...

1. Es funktioniert zwar, dass die Anzeige "New Highscore" erscheint, allerdings kommt sie auch, wenn die Anzahl der Punkte unter dem bisherigen Highscore liegt... :?:

Ich hab das wie folgt gemacht:
var
Form1: TForm1;
Punkte : Integer;
Highscore : Integer;

...

if Punkte > Highscore then
Label10.Caption := Label1.Caption;
Highscore := Punkte;
Label8.Visible := True;

2. Wie mache ich das, dass mein Highscore gespeichert wird, sodass er, wenn ich die Anwendung schließe und i-wann später erneut öffne, immer noch da ist??
Brauche ich eine sogenannte Datenbank? Wo finde/Wie erstelle ich so eine?


Ich kenn mich damit leider wirklich nicht aus und im Internet hab ich schon gesucht und gesucht und nichts hilfreiches gefunden...

Ich bedanke mich schon mal im Voraus und warte auf Antworten :wink:

LG Tessi1998

Philos
Beiträge: 43
Registriert: Mo 3. Mär 2014, 16:06
OS, Lazarus, FPC: Ubuntu Linux 14.04, Windows 7/8, Lazarus 1.2.2, Delphi XE5
CPU-Target: amd64
Wohnort: Rostock
Kontaktdaten:

Re: Highscoreliste

Beitrag von Philos »

Moin moin!

Also wenn du wirklich nur den Punktestand als solches speichern möchtest, würde ich empfehlen, ihn einfach in eine Datei zu schreiben.
Du könntest dafür eine StringList anlegen, Zeile für Zeile mit Strings füllen ( z.b. Name, Punkte und Datum ) und speicherst diese
dann mittels StringList.SaveToFile() ab. Eine Datenbank für eine feste und vor allem kleine Anzahl an Datensätzen ( hier ja nur einer )
wäre sehr übertrieben. Laden kannst du die Datei dann übrigens, indem Stringlist.LoadFromFile() aufrufst.

Ich hoffe das war das, was du brauchst ;)

MfG,
Philos
((2*b) || !(to_be)) ... that's the question.

Tessi1998
Beiträge: 16
Registriert: Sa 15. Mär 2014, 21:06

Re: Highscoreliste

Beitrag von Tessi1998 »

Hey Philos,

danke, dass du so schnell geantwortet hast :wink:

Deine Antwort mag für Könner bestimmt hilfreich sein, aber da ich ein Anfänger bin und überhaupt keinen Plan hab, wie das mit Highscores funktioniert, verstehe ich es nich ganz... sry :(
Am wichtigsten ist erstmal, dass 1. (siehe obigen Beitrag) funktioniert. Sonst kann ich den Rest ja eig. vergessen... Ich meine, wenn sogar nur 1 Punkt als neuer Highscore abgespeichert wird?! :oops:
Und dann hast du gesagt: "einfach in eine Datei schreiben"??? Einfach? In was für eine Datei?

Also, wie gesagt: bin totaler Anfänger :|
Vllt. kannst du es mir ja noch ein bisschen einfacher und genauer erklären?

Dankeee, LG Tessi1998

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: Highscoreliste

Beitrag von Christian »

speichern:

Speicher := TStringList.Create;
Speicher.Add(IntToStr(Highscore));
Speicher.SaveToFile('highscore.txt');
Speicher.Free;

laden:

Speicher := TStringList.Create;
Speicher.LoadFromFile('highscore.txt');
Highscore := StrToInt(Speicher[0]);
Speicher.Free;
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Philos
Beiträge: 43
Registriert: Mo 3. Mär 2014, 16:06
OS, Lazarus, FPC: Ubuntu Linux 14.04, Windows 7/8, Lazarus 1.2.2, Delphi XE5
CPU-Target: amd64
Wohnort: Rostock
Kontaktdaten:

Re: Highscoreliste

Beitrag von Philos »

Ok, anhand dessen, was du geschrieben hattest, ging ich nicht wirklich davon aus, dass ich so weit bei den Basics ansetzen muss ;)
Also zunächst einmal kannst du ja eine "Dummy"-Datei in deinem Programmordner anlegen - "score.dat" z.b.
Dort schreibst du in die erste Zeile den Namen und in die zweite Zeile den Punktestand. Da wir diese erzeugt haben, kann sie vom Programm
ab jetzt auch fehlerfrei geladen werden.

Jetzt würde ich jeweils eine Prozedur zum Speichern und eine zum Laden erstellen - der Übersicht halber.
Laden:

Code: Alles auswählen

 
procedure HighscoreLaden;
var
  datei: TStringList;
begin
  datei := TStringList.Create;
 
  try
    datei.loadFromFile('score.dat');
    playerName := StrToInt(datei[0]);    // erste Zeile laden
    highscore := StrToInt(datei[1]);       // zweite laden
  except
    // hier z.b. eine Fehlermeldung
  end;
 
  datei.Free;
end;
 
Speichern:

Code: Alles auswählen

 
procedure HighscoreSpeichern;
var
  datei: TStringList;
begin
  datei := TStringList.Create;
 
  datei.add(playerName);
  datei.add(IntToStr(Highscore));
  try
    datei.saveToFile('score.dat');
  except
    // hier z.b. eine Fehlermeldung
  end;
 
  datei.Free;
end;
 
Diese Funktionen brauchst du dann nur entweder vor oder nach deiner IF-Abfrage aufrufen. Dann wird deine Abfrage auch funktionieren, da der Wert aus der Datei ja geladen wurde.
Falls dir das immer noch nicht weiterhilft und dir nichts sagt, dann wäre ein gutes E-Book zum lernen für dich wahrscheinlich besser als ein Forum.
Ich habe mit diesen beiden gut gelernt ;) :
http://www.freidling.info/Download/info ... dlagen.pdf
http://downloads.delphi-treff.de/DelphiStarter.pdf

Ansonsten, einfach nochmal fragen, wenn irgendwas unklar sein sollte.
Philos
((2*b) || !(to_be)) ... that's the question.

Tessi1998
Beiträge: 16
Registriert: Sa 15. Mär 2014, 21:06

Re: Highscoreliste

Beitrag von Tessi1998 »

Vielen lieben dank Philos, dass du dir so viel Zeit genommen hast, um mir alles genau zu erklären!
Und auch danke an dich, Christian!

Ich werde beides gleich mal ausprobieren und hoffe, dass es nun klappt :wink:

Also: Danke, danke, dankee und LG Tessi1998

Tessi1998
Beiträge: 16
Registriert: Sa 15. Mär 2014, 21:06

Re: Highscoreliste

Beitrag von Tessi1998 »

Noch eine Frage...

Wie und was genau soll ich in die Datei "score.dat" schreiben??

Philos
Beiträge: 43
Registriert: Mo 3. Mär 2014, 16:06
OS, Lazarus, FPC: Ubuntu Linux 14.04, Windows 7/8, Lazarus 1.2.2, Delphi XE5
CPU-Target: amd64
Wohnort: Rostock
Kontaktdaten:

Re: Highscoreliste

Beitrag von Philos »

Keine Ursache! Manchmal bracht man nur den richtigen Denk-Anstoß, um richtig durchzustarten ;)
Na den alten Highscore-Wert brauchst du ja nur überschreiben, wenn der Highscore tatsächlich geknackt wurde.
Also dort, wo du prüfst, ob Punkte > Highscore. Du rufst dann einfach die Prozedur "saveHighscore" - wie oben
beschrieben auf. Ich nehme an, dass Funktionen und Prozeduren nicht weiter erklärt werden müssen :D
((2*b) || !(to_be)) ... that's the question.

Philos
Beiträge: 43
Registriert: Mo 3. Mär 2014, 16:06
OS, Lazarus, FPC: Ubuntu Linux 14.04, Windows 7/8, Lazarus 1.2.2, Delphi XE5
CPU-Target: amd64
Wohnort: Rostock
Kontaktdaten:

Re: Highscoreliste

Beitrag von Philos »

Sorry, sehe gerade, dass ich mich verlesen habe. Du wolltest wissen, "WAS" in die Datei soll und wie... Das habe ich oben eigentlich schon erklärt. Du brauchst, damit dein Highscore in
irgendeiner Weise gespeichert wird, eine Datei. Diese kannst du - bevor du losproggst - ja schonmal anlegen, dann kann das Programm diese auch gleich laden ( Siehe oben ).
Vor dem Vergleich, ob Punkte > Highscore, solltest du also die Datei laden - mit der Methode, wie Christian und ich das beschrieben haben ( nur dass ich das in gesonderte Methoden
geschrieben habe, damit man leichter Übersicht behält ). Und hinterher, wenn Punkte > Highscore, dann nutzt du die Speichern-Methode wie oben erwähnt.
Zur Erklärung nochmal: wir nutzen eine Stringlist, die wir mit Strings = Zeilen füllen, und nutzen dann die Methode "SaveToFile" der Stringlist, um diese in die entsprechende Datei
zu speichern. Die Datei hat danach dann die zwei Zeilen. Beim Laden geht es halt andersrum. Das geht so einfach, weil man die Datei ja einfach wie eine Liste von Zeilen behandeln kann.
Und WAS du da reinschreibst, ist deine Entscheidung. Entweder nur den Punktestand, oder Name + Punktestand, oder vllt. noch ein Datum dazu...

Viel mehr kann man dazu auch nicht mehr erklären, ohne sich zu wiederholen :(
Hoffe, es hat :idea: gemacht
((2*b) || !(to_be)) ... that's the question.

Tessi1998
Beiträge: 16
Registriert: Sa 15. Mär 2014, 21:06

Re: Highscoreliste

Beitrag von Tessi1998 »

Nochmals Danke für eure Hilfe!

Leider klappts immer noch nicht und deshalb möchte ich erstmal nur den Highscore in einer externen Datei (.txt) speichern.
Funktioniert so weit auch, das Programm läuft, ABER... jedes mal, wenn ich die Anwendung erneut öffne, ist der Highscore wieder verschwunden :?:

Eigentlich müsste es doch funktionieren, wenn ich ihn über eine txt-Datei gespeichert habe?! Kann es sein, dass ich was falsch gemacht habe?

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2805
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Highscoreliste

Beitrag von m.fuchs »

Tessi1998 hat geschrieben:Kann es sein, dass ich was falsch gemacht habe?
Ja, wenn es nicht so funktioniert wie du möchtest, hast du definitiv etwas falsch gemacht.







Und wenn du uns vielleicht ein wenig Quellcode zeigst, dann können wir auch helfen.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6766
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Highscoreliste

Beitrag von af0815 »

Tessi1998 hat geschrieben:Eigentlich müsste es doch funktionieren, wenn ich ihn über eine txt-Datei gespeichert habe?! Kann es sein, dass ich was falsch gemacht habe?
A) Beim neuen Starten des Programm, liest du den Highscore wieder ein ?
B) Wird beim Starten eventuell das Highscore zuerst überschrieben, bevor du ihn liest ?

Breakpoint in die Leseroutine und die Schreibroutine setzen und mal sehen, welche zuerst aufgerufen wird.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Tessi1998
Beiträge: 16
Registriert: Sa 15. Mär 2014, 21:06

Re: Highscoreliste

Beitrag von Tessi1998 »

Suuper! Vielen Dank für euer aller Geduld, es hat jetz endlich funktioniert!! :wink:

Antworten