[C/C++] Blackjackspiel mit Highscoreliste

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von SportfreundGugu, 4. Mai 2009 .

Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen
  1. #1 4. Mai 2009
    Blackjackspiel mit Highscoreliste

    Hey

    ich soll in c++ ein vereinfachtes Blackjack programmieren und am Ende werden die 5 besten in einer Highscoreliste angezeigt.
    Nun das Spiel an sich ist kein Problem, aber es hapert mit der Highscoreliste.

    Ich weiß einfach nicht wie ich es anstelle, dass ich die alte Liste einlese und abfrage wer auf welcher Position mit wie vielen Punkten steht. Setzt sich ein aktueller Spieler an die Spitze oder zwischenrein muss ich die Platzierungen ja ändern, aber der Rest soll beibehalten werden.
    Hat da jemand nen Lösungsvorschlag?

    BW is klar

    Aktueller Code von mir: (interessant wird es hier ja erst ab "// Die Highscoreliste" der rest beschreibt nur das vorgegebene Spielverhalten)
    Code:
    #include <cstdlib>
    #include <iostream>
    #include <fstream>
    #include <time.h>
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
     srand( (unsigned)time( NULL ) ); /*Initialisierung mit der Systemzeit*/
     int zufall = 0;
     char eingabe = ' ';
     const int spielZaehler = 5;
     int aktSpiel = 1;
     int punktestand = 0;
     int spielstand;
    
     // Das Spielverhalten
    
     cout << "Herzlich Willkommen beim Spiel BlackJack" << endl;
     cout << "Sie spielen " << spielZaehler << " Spiele hintereinander." << endl;
     cout << "Ziel ist es 21 Punkte zu erreichen, kommen Sie darueber, erhalten Sie 0 Punkte. (Ansonsten Ihre bis dahin erreichte Punktzahl)." << endl;
     cout << "Die 5 besten Spieler werden in der Highscoreliste \"Highscore.txt\" festgehalten" << endl;
     cout << "Wenn Sie keine Karte mehr wollen, druecken Sie \"n\" (abbrechen). Fuer eine weitere Karte druecken Sie bitte \"j\" (weiter)." << endl;
     cout << endl;
     cout << "============================================================================" << endl;
    
     do {
     cout << "Spiel Nummer " << aktSpiel << " von " << spielZaehler << " beginnt. Viel Erfolg!" << endl;
     cout << endl;
     spielstand = 0;
     do{
     do {
     zufall = rand()%13; // Zufallszahl zwischen 0 und 12
     }while(zufall < 2); // Zufallszahl zwischen 2 und 12
    
     cout << "Ihr aktueller Spielstand ist: " << spielstand << endl;
     cout << "Noch eine Karte? (j/n) ";
     cin >> eingabe;
     if(eingabe != 'n'){
     spielstand = spielstand + zufall;
     }else{
     spielstand = spielstand;
     }
     if (spielstand > 21) {
     cout << "Leider mehr als 21 Punkte. Mehr Glueck beim naechsten Versuch!" << endl;
     spielstand = 0;
     eingabe = 'n';
     }
    
    
     }while(eingabe != 'n');
     eingabe = ' ';
     punktestand = punktestand + spielstand;
     cout << "Spiel Nummer " << aktSpiel << " wurde mit " << spielstand << " Punkten abgeschlossen." << endl;
     cout << "Ihr Punktestand aller " << aktSpiel << " Spiele betraegt " << punktestand << "!"<< endl;
     cout << "============================================================================" << endl;
     aktSpiel = aktSpiel + 1;
     }while (aktSpiel <= spielZaehler);
    
     // Die Highscoreliste
    
     string name;
     int platzierung = 1;
    
     cout << "Sie haben " << punktestand << " erreicht. Geben Sie bitte Ihren Namen ein, falls ein Eintrag in die Highscoreliste erfolgt." << endl;
     cin >> name;
    
     fstream highscore ("Highscore.txt", ios::in|ios::out);
    
     highscore << "Highscoreliste \n\nPlatzierung:\tName:\tPunkte:\n";
     highscore << platzierung << "\t\t" << name << '\t' << punktestand;
    
     highscore.close();
    
     system("PAUSE");
     return EXIT_SUCCESS;
    }
    
    DANKE!
     

  2. Anzeige
    Dealz: stark reduzierte Angebote finden.
  3. #2 4. Mai 2009
    AW: Blackjackspiel mit Highscoreliste

    Ganz einfaches Thema, also, du erstellst eine Struktur:


    Code:
    struct highscore_item_s
    {
     unsigned int index;
     char name[256];
     unsigned int pts;
    };
    Nun erstellst du deine Highscoreliste wie folgt:

    Code:
    4 bytes - spieler anzahl
    spieler anzahl * highscore_item_s
    Also, die ersten 4 Bytes entsprechen die Anzahl der Einträge, die sich in der Datei befinden,
    danach folgen die Strukturen, die der Anzahl der Einträge entsprechen.

    Im Spoiler ist der Code dafür (ungetestet, sollte aber gehen), guck ihn dir nur an wenn du mit den Informationen nicht weiterkommst.

    Spoiler
    Code:
    struct highscore_item_s
    {
     unsigned int index;
     char name[256];
     unsigned int pts;
    };
    
    struct highscore_item_s* highscore_read_list( size_t* entries )
    {
     size_t amount = 0;
     struct highscore_item_s *ent = NULL;
     FILE *hHighscore = fopen( "highscore.txt", "r" );
     
     if( !hHighscore )
     {
     *entries = 0;
     return ent;
     }
    
     fread( &amount, sizeof(size_t), 1, hHighscore );
     *entries = amount; 
    
     if( !amount )
     {
     fclose(hHighscore);
     return ent;
     }
    
     ent = calloc(amount, sizeof(struct highscore_item_s));
     fread( ent, sizeof(struct highscore_item_s), amount, hHighscore);
     fclose( hHighscore );
     
     return ent;
    }
    
    void highscore_write_list( struct highscore_item_s *ent, size_t entries )
    {
     FILE *hHighscore = fopen( "highscore.txt", "w" );
     
     fwrite( &entries, sizeof(size_t), 1, hHighscore );
     fwrite( ent, sizeof(struct highscore_item_s), entries, hHighscore );
     fclose( hHighscore );
    }

    // Edit: Ups, das ist C-Code, sollte dir aber trotzdem helfen. Wenn du ein C++-Beispiel haben willst, schreib mir ne PN ;).

    // Edit: Hier der Code, auf Anfrage, in C++ (ungetestet):
    Spoiler
    Code:
    #include <fstream>
    #include <vector>
    using namespace std;
    
    struct SHighscore; // Vordeklarierung, damit der Vektor unten damit arbeiten kann
    
    typedef std::vector<SHighscore> HighscoreList; // HighscoreList ist nun ein Typspezifizierer für std::vector<..>
    
    struct SHighscore// Definierung der Struktur
    {
     public:
     int index;
     char name[256];
     int points;
    
     SHighscore( void ){}
     SHighscore( int index, char* name, int points )
     {
     this->index = index;
     this->points = points;
    
     strncpy( this->name, name, 255 );
     this->name[255] = 0x00; // string terminieren
     }
    
     ~SHighscore( void ){}
    };
    
    class CHighscores
    {
     private:
     HighscoreList m_Highscores;
    
     public:
     CHighscores( void )
     {
     this->Read();
     }
    
     ~CHighscores( void )
     {
     this->Write();
     }
    
     void Get( HighscoreList& list )
     {
     if( this->m_Highscores.empty() == true ) 
     {
     this->Read();
     }
    
     list = this->m_Highscores;
     }
     
     void Set( const char *name, int points )
     {
     SHighscore score(0, name, points);
     this->Set(score);
     }
    
     void Set( SHighscore &score )
     { 
     score.index = this->m_Highscore.size()+1; 
     this->m_Highscores.push_back(score);
     }
    
     protected:
     void Read( void )
     {
     ifstream fdRead("highscores.txt");
     SHighscore score;
     int amount;
    
     if( !fdRead.open() ) return; 
    
     fdRead >> amount;
     for( int i=0; i<amount; i++ )
     {
     fdRead.read( (char*)&score, sizeof(SHighscore) );
     this->m_Highscores.push_back(score);
     }
    
     fdRead.close();
     }
    
     void Write( void )
     {
     ofstream fdWrite("highscore.txt", ios::trunc|ios::out);
     
     if( !fdWrite..open() ) return;
    
     fdWrite << this->m_Highscores.size();
     for( int i=0; i<this->m_Highscores.size(); i++ )
     {
     fwWrite.write( (char*)&(this->m_Highscores.at(i)), sizeof(SHighscore) );
     }
    
     fdWrite.close();
     }
    
    } /* class Highscore */;
    Kleines Beispiel:

    Code:
    CHighscores Highscores;
    Highscores.Set("terraNova", 100);
     
  4. #3 5. Mai 2009
    AW: Blackjackspiel mit Highscoreliste

    jo vielen vielen dank :)
    werde es überarbeiten, aber geht soweit :) muss erst mal den code in meine form "übersetzen" xD

    danke nochmal =)
     
  5. #4 5. Mai 2009
    AW: Blackjackspiel mit Highscoreliste

    Freut mich. :]

    Aber lerne aus dem Code, ich mache sowas eigentlich sehr ungerne, da die meisten diesen Code einfach kopieren. Hab's bei dir auch nur gemacht, weil ich gesehen habe das du selber schon Arbeit reingesteckt hast. ;)
     
  6. #5 5. Mai 2009
    AW: Blackjackspiel mit Highscoreliste

    ~closed~
     

  7. Videos zum Thema
Die Seite wird geladen...