[Anfänger] vector problem



  • Hallo bin neu hier und neu bei den c++ programmierern und habe direkt mal ne frage zu vectoren:

    als Übung versuche ich ein kleines Black Jack spiel zu programmieren, dazu habe ich einen vector angelegt der als elemente die karten enthält -->52 elemente

    wenn der spieler nun eine zufällige karte erhält (welche in einen eigenen vector gespeichert wird), soll diese aus dem vector gelöscht werden.

    das prob ist folgendes, wenn ich einer variablen den inhalt des vectors mit zufälligem indexwert übergebe, kenne ich den wert, nicht aber den indexwert, wie finde ich diesen heraus? ich könnte ja rückwärts anhand des kartenwertes den indexwert rausfinden, aber dann hätte ich für die zwei z.b 4 verschiedene möglichkeiten... hier der wichtige teil des codes

    vector<int> eigeneKarten;
    for(int i=0; i<52; i++) {
    int ZufallsZahl = rand()%Karte.size();
    cout << "Zufallszahl = " << ZufallsZahl <<endl;
    eigeneKarten.push_back(Karte[ZufallsZahl]);
    cout << eigeneKarten.size() << ". Karte " << eigeneKarten.back() << endl;
    }
    

    sry sollte der code noch was chaotisch sein ich bessere mich 8[



  • Der Indexwert ist ZufallsZahl...



  • Zzork schrieb:

    vector<int> eigeneKarten;
    for(int i=0; i<52; i++) {
    int ZufallsZahl = rand()%Karte.size();
    cout << "Zufallszahl = " << ZufallsZahl <<endl;
    eigeneKarten.push_back(Karte[ZufallsZahl]);
    cout << eigeneKarten.size() << ". Karte " << eigeneKarten.back() << endl;
    }
    

    Auf diese Weise entfernst du jedoch die gezogene Karte nicht aus vector, sondern hängst sie noch ein weiteres Mal an den Vektor an (Funktion push_back()). Um sie zu löschen, benutze erase().

    Zudem musst du den Vektor zuerst initialisieren. Bei dir hat er die ganze Zeit die Grösse 0.



  • ja das ist es ja, eigeneKarten sind die Karten die ich bekomme, erase() habe ich hier noch gar nicht eingebaut, hab auch ehrlich gesagt ka wie ich das anstellen soll, hab hier ein buch liegen in dem steht dass man es so anstellen kann

    for(int i=0; i<52; i++) {
    int ZufallsZahl = rand()%Karte.size();
    cout << "Zufallszahl = " << ZufallsZahl <<endl;
    eigeneKarten.push_back(Karte[ZufallsZahl]);
    Karte.erase( Karte.begin()+ZufallsZahl);
    cout << eigeneKarten.size() << ". Karte " << eigeneKarten.back() << endl;
    }
    

    gibt aber nur nen fehler wenn ich das ganze 52 mal (für jee karte) durchlaufen lasse. vielleicht sollte ich das element einfach mit "0" überschrieben und wenn das beim nächsten durchlauf die 0 kommt startet er halt neu bis keine 0 mehr kommt.......unsauber? 8[



  • Kannst du das ganze etwas verständlicher formulieren? Was willst du denn erreichen? Zuerst eine zufällige Permutation von 52 Integer-Werten (Karten) in einem std::vector?

    Willst du die Karten, nachdem alle im vector sind, anschliessend einzeln wieder entfernen? Wenn ja, musst du eine separate For-Schleife erstellen, da in deinem Code jedes Element, das erstellt wird, gleich wieder gelöscht wird:

    Zzork schrieb:

    eigeneKarten.push_back(Karte[ZufallsZahl]);
    Karte.erase( Karte.begin()+ZufallsZahl);
    

    Deine erase()-Syntax ist korrekt - Karte.begin ist ein Iterator (entspricht etwa einem Zeiger) auf das erste Element des Vectors, mit +ZufallsZahl hast du Zugriff auf das Element mit dem Index ZufallsZahl (Zeigerarithmetik).

    Karte.erase(Karte.begin()+Index);
    

    Ich empfehle dir, den Code einzurücken, das steigert die Übersichtlichkeit enorm.
    Und beschreib bitte ausführlich, was du genau tun willst, damit wir dir helfen können 😉



  • ok nochmal von vorne ^^
    es gibt 2 vectoren

    1. vector<int> Karte
    2. vector<int> eigeneKarten
    ----------------------------------
    1. hier werden von anfang an alle 52 Karten eines decks gespeichert, den teil des codes habe ich rausgelassen

    2. hier kommen die karten von "Karte" rein die man bekommt, logischerweise werden diese dann aus "Karte" gelöscht

    also sollte es ein element-transport von Karte in eigeneKarten sein



  • Und was ist da jetzt das Problem?

    Schreib dir ne Funktion die in deinen Vektor Karten, die Karte sucht, dann speicherst du sie in einer Temporären Variable und löscht dann das alte Element. Dann brauchst dus nur noch in dein anderen Vektor schieben.

    Tipp: Benutz mal lieber list<> die ist noch ein wenig fexibler.

    Gruß Tobi.



  • Sieht so aus, als ob du die Karten mischen wolltest. Dafür gibts in der Standardbibliothek schon was, nämlich im Header <algorithm> die Funktion std::random_shuffle(conainer.begin(), container.end()). Wenn du gemischt hast brauchst du nur noch Karten.back() und Karten.pop_back() zu benutzen. Die Algorithmenbibliothek kann öfter nützlich sein als man denkt. Wieso dein eigener Code nicht so funktioniert wie erwartet ist mir unklar.
    std::list ist in einer Hinsicht weniger flexibler als std::vector: Keine Random-Access-Iteratoren. Ich denke für ein Kartenspiel eignen sich Vektoren besser.


Anmelden zum Antworten