Spieldaten speichern
-
Hallo Freunde der Sonne!
Ich habe ein kleines Spiel programmiert, in dem es um das Lösen von Rechenaufgaben geht. Höchst spannend, ich weiß. In dem Spiel erlangt man Gold, in dem man seine Sachen im "Trautem Heim" verbessern kann. Man kann auch Stufen aufsteigen, und Rufpunkte und damit bessere Ränge erlangen.
Und genau diese Werte sollen nun dauerhaft (zum Beispiel in einer eigenen Datei) gespeichert werden. Diese speicherbaren Daten sollen dann nach Belieben geladen oder überschrieben werden können.Ich habe so etwas noch nie zuvor gemacht, und wollte euch nach einem optimalen Lösungsweg fragen, beziehungsweise wie man das am besten realisiert.
Hier das Skript, falls es weiterhilft:#include <iostream>
#include <stdlib.h>
#include <time.h>using namespace std;
int main () // ### PROGRAMMSTART ###
{
srand (time(NULL));int Stufe = 1;
string Rang = "Grundschueler";int Erfahrung = 0;
int Erfahrung_b = 10;
int Rangpunkte = 0;int Gold = 0;
int Geldmaschine = 0;
int Buecherregal = 0;
int Druckerei = 0;int Geldmaschine_P = 30;
int Buecherregal_P = 30;
int Druckerei_P = 30;while (true) // ##### SPIELSTART #####
{
if (Rangpunkte >= 100) {Rang = "Realschueler";}
if (Rangpunkte >= 250) {Rang = "Gymnasiast";}
if (Rangpunkte >= 500) {Rang = "Student";}
if (Rangpunkte >= 1000) {Rang = "Mathelehrer";}
if (Rangpunkte >= 2500) {Rang = "Hochschullehrer";}
if (Rangpunkte >= 5000) {Rang = "Doktor der Mathematik";}
if (Rangpunkte >= 10000) {Rang = "Mathematik-Professor";}
if (Rangpunkte >= 25000) {Rang = "Mathe-Forscher";}
if (Rangpunkte >= 50000) {Rang = "Bester Mathematiker Deutschlands";}
if (Rangpunkte >= 100000) {Rang = "Weltbester Mathematiker";}cout << "[1] Rechnen\n";
cout << "[2] Charackter\n";
cout << "[3] Trautes Heim\n";
cout << "Eingabe: "; int Hauptauswahl; cin >> Hauptauswahl; cout << endl;if (Hauptauswahl == 1)
{
cout << "[1] Addition\n";
cout << "[2] Subtraktion\n";
cout << "[3] Multiplikation\n";
cout << "Eingabe: "; int Auswahl_Rechenverfahren; cin >> Auswahl_Rechenverfahren; cout << endl;
cout << "Anzahl_Aufgaben: "; int Anzahl_Aufgaben; cin >> Anzahl_Aufgaben; cout << endl;for (int i = 0; i < Anzahl_Aufgaben; i++)
{
int Zahl1 = rand() % 15 + 1;
int Zahl2 = rand() % 15 + 1;char Zeichen; int Ergebnis;
if (Auswahl_Rechenverfahren == 1) {Ergebnis = Zahl1 + Zahl2; Zeichen = '+';}
if (Auswahl_Rechenverfahren == 2) {Ergebnis = Zahl1 - Zahl2; Zeichen = '-';}
if (Auswahl_Rechenverfahren == 3) {Ergebnis = Zahl1 * Zahl2; Zeichen = '*';}cout << Zahl1 << " " << Zeichen << " " << Zahl2 << " = "; int Loesungsvorschlag; cin >> Loesungsvorschlag;
if (Loesungsvorschlag == Ergebnis)
{
cout << "Richtig!\n";
Gold += Stufe + Geldmaschine;
Erfahrung += Stufe + Buecherregal;
Rangpunkte += Stufe + Druckerei;
}else {cout << "Falsch!\n";}
while (Erfahrung >= Erfahrung_b) {cout << "\nStufe aufgestiegen!\n\n"; Stufe++; Erfahrung -= Erfahrung_b; Erfahrung_b *= 2;}
}cout << endl;
}else if (Hauptauswahl == 2)
{
cout << "Stufe : " << Stufe << endl;
cout << "Rang : " << Rang << endl << endl;cout << "Erfahrung : " << Erfahrung << " / " << Erfahrung_b << endl;
cout << "Ruf : " << Rangpunkte << endl << endl;cout << "Gold : " << Gold << endl << endl;
}while (Hauptauswahl == 3)
{
cout << "Dein Gold: " << Gold << " (4 = Zurueck)\n";
cout << "Geldmaschine - Stufe " << Geldmaschine << " [1] Verbessern: " << Geldmaschine_P << " Gold\n";
cout << "Buecherregal - Stufe " << Buecherregal << " [2] Verbessern: " << Buecherregal_P << " Gold\n";
cout << "Druckerei - Stufe " << Druckerei << " [3] Verbessern: " << Druckerei_P << " Gold\n";
cout << "Eingabe: "; int Auswahl_Haus; cin >> Auswahl_Haus; cout << endl;if (Auswahl_Haus == 1)
{
if (Gold >= Geldmaschine_P)
{
Geldmaschine++; Gold -= Geldmaschine_P; Geldmaschine_P *= 2;
cout << "Geldmaschine verbessert!";
}else {cout << "Nicht genug Gold!";}
cout << endl << endl;
}else if (Auswahl_Haus == 2)
{
if (Gold >= Buecherregal_P)
{
Buecherregal++; Gold -= Buecherregal_P; Buecherregal_P *= 2;
cout << "Buecherregal verbessert!";
}
else {cout << "Nicht genug Gold!";}cout << endl << endl;
}else if (Auswahl_Haus == 3)
{
if (Gold >= Druckerei_P)
{
Druckerei++; Gold -= Druckerei; Druckerei_P *= 2;
cout << "Druckerei verbessert!";
}else {cout << "Nicht genug Gold!";}
cout << endl << endl;
}else if (Auswahl_Haus == 4)
{
Hauptauswahl = 0;
}
}} // Spiel Ende
} // Hauptschleife Ende
-
Du kannst die Daten in eine externe Datei auslagern, oder eine Datenbank anlegen. Letzteres ist durch den geringen Umfang deiner Anwendung Schwachsinnig, weshalb nur der erste Punkt Sinn ergibt.
Hier gibt es aber auch nicht nur eine Lösung, sondern du solltest überlegen, welche Kriterien bei der Sicherung deiner Daten eine wichtige Rolle spielen.
In deinem Fall würde ich die Daten im ASCII-Format speichern und auch wieder auslesen.
-
PS: Du solltest dich etwas mehr mit Programmstrukturierung beschäftigen. Strukturen und Enumerationen sind nicht weiter schwer zu verstehen und damit kannst du deinen Quellcode schon wesentlich übersichtlicher und kürzer gestalten.
Z.B :enum Rang { Realschueler = 100, Gymnasiast = 250, Student = 500, Mathelehrer = 1000, ... }; struct Spieler { int stufe; int erfahrung; int erfahrung_b; ... };
-
Vielen Dank für den Hinweis!
Wäre noch nett, wenn du sagen könntest, wie dies konkret zu realisieren wäre
Ich finde dazu leider keine hilfreichen Links im Internet, beziehungseise nur sehr kryptische oder verworrene, die allesamt an meinem Problem vorbeigehen.
-
Schreiben kannst du mit
fprintf.
Lesen geht mitfscanfoder mitfgetsund dann mitsscanfoderstring-Funktionen auswerten.Nachlesen kannst du bei http://www.cplusplus.com/reference/cstdio/fscanf/ ff
Du solltest fürs Schreiben und Lesen jeweils eigene Funktionen schreiben (beim Rest lohnt sich das durchaus auch).
Damit du keine ellenlange Parameterliste hast, wäre es praktischer, du packst deine ganzen Variablen in einestructoder Klasse (ist ja C++)
-
Schreiben kannst du mit fprintf .
Lesen geht mit fscanf oder mit fgets und dann mit sscanf oder string-Funktionen auswerten.Lass das lieber. Wenn du damit anfängst kommt es schnell zu einer ekligen C/C++ Mische. Außerdem ist es mit C++ mindestens genau so einfach:
std::ofstream datei("daten.txt"); datei << "Text" << endl;