Highscore - Funktion ! Nur wie?



  • Hallo

    Am bestem legst du dir eine Liste mit allen Einträgen in der Hsc an. Diese speicherst du in ein Textfile. Am Ende des Spiels lädst du die Werte (Paar aus Name und Score) aus dem File in eine Liste und vergleichst, ob der erreichte Wert größer ist, als der kleinste in der Liste. Wenn dies der Fall ist, musst du den neuen Wert an die richtige Stelle in die Liste schreiben und die Liste nun aktualisieren. Dann speicherst du alles wieder ab. Ich habe mal so eine Klasse geschrieben, wenn du haben willst, um mal zu schauen, dann schreibe mal eine E-Mailadresse rein.

    chrische





  • vxy schrieb:

    http://www.volkard.de/vcppkold/dateien.html

    Danke!

    Darin steht:

    Das folgende Programm schreibt einen Bäckerwitz in die Datei "witz.txt":

    #include<fstream>
    using namespace std;
    
    void main()
    {
       ofstream out("witz.txt");
       out<<"Es kommt ein Mann zum Baecker und sagt: Ich moechte 99 Broetchen."<<endl;
       out<<"Da fragt der Baecker: Duerfen es auch 100 sein?"<<endl;
       out<<"Der Mann antwortet: Nein, wer koennte denn so viele essen?"<<endl;
    }
    

    Eingelesen werden kann der Witz wieder mit folgendem Programm:

    #include <fstream>
    #include <iostream>
    using namespace std;
    
    void main()
    {
       ifstream in("witz.txt");
       while(!in.eof())
       {
          char ch;
          ch=in.get();
          cout<<ch;
       };
    };
    

    So, das funktioniert auch einwandfrei.
    Nur habe ich jetzt noch konkrete Fragen dazu:

    Ich habe ein Programm mit nem Score.
    int Punkte heißt der Score in meinem Programm.
    Wie kann ich nach dem Spiel höchstens 10 Scores in die .txt Datei speichern, und zwar geordnet nach der Punktezahl ?

    Ich hoffe ihr versteht, was ich meine.



  • Friedfischer schrieb:

    Wie kann ich nach dem Spiel höchstens 10 Scores in die .txt Datei speichern, und zwar geordnet nach der Punktezahl ?

    Du liest den Inhalt der Datei ein, legst ihn in einem geeigneten Container ab, fügst den neuen Punktestand hinzu, sortierst den Container absteigend nach Punkten, und speicherst die ersten zehn Einträge wieder in die Datei.



  • Du schreibst das alles in einen std::vector (oder list, oder deque), sortierst den und gibst die 10 letzten EInträge in umgekehrter reihenfolge raus.



  • Hallo

    Ich würde übrigens nicht nur die Punkte, sondern auch die dazugehörigen Namen speichern. Als Stichwort:

    std::pair

    chrische



  • void main ... ja ne is klar.

    #include <fstream>
    
    int main()
    {
    	std::ofstream file_out_stream("witz.txt", std::ios::out);
    	if (!file_out_stream)
    		return 0;
    
    	file_out_stream << "Es kommt ein Mann zum Baecker und sagt: Ich moechte 99 Broetchen." << std::endl;
    	file_out_stream << "Da fragt der Baecker: Duerfen es auch 100 sein?" << std::endl;
    	file_out_stream << "Der Mann antwortet: Nein, wer koennte denn so viele essen?" << std::endl;
    	file_out_stream.close();
    }
    

    ... aber der andere ... also das einlesen macht ich lieber mit getline...

    #include <iostream>
    #include <fstream>
    #include <string>
    
    int main()
    {
    	std::ifstream file_stream_in("witz.txt", std::ios::in);
    	if (!file_stream_in)
    		return 0;
    
    	std::string string_out;
    	while (std::getline(file_stream_in, string_out)
    		std::cout << string_out << std::endl;
    
    	file_stream_in.close();
    }
    

    🙂



  • MFK schrieb:

    Friedfischer schrieb:

    Wie kann ich nach dem Spiel höchstens 10 Scores in die .txt Datei speichern, und zwar geordnet nach der Punktezahl ?

    Du liest den Inhalt der Datei ein, legst ihn in einem geeigneten Container ab, fügst den neuen Punktestand hinzu, sortierst den Container absteigend nach Punkten, und speicherst die ersten zehn Einträge wieder in die Datei.

    Wie meinst du das genau?

    Kannst du mir da ein konkrtes Beispiel angeben?



  • Hmm warum pusht du nicht einfach alle std::pair<std::string, unsinged short> items in nen vector und speicherst den dann .. beim starten ließt de es halt wieder aus ...



  • (D)Evil schrieb:

    Hmm warum pusht du nicht einfach alle std::pair<std::string, unsinged short> items in nen vector und speicherst den dann .. beim starten ließt de es halt wieder aus ...

    Hab noch nie etwas mit dem std: zeugs gemacht 😞 😞



  • #include <vector>
    #include <string>
    #include <utility>
    #include <algorithm>
    
    int main()
    {
        std::vector< std::pair<unsigned short, std::string> > vec_top10;
    	vec_top10.push_back(std::make_pair(125, "Karl Hans Peter"));
    	vec_top10.push_back(std::make_pair(652, "Detlef Soost"));
    	vec_top10.push_back(std::make_pair(30, "Hans Willi"));
    	vec_top10.push_back(std::make_pair(812, "Olaf Wurst"));
    	vec_top10.push_back(std::make_pair(123, "Werner Schmitz"));
    	vec_top10.push_back(std::make_pair(412, "Hänschen Depp"));
    	vec_top10.push_back(std::make_pair(412, "Hänschen Depp"));
    	vec_top10.push_back(std::make_pair(412, "Hänschen Depp"));
    	vec_top10.push_back(std::make_pair(412, "Hänschen Depp"));
    	vec_top10.push_back(std::make_pair(412, "Hänschen Depp"));
    	std::sort(vec_top10.begin(), vec_top10.end());
    
    	for (size_t item = 0; item < 10; ++item)
    		std::cout << vec_top10[item].first << " | " << vec_top10[item].second << std::endl;
    }
    

    usw ... so sortierst du die einfach 🙂 und fertig bist du ... ist doch kein Problem, oder? und dann jetzt einfach alle Elemente in die datei speichern ...



  • Hallo

    Vielleicht solltest du dir mal ein c++-Tutorial durchschauen.

    chrische



  • #include <fstream>
    
    int main()
    {
    	std::ofstream file_out_stream("witz.txt", std::ios::out);
    	if (!file_out_stream)
    		return 0;
    
    	file_out_stream << "Es kommt ein Mann zum Baecker und sagt: Ich moechte 99 Broetchen." << std::endl;
    	file_out_stream << "Da fragt der Baecker: Duerfen es auch 100 sein?" << std::endl;
    	file_out_stream << "Der Mann antwortet: Nein, wer koennte denn so viele essen?" << std::endl;
    	file_out_stream.close();
    }
    
    #include <vector>
    #include <string>
    #include <utility>
    #include <algorithm>
    
    int main()
    {
        std::vector< std::pair<unsigned short, std::string> > vec_top10;
    	vec_top10.push_back(std::make_pair(125, "Karl Hans Peter"));
    	vec_top10.push_back(std::make_pair(652, "Detlef Soost"));
    	vec_top10.push_back(std::make_pair(30, "Hans Willi"));
    	vec_top10.push_back(std::make_pair(812, "Olaf Wurst"));
    	vec_top10.push_back(std::make_pair(123, "Werner Schmitz"));
    	vec_top10.push_back(std::make_pair(412, "Hänschen Depp"));
    	vec_top10.push_back(std::make_pair(412, "Hänschen Depp"));
    	vec_top10.push_back(std::make_pair(412, "Hänschen Depp"));
    	vec_top10.push_back(std::make_pair(412, "Hänschen Depp"));
    	vec_top10.push_back(std::make_pair(412, "Hänschen Depp"));
    	std::sort(vec_top10.begin(), vec_top10.end());
    
    	for (size_t item = 0; item < 10; ++item)
    		std::cout << vec_top10[item].first << " | " << vec_top10[item].second << std::endl;
    }
    

    Das verstehe ich, danke!
    Doch wie "vereine" ich jetzt diese 2 Kästchen ^^ ?



  • Kommt drauf an ... willst du das der Benutzer normal lesen kann was da steht?

    #include <vector>
    #include <string>
    #include <utility>
    #include <algorithm>
    #include <fstream>
    
    int main()
    {
    	std::vector< std::pair<unsigned short, std::string> > vec_top10;
    	vec_top10.push_back(std::make_pair(125, "Karl Hans Peter"));
    	vec_top10.push_back(std::make_pair(652, "Detlef Soost"));
    	vec_top10.push_back(std::make_pair(30, "Hans Willi"));
    	vec_top10.push_back(std::make_pair(812, "Olaf Wurst"));
    	vec_top10.push_back(std::make_pair(123, "Werner Schmitz"));
    	vec_top10.push_back(std::make_pair(412, "Hänschen Depp"));
    	vec_top10.push_back(std::make_pair(412, "Hänschen Depp"));
    	vec_top10.push_back(std::make_pair(412, "Hänschen Depp"));
    	vec_top10.push_back(std::make_pair(412, "Hänschen Depp"));
    	vec_top10.push_back(std::make_pair(412, "Hänschen Depp"));
    	std::sort(vec_top10.begin(), vec_top10.end());
    
    	std::ofstream file_out_stream("top10.txt", std::ios::out);
    
    	if (!file_out_stream)
            return 0;
    
    	for (size_t item = 0; item < 10; ++item)
    	{
    		std::cout << vec_top10[item].first << " | " << vec_top10[item].second << std::endl;
    		file_out_stream << vec_top10[item].second << " | " vec_top10[item].first << std::endl;
    	}
    
        file_out_stream.close();
    }
    

    ...



  • Gar nicht 😉 Schließlich willst du keine Witze speichern sondern deine Highscores.

    Was du brauchst, ist:

    //zentral erreichbar - die HighScore-Liste:
    //Anmerkung: Wenn die Scores sowieso sortiert sein müssen, ist eine MultiMap praktischer
    multi_map<int,string> highscores;
    
    //alte HighScores einlesen:
    ifstream data("hiscore.txt");
    string zeile;
    while(getline(data,zeile)
    {
      size_t pos=zeile.find('|');//Trennzeichen
      highscores.insert(make_pair(atoi(zeile.c_str()),zeile.substr(pos+2)));
    }
    
    //Highscores zurückschreiben:
    ofstream data("hiscore.txt");
    for (multi_map<int,string>::iterator item=highscores.begin(); item!=highscores.end(); ++item)
      data << item->first << " | " << item->second << std::endl;
    
    //neuen Score eintragen:
    hishscores.insert(make_pair(score,name));
    while(highscores.size()>10) highscores.erase(highscores.begin());
    

    Lies es dir durch. Und wenn du kapiert hast, was jeder Teil bewirkt, kannst du es an der richtigen Stelle in dein Spiel integrieren.



  • (D)Evil schrieb:

    Kommt drauf an ... willst du das der Benutzer normal lesen kann was da steht?

    Ja, am Ende des Spiels soll sein Name in die Highscore - Tabelle eingetragen werden, und anschließend soll er es auch sehen, wo er gelandet ist.



  • nein das meine ich nicht. Soll der Benutzer, wenn er die Textdatei öffnet(also bsw. mit "Editor"), einen leserlichen Text erblicken?



  • (D)Evil schrieb:

    nein das meine ich nicht. Soll der Benutzer, wenn er die Textdatei öffnet(also bsw. mit "Editor"), einen leserlichen Text erblicken?

    Wäre toll, wenn er es nicht könnte 😉



  • Naja du kannst es etwas "verschweren" in dem du binär schreibst ...



  • (D)Evil schrieb:

    Naja du kannst es etwas "verschweren" in dem du binär schreibst ...

    Ok, danke für die ganze Hilfe!
    Werde das mit dem Binär machen. Ist ja nicht so schwer.


Anmelden zum Antworten