Werte von Arrays addieren in einer if-Schleife



  • Hallo,
    ich bin ganz neu in der Programmierung generell und insbesondere bei C++. Für die Uni müssen wir ein kleines Würfelspiel programmieren, bei dem mit 2 Würfeln gewürfelt wird, dabei setzen 3 verschiedene Spieler zufällig. Bei der Summe der Augen von 5 und 9 gewinnen die Spieler, bei einem Pasch, einer Augensumme von 3 oder 11 die Bank. Zu Beginn kann der Benutzer den Startwert des Zufallsgenerators und die gewünschte Rundenanzahl eingeben. Am Ende jeder Runde sollen die Würfelergebnisse und Kapitale der Spieler und der Bank ausgegeben werden. So weit hat das bei mir gut geklappt. Nun soll ich zusätzlich am Ende jeder Runde für jeden Spieler ausgeben, in welcher Runde er sein Maximalkapital hatte und wie hoch dieses war. Ein bisschen Recherche hat ergeben, dass ich dazu wohl am besten Arrays nutzen soll. Das ist für mich komplett neu und ich komme damit nicht ganz zurecht. Ich möchte in der if-Schleife das Kapital über Arrays definieren, das Problem ist hierbei, wie ich das neue Kapital berechne. Zuvor sah es so aus:

    if (Augensumme == 5 || Augensumme == 9)
    {
    Kapital1 += 2 * Einsatz1;
    Kapital2 += 2 * Einsatz2;
    Kapital3 += 2 * Einsatz3;
    Bankkapital = Bankkapital - Einsatz1 - Einsatz2 - Einsatz3;
    
    }
    if (Augensumme == 3 || Augensumme == 11 || Wuerfel1 == Wuerfel2)
    {
    Kapital1 -= Einsatz1;
    Kapital2 -= Einsatz2;
    Kapital3 -= Einsatz3;
    Bankkapital = Bankkapital + Einsatz1 + Einsatz2 + Einsatz3;
    }
    else
    {
    }
    

    Kann mir hier jemand erklären, wie ich die Addition auch mit einem Array darstellen kann? Ich stelle untenan noch einmal den kompletten Code.
    Vielen Dank schon mal,
    Rina

    #include <iostream>
    #include <random>
    
    using namespace std;
    
    int main()
    {
      int Zufallsgenerator = 0;
      mt19937 rnd_gen(Zufallsgenerator);
      int Bankkapital = 20000;
      int Kapital1 = 2000;
      int Kapital2 = 2000;
      int Kapital3 = 2000;
    
      uniform_int_distribution<int> vfkt_Einsatz1(1, 7);
      uniform_int_distribution<int> vfkt_Einsatz2(5, 30);
      uniform_int_distribution<int> vfkt_Einsatz3(25, 50);
      uniform_int_distribution<int> vfkt_Wuerfel1(1, 6);
      uniform_int_distribution<int> vfkt_Wuerfel2(1, 6);
    
      int Augensumme = 0;
      int Rundenzahl = 0;
    
      cout << "Geben Sie den Startwert des Zufallsgenerators ein: ";
      cin >> Zufallsgenerator;
      cout << "Geben Sie Anzahl der zu spielenden Runden ein: ";
      cin >> Rundenzahl;
    
     for (int j = 0; j < Rundenzahl; ++j)
      {
       int Einsatz1 = vfkt_Einsatz1(rnd_gen);
       int Einsatz2 = vfkt_Einsatz2(rnd_gen);
       int Einsatz3 = vfkt_Einsatz3(rnd_gen);
       cout << "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" << endl;
       cout << "Runde Nr. " << j + 1 << ", Einsatz von Spieler 1: " << Einsatz1 << endl;
       cout << "Runde Nr. " << j + 1 << ", Einsatz von Spieler 2: " << Einsatz2 << endl;
       cout << "Runde Nr. " << j + 1 << ", Einsatz von Spieler 3: " << Einsatz3 << endl;
    
       int Wuerfel1 = vfkt_Wuerfel1(rnd_gen);
       int Wuerfel2 = vfkt_Wuerfel2(rnd_gen);
       int Augensumme = Wuerfel1 + Wuerfel2;
       cout << "Runde Nr. " << j + 1 << ", Wuerfel 1: " << Wuerfel1 << endl;
       cout << "Runde Nr. " << j + 1 << ", Wuerfel 2: " << Wuerfel2 << endl;
       cout << "Runde Nr. " << j + 1 << ", Augensumme: " << Augensumme << endl;
    
         if (Augensumme == 5 || Augensumme == 9)
         {
           Kapital1 += 2 * Einsatz1;
           Kapital2 += 2 * Einsatz2;
           Kapital3 += 2 * Einsatz3;
           Bankkapital = Bankkapital - Einsatz1 - Einsatz2 - Einsatz3;
           }
         if (Augensumme == 3 || Augensumme == 11 || Wuerfel1 == Wuerfel2)
          {
           Kapital1 -= Einsatz1;
           Kapital2 -= Einsatz2;
           Kapital3 -= Einsatz3;
           Bankkapital = Bankkapital + Einsatz1 + Einsatz2 + Einsatz3;
           }
         else
         {
           }
       cout << "Kapital von Spieler 1: " << Kapital1 << endl;
       cout << "Kapital von Spieler 2: " << Kapital2 << endl;
       cout << "Kapital von Spieler 3: " << Kapital3 << endl;
       cout << "Bankkapital: " << Bankkapital << endl;
       }
     cin.get();
     getchar();
     return 0;
    }
    


  • Wenn du Variablen hast, dis sich lediglich in Zahlen unterscheiden (wie Kapital1, Kapital2, Kapital3) ist das ein Zeichen dafür, dass du Arrays nehmen solltest.

    Bis jetzt bist du ohne ausgekommen, dann schaffst du das auch für das Maximalkapital.

    Mit Array ist es aber einfacher, da du die Berechnungen nur einmal hinschreibst.
    Dass die Berechnung dann trotzdem 3x ausgeführt wird, machst du mit einer Schleife und dem Index beim Arrayzugriff.

    PS.: http://www.if-schleife.de/



  • int Kapital1 = 2000;
    int Kapital2 = 2000;
    int Kapital3 = 2000;
    
    // wird zu
    
    constexpr int Startkapital = 2000;
    std::array<int, spielerzahl> Kapital;
    std::fill(Kapital.begin(), Kapital.end(), Startkapital);
    
    Kapital1 -= Einsatz1;
    Kapital2 -= Einsatz2;
    Kapital3 -= Einsatz3;
    Bankkapital = Bankkapital + Einsatz1 + Einsatz2 + Einsatz3;
    
    // wird zu
    
    for (std::size_t i = 0; i < spielerzahl; ++i) {
        Kapital[i] -= Einsatz[i];
        Bankkapital += Einsatz[i];
    }
    
    cout << "Kapital von Spieler 1: " << Kapital1 << endl;
    cout << "Kapital von Spieler 2: " << Kapital2 << endl;
    cout << "Kapital von Spieler 3: " << Kapital3 << endl;
    
    // wird zu
    
    for (std::size_t i = 0; i < spielerzahl; ++i) {
        cout << "Kapital von Spieler " << i + 1 << ": " << Kapital[i] << '\n';
    }
    
    // usw.
    

    Um das Maximalkapital zu bestimmen, muss man sich den Maximalwert separat merken, denn das eigentliche Kapital schwankt ja permanent. Nach jeder Änderung Erhöhung des Kapitals vergleicht man nun den neuen Wert mit dem bisherigen Maximalkapital und passt dies ggf. an, etwa so

    if (Kapital1 > maxKapital1) maxKapital1 = Kapital1;
    

    Dies geschieht unanhängig von Arrays. Also bei vielen Spielern könntest du den Code verbessern mit Arrays, aber bei nur 3 Spielern geht es grad noch so. Deshalb meinte mein Vorposter, einfach nochmal 3 int Variablen für das maximale Kapital einführen.


  • Mod

    Jetzt schaut es so aus, als würde mit Schleifen alles länger und umständlicher werden als ohne.



  • SeppJ schrieb:

    Jetzt schaut es so aus, als würde mit Schleifen alles länger und umständlicher werden als ohne.

    Ich bin stehts daran interessiert auch meine eigenen Kenntnisse zu verbessern, nehme damit also auch gerne Verbesserungsvorschläge entgegen.

    Mein Ziel war es zu zeigen, wie man die Einzelteile in for-loops umschreiben kann, weiter nichts.

    Mehr Zeilen werden es nicht, ich habe es gerade von Hand ausprobiert. Im ersten Moment ist es umständlicher, aber wenn dann doch 5 Leute spielen sollen, ist man ganz froh denn man muss nur eine einzige Zeile ändern:

    constexpr size_t Spielerzahl = 3;
    

    Optimalerweise würde man wohl ein class/struct Spieler erstellen, und dann nur ein einziges array solcher Spieler haben.

    In diesem ganz konkreten Fall bin ich auch der Meinung, dieses schöne Programm in der Form zu behalten und einfach die MaxKapitalX Variablen hinzuzufügen. Und da muss man echt sagen so sauberen Beginner Code sieht man selten.

    P.S.: Den Zufallsgenerator Seed kann man sich auch so besorgen:

    random_device rd;
    mt19937 rnd_gen(rd());
    

Log in to reply