Tach
Folgendes habe ich vor:
In dem kleinen Testspiel an dem ich arbeite soll es möglich sein am Ende jedes Durchlaufs die erreichten Punkte sowie einen dazu gehörenden Spielernamen zu speichern. Dazu habe ich mir eine einfache Klasse für den Spieler geschrieben in dem nur der Name und die Punkte gespeichert werden. Am Ende jedes Spiels (zumindest wenn der Spieler gewonnen hat und nicht die KI) wird nun also eine neue Instanz der Klasse mit den erreichten Punkten und Name erzeugt. So weit so gut.
Nun möchte ich aber die Liste aller gespeicherten Daten abrufen können. Den dazu nötigen Code habe ich auch so weit geschrieben, nur funktioniert es nicht so wie es sollte. Es werden zwar immer so viele Datensätze ausgegeben wie bisher gespeichert wurden, allerdings immer nur der als letztes gespeicherte korrekt. Alle anderen enthalten nur Datensalat.
Basiert habe ich das ganze auf dem Listing 7.9 auf Seite 205 des Buches "C++ für Spieleprogrammierer". Allerdings werden dort alle Instanzen in einem Rutsch erzeugt während bei mir einfach immer am Ende eines Spieldurchlaufs eine neue hinzu kommt (oder eben auch nicht). Ich dachte eigentlich ich wäre in der Lage das Beispiel entsprechend umzubauen so dass es so funktioniert wie ich will, aber offenbar habe ich mich da überschätzt
Deshalb mal wieder die Frage an Euch, wo liegt der Fehler? Oder müsste ich sogar eine komplette andere Herangehensweise wählen?
Der Codeabschnitt in der main-Funktion der den Konstruktor aufruft und den Zähler für die Anzahl Datensätze erhöht:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
Cplayer *pplayer = NULL; // for saving player to highscore list
int players = 0; // how many players in high score list?
int score = 0;
char chsave;
if (score > 0)
{
cout << "Willst Du Deinen Erfolg fuer die Nachwelt festhalten? j/n" << endl;
cin >> chsave;
if (chsave == 'j')
{
players++;
pplayer = new Cplayer(score);
score = 0;
}
}
|
Der Codeabschnitt der die Highscore-Liste ausgeben sollte:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
|
case 4:
cout << ">>>HIGHSCORE<<<" << endl;
cout << "---------------" << endl;
for (int p = 0; p < players; p++)
{
pplayer[p].showdata();
}
break;
|
Die Klasse für die Datensätze mit den entsprechenden Funktionen:
|
C-/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
|
class Cplayer
{
public:
// member variables
//
int m_score = 0;
char m_name[21];
Cplayer(int score) // constructor
{
m_score = score;
cout << "Gib Deinen Namen ein (max. 20 Zeichen): ";
cin.ignore();
cin.get(m_name, 20);
cout << "Spieler: " << m_name << endl;
cout << "Punkte: " << m_score << endl;
}
void showdata()
{
cout << "Spieler: " << m_name << endl;
cout << "Punkte: " << m_score << endl;
}
}; // class player
|
Vermutung:
Ich erzeuge so gar nicht mehrere Instanzen sondern überschreibe jedes mal wieder die Selbe.
Falls dem so ist, wie erzeuge ich mehrere Instanzen eine nach der anderen?
Falls nicht, wieso werden die Datensätze nicht korrekt ausgegeben?