Highscore erstellen

  • geschlossen
  • C

  • bald_patr
  • 1499 Aufrufe 5 Antworten
  • Highscore erstellen

    kann mir jemand bei dieser aufgabe helfen:

    Highscoreliste

    Erstelle ein Programm, welches den Namen eines Spielers und seine erreichten Punkte erfasst und in einer binären Datei (Name: score.bin) abspeichert. Es können von einem Spieler durchaus mehrere Einträge gespeichert sein.

    Die Struktur für einen Highscore-Eintrag ist wie folgt definiert:


    struct TScore
    {
    char name[20];
    int punkte;
    };


    Neben der Funktion zum Erfassen von Spielern und deren Punkten sollte dein Programm auch noch folgende Funktionen implementieren:

    a) Ausgabe aller gespeicherten Highscoreeinträge

    Beispiel für die Ausgabe:


    Hans 3433
    Susi 7210
    Otto 455
    Susi 4556
    Otto 932
    Max 3333


    b) Erstellen einer Top-Ten Liste

    Es wird von jedem Spieler nur der Datensatz mit der höchsten Punktezahl berücksichtigt. D.h. in dieser Liste kann ein Name nicht mehrfach vorkommen. Die Liste ist nach der Punktezahl sortiert.

    Beispiel für die Ausgabe:


    1. Susi 7210
    2. Hans 3433
    3. Max 3333
    4. Otto 932


    c) Highscoreliste nach Punkten

    Ausgabe aller gespeicherten Einträge sortiert nach Punkten.

    Beispiel für die Ausgabe:


    1. Susi 7210
    2. Susi 4556
    3. Hans 3433
    4. Max 3333
    5. Otto 932
    6. Otto 455


    d) Liste aller Namen die in der Highscoreliste vorkommen. Sortiert nach Namen

    Beispiel für die Ausgabe:


    Hans
    Max
    Otto
    Susi



    schon im voraus danke für die hilfe!!

    MfG
    bald_patr
  • in pure C oder darfst du klassen benutzen ?

    mal im ernst. eine grobe richtung kann ich dir geben, aber erwarte nich, das ich diese (relativ simple) aufgabe komplett für dich lösen werde, denn sonst lernst du ja nichts dabei ;)

    zunächst einmal brauchst du ein array of TScore ...

    TScore myArray[];

    jeden neuen eintrag kannst du entweder hinten anhängen oder direkt einsortieren. solltest du dich für einsortieren entscheiden, so ist hinterher das ausgeben der top-ten und/oder highscore liste einfacher ..

    für ein sortieren gibt es mehrere möglichkeiten. bei beiden must du die liste mindestens einmal komplett durchlaufen. entweder du sortierst die liste durch vertauschen jeweils zweier einträge (in situ), oder du erstellst eine zweite liste, in die du die elemente sortiert rein schreibst. eine ausgabe erfolgt dann analog dazu.

    bei der ausgabe der namen würde ich auch eine neue liste erstellen und jeden namen, der beim durchlaufen der highscore liste noch nicht vorgekommen ist, in diese liste aufnehmen.

    // ... zwischen suppe und kartoffeln ... //
  • Wie Feuerstein schon angedeutet hat wird es ein Krampf (wenn du mich fragst) wenn du alles in reinem C ohne Klassen und STL machen willst. Ich würde dir wirklich C++ ans Herz legen, hier mal ein paar Auszüge, was ich mir so vorstellen würde:

    C-Quellcode

    1. // header in etwa so:
    2. #include <string>
    3. #include <vector>
    4. using namespace std;
    5. #define ITER vector<TScore>::iterator // sry angewohnheit =)
    6. struct TScore { string name; int score; }; // einzeilig zwecks platz sparen im forum
    7. // so dann erstellste dirn vector (dynamisches array sozusagen)
    8. vector<TScore> Scorelist;
    Alles anzeigen
    Nun die Frage mit dem Sortieren. Ich weiß ehrlich gesagt nicht wie man ein vector Objekt im Allgemeinen am besten sortiert, d.h. ob es da Funktionen für gibt oder man selber sich was basteln muss (gibts ja Algorithmen für wie Pivot oder so). Musste selber mal schaun.
    Alternativ würde ich denken dass eine sofortige Sortierung günstiger ist. In etwa so:

    Quellcode

    1. void add(TStart &obj)
    2. {
    3. int size = Scorelist.size();
    4. if (size == 0)
    5. {
    6. Scorelist.push_back(obj);
    7. return;
    8. }
    9. int cmp;
    10. for (ITER i = Scorelist.begin(); i != Scorelist.end(); i++)
    11. {
    12. cmp = i->name.compare(obj.name);
    13. if (cmp > 0)
    14. {
    15. Scorelist.insert(i, obj);
    16. return;
    17. }
    18. if (cmp == 0) // name gleich
    19. {
    20. if (i->score < obj.score)
    21. {
    22. Scorelist.insert(i, obj);
    23. return;
    24. }
    25. if (i->score == obj.score)
    26. return; // 2x das gleiche willste sicher nich
    27. }
    28. }
    29. if (Scorelist.size() == size) // für diesen fall ist mir nix anderes eingefallen (:
    30. Scorelist.push_back(obj);
    31. }
    Alles anzeigen
    Keine Ahnung ob die Funktion so richtig ist, musste halt selber probieren.

    Tjo also so würde ichs machen, reines C empfehle ich ja sowieso nicht. :)
  • Hallo,
    zufälligerweise hab ich zuzeit das gleiche Problem, das ganze nur in Java.
    Also, wir programmieren in der Schule eine "Mathequiz" (2x2=?...usw.). Hab das ganze bis dahin auch eigentlich ganz gut hingekriegt, nun hängts aber auch bei der Highscoreliste.
    Und ich versteh das c++-getue nicht wirklich so ganz ;)

    Schonmal vielen Dank für eure Hilfe!!!