Entwickler-Ecke
WinForms - TicTacToe SaveGame Laden??
lithixz - Mi 02.11.11 14:48
Titel: TicTacToe SaveGame Laden??
Habe TicTacToe programmiert, es lässt sich auch mittels StreamWriter speichern, jedoch ist meine Frage nun: wie kann ich ein zuvor gespeichertes Spiel laden?
Lg
Horschdware - Mi 02.11.11 14:56
Analog zum StreamWriter gibt es einen StreamReader.
Wie du das dann im Detail einliest, kommt ganz darauf an, wie das ursprünglich gespeichert wurde und wie dein Programm die Daten vorhält.
Edit: Quellcode kannst du hier im Forum ganz bequem in [ cs ] und [ / cs ] geklammert direkt in den Beitrag schreiben. So sparst du dir das (unnötige) Hochladen von Bildern.
lithixz - Mi 02.11.11 15:02
wenn ich es analog wie oben machen würde würde es so aussehen, funktioniert nicht.. no overload vor method "Read" takes 1 arguments
hoffe du kannst mir helfen
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| void load() { StreamReader sr = new StreamReader(@"C:\TicTacToeSaveGame.ttt"); sr.Read(iHelp11); sr.Read(iHelp12); sr.Read(iHelp13); sr.Read(iHelp21); sr.Read(iHelp22); sr.Read(iHelp23); sr.Read(iHelp31); sr.Read(iHelp32); sr.Read(iHelp33); } |
Moderiert von
Th69: C#-Tags hinzugefügt
Horschdware - Mi 02.11.11 15:38
Die Methode Read der StreamReader-Klasse arbeitet nunmal ein wenig anders. In der MSDN kann man sich schön die Beschreibung der Klasse und ihrer Methoden anschauen:
http://msdn.microsoft.com/de-de/library/system.io.streamreader.aspx
Grundlegend: Wenn ich das jetzt richtig sehe, nutzt du 9 Variablen, um den aktuellen Spielstatus festzuhalten.
Diese werden in deiner Speicher-routine einfach direkt in einer Datei hintereinander geschrieben.
Ergo wird der Inhalt deiner Datei (Annahme: jedes Feld kann 0, 1 oder 2 als Zustand haben) in etwa so aussehen:
"010012201"
Eine Möglichkeit das Ganze nun wieder einzulesen und aufzudröseln wäre, erst einmal die ganze Datei in einem Rutsch zu lesen und dann die Einzelpositionen den Variablen im Spiel zuzuordnen
C#-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:
| string dateiinhalt; StreamReader datei = new StreamReader("C:\savegame.sav", System.Text.Encoding.Default); string dateiInhalt = datei.ReadToEnd(); datei.Close();
int x=1; int y=1; for (int i=0; i < dateiInhalt.length(); i++) { int wert = GetNumericValue( dateiInhalt[i] );
switch(y) { case 1: switch(x) { case 1: iHelp11 = wert; break; case 2: iHelp12 = wert; break; case 3: iHelp13 = wert; break; } break;
case 2: switch(x) { case 1: iHelp21 = wert; break; case 2: iHelp22 = wert; break; case 3: iHelp23 = wert; break; } break;
case 3: switch(x) { case 1: iHelp31 = wert; break; case 2: iHelp32 = wert; break; case 3: iHelp33 = wert; break; } break; }
if (x < 3) x++; else { x = 1; y++; } } |
Geschickter wäre es natürlich, du nutzt zur Datenhaltung nicht 9 einzelne Variablen, sondern ein zweidimensionales
ARRAY.
Dann kannst du direkt auf die Indexpositionen zugreifen und sparst dir ein wenig Arbeit (und gewinnst ein wenig Übersicht). Der ganze switch-case Bereich schrumpf dann auf etwas in der Form:
C#-Quelltext
1:
| meinArray[x,y] = wert; |
Anderer Weg wäre es, Zeichen für Zeichen zu lesen:
Methode Read erwartet drei Parameter: Ein Zielbuffer, eine Startposition ab der gelesen wird und die Menge der zu lesenden Zeichen.
Denkbar wäre demenstprechend:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| char c; datei.read(c,i,1); iHelp11 = GetNumericValue( c ); i++;
datei.read(c,i,1); iHelp12 = GetNumericValue( c ); i++;
datei.read(c,i,1); iHelp13 = GetNumericValue( c ); i++;
datei.read(c,i,1); iHelp21 = GetNumericValue( c ); i++;
.... |
Was sich aber noch zusammenkürzen lässt.
lithixz - Mi 02.11.11 15:48
okay danke tolle hilfe :D
eine letzte frage noch:
ich habe gerade erfahren, dass der Speicherort variabel sein muss.. hättest du dort einen Tipp?
Lg
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| StreamWriter sw = new StreamWriter(@"C:\TicTacToe.txt"); sw.Write(iHelp11); sw.Write(iHelp12); sw.Write(iHelp13); sw.WriteLine(""); sw.Write(iHelp21); sw.Write(iHelp22); sw.Write(iHelp23); sw.WriteLine(""); sw.Write(iHelp31); sw.Write(iHelp32); sw.Write(iHelp33); sw.WriteLine(""); sw.Write(iNowPlaying); |
Moderiert von
Th69: C#-Tags hinzugefügt
Horschdware - Mi 02.11.11 16:28
Hoppla,
deine Routine zum Speichern schaut anders aus als erwartet. Von Zeilenumbrüchen war nie die Rede und auch das zusätzliche Feld am Ende der Datei kommt unerwartet.
Hier muss die Laderoutine ein wenig umgebaut werden.
Ich denke aber, mit den Infos von oben sollte das dann machbar sein.
Eventuell könnte hier die Methode
ReadLine aus der StreamReader Klasse hilfreich sein, da die Savegame-Datei ja schon zeilenweise aufgebaut ist.
Variables Speicherziel?
Statt einem Literal einfach eine Variable übergeben:
C#-Quelltext
1: 2: 3:
| string dateipfad = "C:\xyz.txt"; StreamWriter sw = new StreamWriter(dateipfad); |
lithixz - Mi 02.11.11 17:06
okay danke für die hilfe :D
lg
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 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!