[C#] Savegames erstellen


Hale

Mitglied
Hallo Zusammen,

da mich mein bisheriges Googlen leider nicht weiter gebracht hat, wende ich mich nun vertrauensvoll an euch :D

Also folgende Situation:
Ich programmiere gerade ein kleines Managerspiel.
Die Daten werden alle in einer SQL Server Compact DB gespeichert und ausgelesen, wenn der Benutzer ein neues Spiel startet.

Wenn der Benutzer nun ein weilchen gespielt hat, haben sich ja nun auch logischerweise Daten verändert. Leider bin ich mir hier nicht sicher wo ich diese Daten abspeichern soll.

Meine Überlegung war einfach eine Kopie der bestehenden DB zu machen und dort per Updates und Inserts die Daten zu pflegen, jedoch bin ich stark am zweilfeln, ob sowas die richtige Methode dafür ist.
Eine andere Möglichkeit wäre es die updatestring der relevanten Daten für Spieler, Ligen und Mannschaften zu schreiben und diese beim laden eines Spielstandes auszuführen. Finde ich persönlich aber auch nicht wirklich toll :(

Ich hoffe ihr könnt mir ein bisschen weiterhelfen :)

Gruß
Hale
 

sheel

I love Asm
Hi

wie groß ist denn die komplette DB (von den Standardwerten bzw.
eben von einem Spielstand bei Methode 1) in Bytes (KB,MB...) bzw. in Tabellen?
Wie viele von den Tabellen/Spalten etc. verändern sich wirklich je nach Fortschritt?

Wenns überschaubar ist, vllt. einfach mal bechreiben,
was genau in den Tabellen(spalten) drinsteht.
 

Hale

Mitglied
Hallo sheel,

im Moment ist die komplette DB nur 1 MB groß. Jedoch je länger man spielt desto mehr Spieler werden in die DB geschrieben.
Die einzelnen Spieltage werden auch in die DB geschrieben, was bei einem laufenden Spielt ebenfalls immer größer wird.

Gespeichert werden müssen eigentlich nur die Tabellen der Spieler, Tabellen, Spieltage. Es stehen aber noch einige Länder für die Herkunft der Spieler, die Position und globale Einstellungen gespeichert.

Hier nochmal die Tabellen und Spalten, welche bisher existieren.

Tabellen.PNG
Tabellen+Spalten.PNG

Da das Spiel aber noch in den Kinderschuhen steckt, kann es gut sein, dass einige Tabellen bzw. Spalten hinzugefügt werden.

Gruß
Micha
 

Henig

Mitglied
Moin,

wüsste jetzt zwar nicht, wie sowas professionell behandelt wird würde es aber so versuchen:

Erstelle eine Tabelle Savegames. Darin dann Spielername oder i.-ein anderer Wert, an dem du dein Spiel wiedererkennst (hier auch sehr schön Passwort möglich).
Dahinter setzt du dann eine Savegame_ID.
Die Savegame_ID holst du dir noch in jede andere Tabelle rein, in der du Daten hast, die du spiezifischen Spielständen zuweisen möchtest.
Dann holst du dir jedes mal, wenn ein Spieler ein neues Spiel erstellt die nächsthöhere Savegame_ID.
Die Grundwerte, die jeder bei einem neuem Spiel hat, kannst du mit der Savegame_ID 0 oder 1 festlegen (Also Savegame_ID 0 oder Savegame_ID 1 reservierst du dir für die Grundwerte).
Dann kannst du jedesmal, wenn jemand ein neues Spiel erstellt, die Daten, die sich verändern aus der Savegame_ID 0, 1 in die nächsthöhere freie Savegame_ID schreiben und damit das Spiel spielen.

Dann hat im prinzip jedes Spiel seine eigenen Daten in der Datenbank.

Würde vll so aussehen:
Code:
                 Position
Savegame_ID | Spieler_ID | Position
    0       |      1     |      1
    1       |      1     |      2
    2       |      1     |      3
Hier wäre der Festgelegte Startwert 0 Spieler 1 auf Position 1
für den Spieler mit der Savegame_ID 1 Spieler 1 auf Position 2
und für Spieler mit der Savegame_ID 2 Spieler 1 auf Position 3


ALTERNATIVE 2: // find ich doof
Du erstellst jedesmal ein Duplikat deiner DB und kannst dort alle Werte anpassen. Daneben bräuchtest du aber ein Programm, was dir, wenn du GRUNDLEGENDE Daten ändern willst, wie z.B. Spielerwert, von einer Grundtabelle in die Ganzen Spieletabellen Synchronisiert.
 
Zuletzt bearbeitet:

Spyke

Premium-User
es geht doch um ein lokales spiel auf der festplatte oder?
was ich mich eher frage ist ob da eine datenbank das richtig system ist.

Ich würd fast die sachen serialsiert abspeichern oder in einem eigenem dateiformat.
ich denke mir das in einer Datenbank aufzuziehen wäre zu overhead eventuell.
Oder zumindest die spielrelevanten informationen würde ich als extra datei abspeichern, "stammdaten" könnten in einer DB wiederum sinnvoll sein.
 

Hale

Mitglied
Ja das Spiel ist lokal.

Ich habe mir auch zuerst gedacht, dass eine DB too much sei, weswegen ich mich ja für die SQL Compact DB entschieden habe. Da ist das ganze nur in einer einzelnen Datei abgespeichert.

Kannst du mir vielleicht ein oder zweit gute Quellen zu dem Thema eigenes Dateiformat geben? Das finde ich zwar spannend, habe aber noch nicht genauer recherchiert und kenne mich damit folglich noch nicht wirklich aus.

Gruß
Micha
 

ademo

Mitglied
Du könntest auch alles in XML Dateien speichern die sind auch einfach zum erstellen und wieder auslesen.
Um die grösse in den Griff zu bekommen ist es ev. nötig die Datei noch zu komprimieren. Ist unter C# auch relativ einfach.

gruss Ademo
 
Zuletzt bearbeitet:

Spyke

Premium-User
Wie ademo schon schrieb wäre zum einem XML möglich.
Ich finde da ist es vorallem besonders einfach das ganze über das XmlDocument zu machen.

Der ist zwar theoretisch langsamer als die direkte verwendung von XmlReader und XmlWriter, aber ich denke als SaveGame Format ist das vernachlässig bar.
Ich verwende selbst XmlDocument bei einem Programm was ähnlich wie Excel funktioniert in dem ich theoretisch 1000 Zelleninformationen halten muss.

Ansonsten bei einer ordentlichen Objektstruktur könntest du das ganze auch mit dem BinaryFormatter serialisiert abspeichert.
Dafür müssten deine Klasse nur das Attribute SerializableAttribute gesetzt haben oder du verwendest die ISerializable Schnittstelle, wenn du die serialisierung selber steuern willst um die datei klein zu halten.

Ansonsten gebe es auch noch den XmlSerializer der ähnlich wie der BinaryFormatter dein Objekt serialisiert, aber als XML.
Während jedoch der BinaryFormatter die Felder serialisert, serialisert der XmlSerializier Eigenschaften, was mir persönlich missfiel und eher probleme schuff.

Ansonsten hatte ich mal ein Spiel geplant mit einem Editor in dem ich mir einfach ein eigenes Format überlegte, was etwas an vCard angelehnt war.
(vCard ist eine allgemeine Dateibeschreibung für Kalender, im Textformat).
So bissel Ini mäßig würd ich sagen war das, wenn ichs noch recht in Erinnerung hab.

Ich persönlich würde zu XML tendieren oder einem eigenem Dateiformat.
Da es dein Spiel ist bleiben dir eigentlich auch alle freiheiten dir ein eigenes für dich passendes Format zu überlegen.
 
Zuletzt bearbeitet:

ksk

Erfahrenes Mitglied
Was du auf alle Fälle brauchst ist eine Tabelle "tbl_ActiveSpiele" für dein Savegame.
Den es können ja auch mehrere Spiele am gleichen Tag sein.

Hier mal ein schneller Ansatz und ggf. Verbesserungsvorschläge.
In der Tabelle "Spiel" würde ich das mit den Toren anders lösen und du brauchst
zusätzliche Spalte "AktuelleSpielzeit", einen Fremdschlüssell zu einer
Schiedsrichter-Tabelle (ggf. neu erstellen). Den jeder Schiri pfeift anders.

Eigene Tabelle Tore. Eignet sich auch für Statistiken usw in späterer Folge.
Hier ein Ansatz: tbl_Tore
fk_Spiel // Foreign-Key ID Tabelle Spiel,
fk_HeimOderAuswVerein INT NOT NULL, // Foreign-Key HeimVerein Tabelle Spiel
fk_TorVon INT NOT NULL // Foreign-Key ID Tabelle Spieler
FK_AktSpielZeit INT NOT NULL // In welcher Spielminute das Tor geschossen wurde. Foreign-Key AktuelleSpielzeitTabelle Spiel
usw.

Somit wissen wir wer ein Tor, wann (Spielminute), für welche Manschaft geschossen hat.
Zurück zu Tabelle tbl_ActiveSpiele.
Folgende Spalten sollten auf alle vorhanden sein.
ID INT NOT NULL PRIMARY KEY IDENTITY(1,1),
fk_Spiel // alle laufenden Spiele
// Je nach Bedarf erweitern

Und in deiner Savegame Tabelle würde ich nur die Infos von der tbl_ActiveSpiele nehmen.
Selbstverständlich muss das Spiel sozusagen angehalten werden, das könnte man mit
einer zusätzlichen Spalte in der Tabelle Spiel bewerkställigen.
Wie schaut es mit Karten (Gelb, Rot) oder Abseits usw. aus?
Falls due vorhast das auch einzubauen dasnn brauchst auch dafür eine Tabelle
ggf. mit den Spalten (ID, fk_Spiel, fk_Spieler, [bit] gelbOderRot, fk_Spieltag usw.) und eine Foraign-Key in der Tabelle Spiel.

Zusätzlich benötigt jeder spieler eine x und y Koordinate und
Spielerfertigkeiten, Stärke, Kondition, Passive, Agrresive, usw.
Falls die vorhandene Spalte "Position" mit Foreign-Key
das sein soltle dann zeig doch mal die Tabelle .



Ich hoffe das dir der Ansatz ein wenig weiter hilft jedoch kann
man derart Spielabläufe auf Unterschiedlichen Arten lösen.


Lg
ksk