Spielstand speichern



  • Also könnte ich ein array machen denn wert wo der spieler ist kann
    gespeichert werden und wird geladen wenn man es will.Ginge es so?

    mfg.
    Stefan



  • Warum soll es so nicht gehen?



  • ich hab noch nie sowas programmiert.

    mfg.
    Stefan



  • Stefan311 schrieb:

    ich hab noch nie sowas programmiert.

    Ich auch nicht.

    Bye, TGGC



  • Aber ich geh mal davon aus das ihr mehr Erfahrungen habt ich
    programmiere seit letztes jahr herbst ungefähr als Hobby Aber ich
    hoffe natürlich das als ausbildung machen zu können. 🙂

    mfg.
    Stefan



  • Bei einem einfachen Textadventure nutzt du am einfachsten ein Array für die Zustände.

    Beispiel:

    Pseudo:

    if (Array[0] == 0) // Geld noch nicht genommen
        Text("Da liegt Geld rum");
    
    if (SpielerNimmtGeld() && Array[0] == 0)
    {
        InsInventar("Geld");
        Array[0] = 1;
    }
    

    Wenn im Feld 0 eine 1 steht bedeutet das also das der Spieler das Geld eingesammelt hat. Speichern kannst du das dann am einfachsten als Text
    a la

    0 = 1
    1 = 0
    2 = 0
    3 = 0
    4 = 1
    5 = 0
      usw...
    

    ...und überträgst die Werte beim laden wieder ins Array. Dann hast du genau den Zustand wieder den du erzeugt hast.



  • Danke.Daran hatte ich noch garnicht gedacht das mit zuspeichern. 🙄
    Kann man Eigentlich daten sofort in einem integer einlesen?

    mfg.
    Stefan



  • Jeap kannst sofort in nen Integer laden:

    int integer;
    ifstream file("myfile.txt");
    file >> integer;
    file.close();
    

    Array aus datei laden kannst du vielleicht so machen:

    int integers[100];
    ifstream file("myfile.txt");
    for(int i=0; i<100; i++)
    {
    file >> integers[i];
    }
    file.close();
    


  • Danke und ich dachte immer man kann nur Strings aus der Datei lesen.
    Ich hab jetzt etwas ungefähres:
    Wenn man ein gespeichertes Spiel laden will gibt man den namen von dem Profil
    an.Das Programm äffnet es liest die zahlen aus und fertig.Wenn man neu das spiel anfängt gibt man ein Profilnamen ein das Programm erstellt drei Dateien:
    Wo man ist,
    Was man hat,
    Stärke,Zauber,leben,etc...

    Nochmals Danke jetzt weiß ich ungefähr wie ich das machen kann.

    mfg.
    Stefan



  • Stefan311 schrieb:

    Nochmals Danke

    np

    Bye, TGGC



  • Man könnte ja Z.B.: das SaveGame ähnlich wie HTML aufbauen und mit getline Zeile für Zeile abfragen.

    <PLAYER POSITION>10, 20, 44</PLAYER POSITION>
    <PLAYER HEALTH>100</PLAYER HEALTH>
    ...



  • Der Quellcode dürfte sich von alleine erklären 😃 :

    struct VECTOR
    {
    float x, y, z;
    };

    struct PLAYER
    {
    int Health;
    int Level;
    VECTOR Position;
    };

    void Write()
    {
    FILE *pFile = fopen("1.txt", "w+");
    PLAYER player;

    player.Health = 100;
    player.Level = 15;
    player.Position.x = 0.0324f;
    player.Position.y = 1.04f;
    player.Position.z = 4.89f;

    fprintf(pFile, "<HEALTH>%d</HEALTH>", player.Health);
    fprintf(pFile, "<LEVEL>%d</LEVEL>", player.Level);
    fprintf(pFile, "<POSITION>%f %f %f</POSITION>", player.Position.x,
    player.Position.y,player.Position.z);
    fclose(pFile);
    }

    void Read()
    {
    FILE *pFile = fopen("1.txt", "r+");
    PLAYER player;

    fscanf(pFile, "<HEALTH>%d</HEALTH>", &player.Health);
    fscanf(pFile, "<LEVEL>%d</LEVEL>", &player.Level);
    fscanf(pFile, "<POSITION>%f %f %f</POSITION>", &player.Position.x, &player.Position.y, &player.Position.z);
    printf("Player Health: %d\n", player.Health);
    printf("Player Level: %d\n", player.Level);
    printf("Player Position: %f %f %f\n", player.Position.x, player.Position.y, player.Position.z);

    fclose(pFile);
    }

    ..::TcH && NwP::..



  • Danke.Ich werde es mir abspeichern und mir das auch genauer ansehen.
    Im moment denke ich mir noch das ganze systemm aus.Karte und so.
    Aber trodzdem danke.

    mfg.
    Stefan



  • Tc++H schrieb:

    Der Quellcode dürfte sich von alleine erklären 😃 :

    ...

    Der Code ist irgendwie nicht sehr sinnvoll. Wenn man schon so ein XML-mäßiges Verfahren benutzt, dann soll man es auch wie XML parsen und nicht die Reihenfolge festlegen, in der die Elemente auftauchen müssen, so wie Du das da tust.
    Dann kannst Du es auch gleich sein lassen und einfach nur die Werte speichern.



  • Ich hatte mal vor einer Weile einen Parser programmiert.

    Eigentlich hatte ich versucht eine eigene String-Klasse zu pogrammieren und der Parser war ein Abfallprodukt.

    In dem Beispiel auf der Downloadseite zerlege ich den String Add(5,20) um die beiden Werte zu addieren.

    GetFunctionName()
    Gibt den Funktionsnamen aus dem String zurück

    GetParameter()
    Gibt beliebigen Parameter aus dem String zurück.

    Der Quellcode ist mit dabei. Also könntest du es einfach so umschreiben das es mit der STL funktioniert und musst nicht meine Stringklasse verwenden.

    Download:
    http://mitglied.lycos.de/gidxgraphic/multipars/



  • Klar, dass der Source wenig Sinn macht, aber es geht ums Prinzip. Man sollte vieleicht sein Spielstand flexibel machen. Möglicherweise ne Art Chunk's benutzen siehe 3Ds-Format.



  • Mhh, das XGamesSDK muss unbedingt wieder online. 😎

    Bye, TGGC (Demo or Die)



  • Hab noch ne Frage: Wie funzt Parsen??. Hab mich nicht so extrem mit Savegames beschäftigt, wollte nur mal nen Vorschlag äußern.



  • Tc++H schrieb:

    Hab noch ne Frage: Wie funzt Parsen??. Hab mich nicht so extrem mit Savegames beschäftigt, wollte nur mal nen Vorschlag äußern.

    Kommt drauf an. Wenn du XML benutzt, dann gibt es dafür vorgefertigte Libraries (zB Xerces oder tinyXML).
    Wenn du dein eigenes Format definieren willst --> denk nach, oder les ein Buch



  • Dieses XML-Style Format hat einige Nachteile und man sollte sich überlegen ob man sich das antun will:
    - Die Datei enthält unmengen unnötige Information
    - Die Datei ist lesbar (Jeder kann das Savegame ändern)
    - Das Zeug muss interpretiert werden

    Binär speichern und beim lesen gleich in die entsprechenden Datenhalter pumpen ist wohl der beste Weg - Auch wenn man beim ersten Anlauf mit den Offsets erfahrungsgemäß ins Klo greift 😃 (Siehe Kommentar von Tc++H über 3DS Chunks)


Anmelden zum Antworten