Highscore - Funktion ! Nur wie?
-
Hallo wieder einmal

Ich habe ane Frage:
Wie baue ich in der Konsolenprogrammierung eine Highscorefunktion ein?
Habe da an eine Textdatei gedacht, wo jedes Mal die Ergebnisse gespeichert werden, und sie auch wieder aufgerufen werden können.Oder gibt es da bessere bzw. andere Methode?
Ich freue mich auf Antworten!
Thx im Voraus!
-
Hast du vielleicht ne konkrete Frage, wie man mit Dateien in C++ umgeht? An sich ist das ganze nämlich ziemlich primitiv und geht genau so, wie du es dir dachtest.
-
.filmor schrieb:
Hast du vielleicht ne konkrete Frage, wie man mit Dateien in C++ umgeht? An sich ist das ganze nämlich ziemlich primitiv und geht genau so, wie du es dir dachtest.
Ich habe wieder ein Spiel programmiert. Dort werden die Punkte angezeigt.
Am Ende soll dann diese Highscorefunktion erscheinen.Nur wie mache ich das genau?
Wo muss ich diese Textdatei speichern?
Wie wird sort etwas automatisch gespeichert?
Wie rufe ich dieses Zeug in c++ auf?Kenn mich in dieser Sache 0,0 % aus...
-
Nur wie mache ich das genau?
Wie rufe ich dieses Zeug in c++ auf?
zb mit std::fstream.
Wo muss ich diese Textdatei speichern?
irgendwo auf deiner festplatte, es bleibt dir überlassen.
Wie wird sort etwas automatisch gespeichert?
ich verstehe nicht ganz was du meinst, automatisch passiert garnichts, das musst du schon jedesmal selber machen.
wenn du jeweils den namen und die erreichten punkte speichern möchstest könnte deine datei folgendermaßen aussehen:
spieler1 123; spieler2 456; xyz 789;
-
Du hast mir schon weitergeholfen, aber ich weiß nicht, wo ich wie etwas reinschreiben soll.
Ist z.B. bei Spieler1 die 123 ein Dateiname?
Steh momentan komplett auf der Leitung!
-
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:
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.