Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Ich00nix

Frischling

  • »Ich00nix« ist der Autor dieses Themas

Beiträge: 63

Wohnort: Kaiserslautern

Beruf: Schüler

  • Private Nachricht senden

1

31.05.2007, 19:01

prob mit Highscore

Hi!
Ich habe mir ein kleines Spiel gebaut. Das läuft auch wunderbar bis auf die Highscore! Bei der habe ich folgendes Prob.
(ich arbeite mir ifstream und ofstream sie soll also gespeichert werden)
um die Highscore mit der erreichten Punktezahl zu vergleichen, aber bei ersten Programmstart gibt es noch keine Datei die man auslesen könnte! wenn ich aber zuerst die Highscore schreibe, mache ich das ja jedesmal vor dem Prüfen und dadurch wird der Inhalt der Datei immer auf meine Starthighscore gestellt (klingt logisch oder?)

Jetzt meine Frage: Wie kann ich diesem Prob entgehen?
es müsste doch eine ganz Simple Lösung dafür geben aber ich komm nich drauf :oops:

Vielen Danke im Vorraus
mfg ich

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

2

31.05.2007, 20:20

es heißt in voraus und nicht in vor-raus ;)

Ja, es ist ganz einfach. Du versuchst die Datei zu öffnen. Wenn dies nicht klappt, lädst du halt Standarddaten. Wenn die Datei vorhanden ist, dann lädst du die Daten aus der Datei.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

3

31.05.2007, 20:45

C-/C++-Quelltext

1
2
3
4
5
6
std::ifstream datei;
datei.open(...); // wie auch immer du die öffnest

if (! datei)
{
// Datei konnte anscheinend nicht geöffnet werden

}

Ich00nix

Frischling

  • »Ich00nix« ist der Autor dieses Themas

Beiträge: 63

Wohnort: Kaiserslautern

Beruf: Schüler

  • Private Nachricht senden

4

31.05.2007, 21:13

ok danke!

Ich00nix

Frischling

  • »Ich00nix« ist der Autor dieses Themas

Beiträge: 63

Wohnort: Kaiserslautern

Beruf: Schüler

  • Private Nachricht senden

5

31.05.2007, 21:25

also ich dachte das folgendermaßen:

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
int Highscore1 = 10793;
                           int Highscore2 = 35;
                           int Highscore3 = 20;


                           ifstream Lesen1 ("Highscore1.hsc", ios::binary);
                           if (! Lesen1)
                               cout << "Datei konnte nicht geöffnet werden!" << endl;
                           Lesen1.read ((char*) &Highscore1, sizeof (Highscore1)); 
                           Lesen1.close ();

                           ifstream Lesen2 ("Highscore2.hsc", ios::binary);
                           Lesen2.read ((char*) &Highscore2, sizeof (Highscore2)); 
                           Lesen2.close ();

                           ifstream Lesen3 ("Highscore3.hsc", ios::binary);
                           Lesen3.read ((char*) &Highscore3, sizeof (Highscore3)); 
                           Lesen3.close ();
                           
                           

                           if (punkte > Highscore1) {
                               cout << "Du hast meine programmierte Highscore geknackt?" << endl;
                               cout << "Das lasse ich nicht zu du wirst trotzdem zweiter!!!" << endl;
                               punkte = Highscore1 - 100;
                           
                               char Name1n [40] = "Jonas";
                               
                               ofstream Punkte1 ("Highscore1.hsc", ios::binary);
                               Punkte1.write ((char*) &Highscore1, sizeof (Highscore1));
                               Punkte1.close();

                               ofstream Name1 ("Highscore1n.hsc", ios::binary);
                               Name1.write ((char*) &Name, sizeof (Name));
                               Name1.close();}
                         

                           if (punkte > Highscore2) {
                               cout << "Super du bist in der Highscore auf den 2. Platz gekommen!" << endl;
                               
                               
                             
                               
                               ofstream Punkte2 ("Highscore2.hsc", ios::binary);
                               Punkte2.write ((char*) &Highscore2, sizeof (Highscore2));
                               Punkte2.close();

                               ofstream Name2 ("Highscore2n.hsc", ios::binary);
                               Name2.write ((char*) &Name, sizeof (Name));
                               Name2.close(); }

                           else if (punkte > Highscore3) {
                               cout << "Super du bist in der Highscore auf den 3. Platz gekommen!" << endl;
                               
                             
                             
                               
                               ofstream Punkte3 ("Highscore3.hsc", ios::binary);
                               Punkte3.write ((char*) &Highscore3, sizeof (Highscore3));
                               Punkte3.close();
                               

                               ofstream Name3 ("Highscore3n.hsc", ios::binary);
                               Name3.write ((char*) &Name, sizeof (Name));
                               Name3.close(); }
                           else {
                               cout << "Du hast leider keinen Platz in der Highscore erreicht." << endl; }


dort treten auch keine Probleme auf aber wenn ich dann die Funktion zeige highscore aufrufe kommt bei name irgendwelche zeichen!

die Highscore zeigefunktion sieht folgendermaßen aus:

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
29
30
31
32
33
34
35
36
37
38
39
40
41
void zeigehighscore() {
            int Highscore1, Highscore2, Highscore3;
            char Name[20];
            
                           ifstream Lesen1 ("Highscore1.hsc", ios::binary);
                           Lesen1.read ((char*) &Highscore1, sizeof (Highscore1)); 
                           Lesen1.close ();

                           ifstream Lesen2 ("Highscore2.hsc", ios::binary);
                           Lesen2.read ((char*) &Highscore2, sizeof (Highscore2)); 
                           Lesen2.close ();

                           ifstream Lesen3 ("Highscore3.hsc", ios::binary);
                           Lesen3.read ((char*) &Highscore3, sizeof (Highscore3)); 
                           Lesen3.close ();

                           
                           ifstream Lesen4 ("Highscore1n.hsc", ios::binary);
                           if (! Lesen4)
                               cout << "Datei konnte nicht geöffnet werden!"<< endl;
                           Lesen1.read ((char*) &Name, sizeof (Name)); 
                           Lesen1.close ();
         


                           cout << "1. Platz: " << Name << " mit " << Highscore1 << " Punkten" << endl;

                           ifstream Lesen5 ("Highscore2n.hsc", ios::binary);
                           Lesen1.read ((char*) &Name, sizeof (Name)); 
                           Lesen1.close ();

                           cout << "2. Platz: " << Name << " mit " << Highscore2 << " Punkten" << endl;

                           ifstream Lesen6 ("Highscore3n.hsc", ios::binary);
                           Lesen1.read ((char*) &Name, sizeof (Name)); 
                           Lesen1.close ();

                           cout << "3. Platz: " << Name << " mit " << Highscore2 << " Punkten" << endl; 

                          
        }


da is ja dann wohl ein Fehler drinn denn als ich das mit If (! datei) gemacht habe hat er keinen Fehler angezeigt!

wenn sich nochmal jemand meldet wäre das sehr net!

@Nox erstens heißt es im und net in zweitens wird Voraus in diesem Fall groß geschrieben und drittens habe ich nicht vor-raus sonder vorraus geschrieben aber ansonstens danke für den tipp ;)

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

6

31.05.2007, 21:28

Du brauchst nicht für jeden Highscore eine eigene Datei... :shock:
@D13_Dreinig

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

7

31.05.2007, 21:30

Wie wärs, wenn du jede Datei vorm Lesen prüfst und außerdem als parameter für Lesedateien ios::binary | ios::in angibst?

// außerdem muss mans sich nicht direkt mit Nox verscherzen, er hat das genau richtig geschreiben ;)

Ich00nix

Frischling

  • »Ich00nix« ist der Autor dieses Themas

Beiträge: 63

Wohnort: Kaiserslautern

Beruf: Schüler

  • Private Nachricht senden

8

31.05.2007, 21:50

sry war ja net so gemeint :oops:
jede datei prüfen ok
flags ok
ich probiers ma


mfg ich

9

31.05.2007, 22:37

Ähm bsw.

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
29
30
31
32
template <typename T>
bool write_array(std::ostream& stream, const T* data, const std::size_t size)
{
    if (data == NULL || size == 0)
        return false;
    
    for (std::size_t i = 0; i < size; ++i)
        stream.write(reinterpret_cast<const char*>(&data[i]), sizeof(T));

    return !stream.fail();
}

template <typename T>
bool write_highscore(const std::string& file_name, const T* data, const std::size_t size)
{
    if (data == NULL || size == 0)
        return false;

    std::ofstream file_stream(file_name.c_str(), std::ios::binary | std::ios::out);
    if (!file_stream)
        return false;

    return write_array<T>(data, size);
}


int main()
{
    unsigned int score[10] = { 20, 10, 9, 12, 15, 23, 54, 23, 64, 42 };
    if (write_highscore("score_001.hs", score, 10) == false)
        std::cout << "Highscore konnte nicht gespeichert werden!" << std::endl;
}
...

oder dann nen bissel mit Namen usw.

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
29
30
31
32
33
34
35
template <typename T>
bool write_array(std::ostream& stream, const std::vector< std::pair<T, std::string> >& data)
{
    for (std::vector< std::pair<T, std::string> >::const_iterator it = data.begin(); it != data.end(); ++it)
    {
        stream.write(reinterpret_cast<const char*>(&((*it).first)), sizeof(T));
        std::size_t size = (*it).second.length();
        stream.write(reinterpret_cast<const char*>(&size), sizeof(std::size_t));
        stream.write((*it).second.c_str(), static_cast<std::streamsize>(size));
    }

    return !stream.fail();
}

template <typename T>
bool write_highscore(const std::string& file_name, const std::vector< std::pair<T, std::string> >& data)
{
    std::ofstream file_stream(file_name.c_str(), std::ios::binary | std::ios::out);
    if (!file_stream)
        return false;

    return write_array<T>(file_stream, data);
}

int test()
{
    std::vector< std::pair<unsigned short, std::string> > data(10);
    for (unsigned short n = 0; n < 10; ++n)
        data.push_back(std::make_pair((n * 20) % 3, "Deviloper"));

    if (write_highscore("score_001.hs", data) == false)
        std::cout << "Highscore konnte nicht gespeichert werden!" << std::endl;

    return 0;
}
... ok is nen bissel overenginering ;)
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

10

31.05.2007, 23:04

Zitat von »"Deviloper"«

... ok is nen bissel overenginering ;)


nen bissel ist gut :lol:
vor allem wenn man den Code aus den Augen eines Menschen anschaut, der grad die ersten Schritte mit Dateistreams macht.

Werbeanzeige