Switch



  • Hey.
    Immer wenn ich "z" schreibe oder "default" spinnt es Programm komplett,
    aber bei 1 & 2 klappt es. Hier der Code :

    switch (auswahl){
                case 'a': clrscr();
                          cout << "Wie viele Punkte wollen sie auf Angriff setzten?\n";
                          cout << "Ihr Wahl: ";
                          cin >> punkteang;
                          punkte=punkte-punkteang;
    
                               if(punkte < 0){
                                    punkte=punkte+punkteang;
                                    cout << "So viele Punkte haben sie nicht";
                                    getch();
                                    clrscr();
                               }
                               else{
                                    ang=punkteang;
                                    skills[0]=ang;
                                    cout << "Es wurden " << ang << " Punkte auf Angriff gesetzt";
                                    getch();
                                    clrscr();
                               }
    
                          break;
                case 'v': clrscr();
                          cout << "Wie viele Punkte wollen sie auf Verteidigung setzten?\n";
                          cout << "Ihr Wahl: ";
                          cin >> punktever;
                          punkte=punkte-punktever;
    
                               if(punkte < 0){
                                    punkte=punkte+punktever;
                                    cout << "So viele Punkte haben sie nicht\n";
                                    getch();
                                    clrscr();
                               }
                               else{
                                    ver=punktever;
                                    skills[1]=ver;
                                    cout << "Es wurden " << ver << " Punkte auf Verteidigung gesetzt";
                                    getch();
                                    clrscr();
                               }
                          break;
                case 'z': break;
    
                default : clrscr();
                          cout << "Diese Auswahl gibt es nicht!";
                          getch();
         }
    
    }while (auswahl != 'z');
    

    Gruß



  • Hier ist kein Fehler drin. Hast du auch weiter oben ein cin >> auswahl; ?



  • Ja hier ist mal die komplette Funktion.
    (ich weiß die FUnktion ist etwas komisch, aber ich besser die noch aus) 😃

    int monstereins(int skills[2], int lebenexplevel[3]){
    int leben=300, schaden=0, schadenmonster=0, schadenmitver=0, exp=0;
    float schadenm=0;
    bool kampf;
    char auswahl;
    
        do{
        clrscr();
        cout << "Monster Level 1\n\n";
        cout << "Monster " << leben << " Leben\n";
        cout << "Ich " << lebenexplevel[0] << " Leben\n\n";
        cout << "a -> Angriff\n";
        cout << "f -> Fliehen\n";
        cout << "Ihr Auswahl: ";
        cin >> auswahl;
    
            if (auswahl=='a'){
               schaden=rand() % 11 + skills[1];
               leben=leben-schaden;
               cout << "\nDu hast soviel Schaden gemacht ->         " << schaden;
    
               schadenm=0.5*skills[1];
               schadenm=100-schadenm;
               schadenm=schadenm/100;
               schadenmitver=30*schadenm;
    
               schadenmonster=rand() % 11 + schadenmitver;
               lebenexplevel[0]=lebenexplevel[0]-schadenmonster;
    
                   if(lebenexplevel[0]<1){
                        clrscr();
                        cout << "Das Monster hat dich besiegt";
                        lebenexplevel[0]=0;
                        getch();
                        return 0;
                   }
                   else{
                        cout << "\nDas Monster hat soviel Schaden gemacht -> " << schadenmonster;
                        getch();
                   }
            }
    
        }while(0 < leben);
    
        if (1 > leben){
              clrscr();
              cout << "Sie haben das Monster besiegt!";
              exp=exp+400;
              getch();
        }
        else {
        }
    
        clrscr();
        while (1 < exp){
              lebenexplevel[1]++;
              exp=exp-50;
              cout << "Level up! -> Level " << lebenexplevel[1] << "\n";
        }
        getch();
        return lebenexplevel[3];
    }
    


  • BTW: Falsches Forum, das gehört ins C++ Forum.



  • Newbie23 schrieb:

    Ja hier ist mal die komplette Funktion.

    Das ist jetzt eine andere Funktion, wo das Wie viele Punkte wollen sie auf Angriff setzten? z.B. gar nicht mehr vorkommt.
    Denk auch mal drüber nach, deine Variablennamen mit Unterstrich zu_trennen und mehrere aussagekräftig benannte ints statt eines Arrays zu übergeben, das erhöht die Lesbarkeit wesentlich.

    theta schrieb:

    BTW: Falsches Forum, das gehört ins C++ Forum.

    Stimmt, CLI ist so eine murksige Microsoft-Erweiterung von C++.



  • philipp2100 schrieb:

    Newbie23 schrieb:

    Ja hier ist mal die komplette Funktion.

    Das ist jetzt eine andere Funktion, wo das Wie viele Punkte wollen sie auf Angriff setzten? z.B. gar nicht mehr vorkommt.
    Denk auch mal drüber nach, deine Variablennamen mit Unterstrich zu_trennen und mehrere aussagekräftig benannte ints statt eines Arrays zu übergeben, das erhöht die Lesbarkeit wesentlich.

    theta schrieb:

    BTW: Falsches Forum, das gehört ins C++ Forum.

    Stimmt, CLI ist so eine murksige Microsoft-Erweiterung von C++.

    Keine Erweiterung, eine eigene Sprache.



  • Okey sry falsches Forum..
    Aber trodzem eine Frage. Ich setzte zum Beispiel soetwas immer in eine Funktion ist das sinnvoll oder sollte ich den Code in die Main Funktion setzten?
    Denn im Grunde habe ich so nur mehr Arbeit.



  • Mehrere Funktionen. Da wo du es klar abgrenzen kannst und ein bisschen Code zusammenkommt, immer eine neue Funktion anlegen, von der du dir merken (oder aufschreiben) kannst, was sie tut. Sonst wird irgendwann eine Funktion zu groß, du verlierst den Überblick und die Kompilierzeiten steigen.

    Evtl. könnte man in deinem Fall auch eine Funktion schreiben, die alle Monster abdeckt, und das jeweilige Monster auch noch als Parameter mitkriegt, also etwa so:

    int fight_monster(int monster, int skill_att, int skill_def, int health);
    
    int main() {
        int health = 100;
        for (int i = 0; i < 5; ++i) {
            health = fight_monster(i, 3, 5, health);
        }
    }
    

    Zusätzlich könntest du das ganze dann noch in Klassen kapseln, zum Beispiel u.A. eine Klasse Monster, in der du die Eigenschaften der Monster kapselst:

    class Player {
      public:  // später besser private machen
        std::string name;
        int strength_att;
        int strength_def;
        int health;
      public:
        Player(std::string name, int skill_att, int health, int skill_def) : name(name), health(health), skill_att(skill_att), skill_def(skill_def) { }
        void remove_health(int hp) { health = health > hp ? health - hp : 0; }
        void attack(Monster& monster) const {
            int hp = rand() % 20 * skill_att / monster.strength_def:
            monster.remove_health(hp);
            std::cout << name << " attacked monster " << monster.name << " and removed " << hp << " health points." << std::endl;
        }
    };
    
    class Monster {
      public:  // später besser private machen
        std::string name;
        int strength_att;
        int strength_def;
        int health;
      public:
        Monster(std::string name, int health, int strength_att, int strength_def) : name(name), health(health), strength_att(strength_att), strength_def(strength_def) { }
        void remove_health(int hp) { health = health > hp ? health - hp : 0; }
        void attack(Player& player) const {
            int hp = rand() % 20 * strength_att / player.skill_def:
            player.remove_health(hp);
            std::cout << "Monster " << name << " attacked " << player.name << " and removed " << hp << " health points." << std::endl;
        }
    };
    
    int main() {
        Player me("Player 1", 100, 5, 4);
        Monster monster("Angela", 50, 4, 3);
    
        while ( me.health > 0 && monster.health > 0 ) {
            me.attack(monster);
            monster.attack(me);
        }
        if ( me.health > 0 ) { std::cout << me.name << " wins." << std::endl; }
        if ( monster.health > 0 ) { std::cout << monster.name << " wins." << std::endl; }
    }
    

    Jetzt wo alles schön gekapselt ist, könntest du ansetzen und die Attribute noch private machen und getter-Funktionen schreiben um sie zu benutzen.
    Auch kann man ja deutliche Gemeinsamkeiten zwischen beiden Klassen feststellen, die man in eine gemeinsame Oberklasse auslagern kann, von der beide abgeleitet werden.
    edit: Hab noch const-Correktness hinzugefügt. Die beiden const Schlüsselwörter zeigen an dieser Stelle an, dass die jeweilige Funktion das Objekt selbst nicht verändert (es wird ja das andere Objekt verändert, also Monster verändert Player aber nicht Monster selbst).
    edit: Okay, das beide gewinnen war natürlich Quatsch.



  • Danke phillipp für die Antwort. Nur mein Problem ist dabei ich bin gerade mit den Arrays angefangen.. . Also war ich bei dein Klassen noch nicht. Und von daher verstehe ich da wenig von. 😃
    Aber ich habe das nochmal überarbeitet (die Variablen namen etc.),
    und jedzt geht es :p
    Aber trodzdem danke für die Arbeit. Ich werde es mir zurück legen und wenn ich dann bei den Klassen angekommen bin schaue ich es mir nochmal an ^^



  • Newbie23 schrieb:

    Aber trodzdem danke für die Arbeit. Ich werde es mir zurück legen und wenn ich dann bei den Klassen angekommen bin schaue ich es mir nochmal an ^^

    Kein Problem. Viel Spaß!

    Hier sehe ich aber noch einen Fehler:

    Newbie23 schrieb:

    }while(0 < leben);
    
        if (1 > leben){
              clrscr();
              cout << "Sie haben das Monster besiegt!";
              exp=exp+400;
              getch();
        }
        else {
        }
    

    Die Schleife läuft so lange bis leben <= 0 (edit: <=, nicht >) ist. Daher brauch man die if-Abfrage nicht, da immer leben < 1 gilt (edit). Von daher frage ich mich, ob das so beabsichtigt war.
    Außerdem würde ich mir die konsistente Schreibweise angewöhnen, immer zuerst den Variablennamen und dann die Konstante hinzuschreiben, mit der du vergleichst, also leben > 1 statt 1 < leben , wieder zugunsten der Lesbarkeit.


Log in to reply