Autor Beitrag
lithixz
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mi 02.11.11 14:48 
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
Einloggen, um Attachments anzusehen!
Horschdware
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 744
Erhaltene Danke: 54

Win XP Pro, Win 7 Pro x64
Delphi 7, Delphi XE, C++ Builder 5, SAP R/3
BeitragVerfasst: 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.

_________________
Delphi: XE - OS: Windows 7 Professional x64
lithixz Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: 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

ausblenden 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 user profile iconTh69: C#-Tags hinzugefügt
Horschdware
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 744
Erhaltene Danke: 54

Win XP Pro, Win 7 Pro x64
Delphi 7, Delphi XE, C++ Builder 5, SAP R/3
BeitragVerfasst: 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: msdn.microsoft.com/d...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

ausblenden volle Höhe 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:
// Achtung: Keine Garantie auf Korrektheit. Bin kein C# Programmierer und schreibe das hier gerade in Notepad.

// Ganze Datei in String lesen
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;
// Iteration über alle Zeichen des Strings
for (int i=0; i < dateiInhalt.length(); i++) {
  // Aktuelles Zeichen in Zahl wandeln
  int wert = GetNumericValue( dateiInhalt[i] );

  // Zielvariable finden (Zeilen und Spalten)
  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;  
  }  

  // Zeilen/Spaltenposition erhöhen
  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 Suche in: C#-Forum, C#-Library 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:
ausblenden 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:
ausblenden 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.

_________________
Delphi: XE - OS: Windows 7 Professional x64
lithixz Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: 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

ausblenden 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 user profile iconTh69: C#-Tags hinzugefügt
Horschdware
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 744
Erhaltene Danke: 54

Win XP Pro, Win 7 Pro x64
Delphi 7, Delphi XE, C++ Builder 5, SAP R/3
BeitragVerfasst: 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:
ausblenden C#-Quelltext
1:
2:
3:
string dateipfad = "C:\xyz.txt"// Oder Benutzereingabe oder irgendwo in Eigene Dateien oder oder oder...

StreamWriter sw = new StreamWriter(dateipfad);

_________________
Delphi: XE - OS: Windows 7 Professional x64
lithixz Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mi 02.11.11 17:06 
okay danke für die hilfe :D
lg