Highscore - Funktion ! Nur wie?
-
vxy schrieb:
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.
-
CStoll schrieb:
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.
Bei mir zeigt es da Fehler an ...

Wäre für mein Programm nämlich günstiger.Welche includes brauche ich dafür?
-
Hallo
1. Zeige doch bitte auch die Fehlermeldungen.
2. Versuche doch mal eine Problem mittels google oder so selber zu lösen
chrische