![]() |
Spielstand speichern mit ini(s)!
Abend
ich bins mal wieder. Ich bastle so grade an meinem Snake für meine Hausarbeit da kam mir die Idee den Spielstand speicherbar zu machen. Nur leider bekomm ich desöfteren bei meiner etwas einfachen Speichermethode fehlermeldungen beim Programm ablauf. Es werden plötzlich sachen als falsch bezeichnet die schon ewig liefen. Hier mal etwas code:
Delphi-Quellcode:
SO hier die ini datei zum besseren verstehen: (etwas gekürzt)
//erstmal das einlesen der sektionen in eine listbox
ini:=TIniFile.create(ExtractFilePath(ParamStr(0))+'..\DATA\save.ini'); i:=1; while ini.SectionExists('Savegame'+inttostr(i))do begin ListBox1.Items.add(ini.ReadString('Savegame'+inttostr(i),'Name','Error')); i:=i+1; end; ini.free; //nach dem auswählen dann das laden if not ListBox1.ItemIndex < 0 then begin ini:=TIniFile.create(ExtractFilePath(ParamStr(0))+'..\DATA\save.ini'); inisection:= ini.ReadString('Savegame'+inttostr(ListBox1.ItemIndex+1),'Secname','Error'); label3.Caption:= inisection; //... Points := ini.ReadInteger(inisection,'Points',0); Money := ini.ReadInteger(inisection,'Money',0); //... ini.free; end; //so danach öffnet sich das spiel und ich kann auch mit den ständen spielen //beim speichern werden wieder die sektionen in eine listbox geladen wie oben //und so speicher ich dann ini:=TIniFile.create(ExtractFilePath(ParamStr(0))+'..\DATA\save.ini'); ini.WriteInteger(inisectionsav,'Points',Points); ini.WriteInteger(inisectionsav,'Money',Money); ini.free; showmessage('Spielstand erfolgreich gespeichert!'); [Savegame1] Name=Torley Secname=Savegame1 ... Points=1 Money=0 ... Das ist ziemlich einfach gestalltet und geht auch solang man nicht einen neuen spielstand anfertigen will. im moment kann man nur auf alte speichern weil ich nicht weiß wie die sectionen heißen. ich habe schon gedacht mir eine weitere datei zu machen wo die sektionennamen drinnen stehen und ich dann die sektionen aus der datei in der richtigen speicherdatei such. da kommt aber wieder das problem mit den wertnamen. die müssen ja fortlaufend sein also so: section1 section2 section3 ich kann doch net eine schleife machen die, was weiß ich, bis 100 zählt: for i:=1 to 100 do ...'section'+inttostr(i); kennt jemand eine bessere methode spielstände einfach aber efizient zu speichern? es sollte nciht zu schwer sein damit ich es selbst verstehe und noch werte hinzufügen kann, weil ich ja noch 4 wochen zeit habe zum weiter basteln. ich werde es vorraussichtlich auch in 2-3 wochen hier zum kritisieren vorstellen. [lol]es soll ja perfekt werden für die arbeit^^[/lol] Mit Freundlichen Grüßen Torley |
Re: Spielstand speichern mit ini(s)!
Guten Abend,
mach Dir doch einen key mit der Anzahl an section die Du bisher hast. Oder Du kannst Dir auch alle Sections in ein StringList einlesen (.ReadSections(String:TSTrings)) hier kannst Du mitTStringList.count feststellen wieviele Sections Du bereits hast. Grüße Klaus |
Re: Spielstand speichern mit ini(s)!
Ich würds mit nem Key machen, in dem Steht, wieviele Speicherstände es gibt:
Code:
Beim Laden des Spielstände machst du eine Schleife von 1 bis savedgames. Wenn du einen neuen hinzufügen willst, erhöhst du savedgames um 1 und fügst entsprechend eine neue Section hinzu.
[general]
savedgames=2 save1=Hans save2=Peter [Hans] Points=1 Money=0 [Peter] Point=7 Money=3 Der Code würde dann z.B. so aussehen: (UNGETESTET)
Delphi-Quellcode:
Wobei du NAME durch den Namen des Spielers ersetzen musst, der gerade speichert.
//Laden der Spielstände
Var i:Integer; Begin ini:=TIniFile.Create(ExtractFilePath(ParamStr(0))+'..\DATA\save.ini'); Try For i:=1 To Ini.Readinteger('general','savedgames',1) Do Begin ListBox1.Items.Add(Ini.ReadString('general','save'+IntToStr(i),'ERROR')); End; Finally Ini.Free; end; end; //Speichern eines Spielstandes Begin if ListBox1.ItemIndex>-1 Then Begin ini:=TIniFile.Create(ExtractFilePath(ParamStr(0))+'..\DATA\save.ini'); Try If not SectionExists('NAME') Then Begin Ini.WriteInteger('general','savedgames',Ini.ReadInteger('general','savedgames',0)+1); Ini.WriteString('general','save'+inttostr(Ini.ReadInteger('general','savedgames',0)),'NAME'); End; Ini.WriteInteger('NAME','Points',Points); Ini.WriteInteger('NAME','Money',Money); End; Finally ini.free; End; End; Mfg |
Re: Spielstand speichern mit ini(s)!
hört sich bestens an was hier so von euch kommt!
leider kann ich das heut nicht mehr testen, aber ich bin sicher das es so gehen wird danke! achso, wie mach ich das den dann wen ich einen spieler löschen will? einfach die zahl um 1 verringern und dann den ausgewählte section löschen? wenn ja wie lösch ich den in [general] savedgames=2 save1=Hans eine variable wie save1? torley |
Re: Spielstand speichern mit ini(s)!
Da gibt es EraseSection
Grüße Klaus |
Re: Spielstand speichern mit ini(s)!
ja ok damit lösch ich dann die sektion, aber ich muss ja dann auch in gerneral den wert save3=hans oder so löschen!
gibt es da erase??? ? und dann hab ich ja das problem das, wenn ich zb save2 lösch noch save1 und save3 existieren. wenn dann die anzahl der speicherstände veringert wurde auf zwei dann zeigt mir das programm nur save1 und das nichtmehr vorhandene save2 an! save3 wird nicht mehr beachtet. muss ich dann wenn ich save2 lösche save3 in save2 verwandeln usw? torley |
Re: Spielstand speichern mit ini(s)!
ein kleiner Blick in die Hilfe bringt folgendes zu Tage.
Zitat:
Klaus |
Re: Spielstand speichern mit ini(s)!
Hallo,
eine kleine Änderung an Roberts Vorschlag macht alles viel leichter:
Code:
Grüße vom marabu
[Settings]
Profiles=Hans,Peter,"noch einer" [Hans] Points=1 Money=0 [Peter] Point2=7 Money=3 [noch einer] Point2=42 Money=17 |
Re: Spielstand speichern mit ini(s)!
den vorschlag von Fussball-Robby hab ich jetzt gut umsetzten können und es klappt auch soweit
aber wie meinst du das marabu? kann man die werte einfach mit komma trennen und die werden dann einzeln bearbeitet? und wenn ja wie lad ich dann einen bestimmten spielstand? torley |
Re: Spielstand speichern mit ini(s)!
Lesen kannst du die Profiles dann so:
Delphi-Quellcode:
Code für das Einlesen eines Profiles brauchst du immer, aber mein Vorschlag zielte auf ein besseres house keeping.
begin
// ... Profiles := TStringList.Create; Profiles.CommaText := ini.ReadString(SECTION_SETTINGS, KEY_PROFILES, ''); ProfileSelectionListBox.Items.Assign(Profiles); ShowMessage('Stored Profiles:' + sLineBreak + Profiles.Text); Profiles.Free; // ... end;
Delphi-Quellcode:
begin
Profile := TStringList.Create; ini.ReadSectionValues(ProfileName, Profile); // Player.Points := StrToIntDef(Profile.Values[PROP_POINTS], DEFAULT_POINTS); // ... Profile.Free; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:31 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz