Hilfe bei der Problemfindung [Anfänger]



  • Hallo,

    ich bin dabei C++ zu lernen. Um meine jetzigen Kenntnisse zu festigen habe ich begonnen ein kleines Projekt zu Programmieren(Als Zusatz zu den Aufgaben aus den Büchern und Videotrainings etc.)
    Nur leider habe ich jetzt ein Problem(keinen Fehler).
    Ich Programmiere ein kleines Konsolen RPG und habe für den ersten Step im Spiel ein Training erstellt. Das Target hat 100LP und bekommt pro Angriff 20LP abgezogen. Das funktioniert auch alles. Jetzt möchte ich das wenn die LP 0 erreicht haben eine Nachricht kommt mit:"Glückwunsch du hast das Ziel besiegt".
    Aber immer wenn die LP 0 erreicht haben, dann kann man noch einmal angreifen und die LP auf -20 setzen. Ich weiß einfach nicht wie ich das verhindern kann...
    Hier ist mal der Code:

    void training1()
    {
        int hit = 20;
        int targetLife;
        char eingabe;
    
        if( targetLife != 0 )
        {
            for( targetLife = 100; targetLife >= 0; targetLife - 20 )
            {
                cout << "Um das Ziel anzugreifen, gebe A für Angriff ein: ";
                cin >> eingabe;
                if( eingabe == 'A' )
                {
                    targetLife = targetLife - hit;
                    cout << "Treffer! Das Ziel verliert 20LP" << endl;
                    cout << "Das Ziel hat noch " << targetLife << " Lebenspunkte!" << endl;
                }
                else
                {
                    while( eingabe != 'A' )
                    {
                        cout << "Diesen Befehl gibt es nicht!" << endl;
                        cout << "Um das Ziel anzugreifen, gebe A für Angriff ein: " << endl;
                        cin >> eingabe;
                        if( eingabe == 'A' )
                        {
                            targetLife = targetLife - hit;
                            cout << "Treffer! Das Ziel verliert 20LP" << endl;
                            cout << "Das Ziel hat noch " << targetLife << " Lebenspunkte!" << endl;
                        }
                    }
                }
            }
        }
        else
        {
            cout << "Super, du hast das Ziel besiegt!" << endl;
        }
    }
    

    Bestimmt überseh ich grade irgendwas, was eigt. sofort ins Auge springt..^^
    Ich hoffe ihr könnt mir helfen 🙂

    Grüße,

    eXoTheNext



  • Ändere

    for( targetLife = 100; targetLife >= 0; targetLife - 20 )
    

    in

    for( targetLife = 100; targetLife != 0; targetLife - 20 )
    

    edit: Sorry Logikfehler lol.



  • Scorcher24 schrieb:

    Ändere

    for( targetLife = 100; targetLife >= 0; targetLife - 20 )
    

    in

    for( targetLife = 100; targetLife == 0; targetLife - 20 )
    

    Wenn ich das mache dann Startet das Training garnicht erst. Es kommen erst die Texte, dann sollte das Training starten, aber bei weiteren klicken schließt die Konsole...

    Edit: Du warst schneller^^



  • Ja, siehe mein Edit. Ist mir eh schon peinlich :p.
    Kommt davon wenn man so im vorbeigehen antwortet..
    👎



  • Les auch mal das hier:
    http://www.c-plusplus.net/forum/39326



  • Danke, jetzt geht er nicht mehr in den minus bereich.
    Doch erscheint die Nachricht das das Ziel besiegt ist immer noch nicht-
    Ist es verkehrt das mit else zu machen?



  • Ganz übersehen.
    Ja, ist so verkehrt, weil die Bedingung des if-blocks nur am anfang einmal geprüft wird, wenn die Funktion aufgerufen wird. Setz das einfach nach der for-schleife hin.

    void training1()
    {
        int hit = 20;
        int targetLife;
        char eingabe;
    
        if( targetLife != 0 )
        {
            for( targetLife = 100; targetLife != 0; targetLife - 20 )
            {
                cout << "Um das Ziel anzugreifen, gebe A für Angriff ein: ";
                cin >> eingabe;
                if( eingabe == 'A' )
                {
                    targetLife = targetLife - hit;
                    cout << "Treffer! Das Ziel verliert 20LP" << endl;
                    cout << "Das Ziel hat noch " << targetLife << " Lebenspunkte!" << endl;
                }
                else
                {
                    while( eingabe != 'A' )
                    {
                        cout << "Diesen Befehl gibt es nicht!" << endl;
                        cout << "Um das Ziel anzugreifen, gebe A für Angriff ein: " << endl;
                        cin >> eingabe;
                        if( eingabe == 'A' )
                        {
                            targetLife = targetLife - hit;
                            cout << "Treffer! Das Ziel verliert 20LP" << endl;
                            cout << "Das Ziel hat noch " << targetLife << " Lebenspunkte!" << endl;
                        }
                    }
                }
            }
    		cout << "Super, du hast das Ziel besiegt!" << endl;
        }
    }
    


  • Wieso angreifen? Der Gegner verläuft sich eh im Klammerwald...



  • Scorcher24 schrieb:

    if-schleife

    🙄



  • Scorcher24 schrieb:

    Ganz übersehen.
    Ja, ist so verkehrt, weil die Bedingung der if-Abfrage nur am anfang einmal geprüft wird, wenn die Funktion aufgerufen wird. Setz das einfach nach der for-schleife hin.

    void training1()
    {
        int hit = 20;
        int targetLife;
        char eingabe;
    
        if( targetLife != 0 )
        {
            for( targetLife = 100; targetLife != 0; targetLife - 20 )
            {
                cout << "Um das Ziel anzugreifen, gebe A für Angriff ein: ";
                cin >> eingabe;
                if( eingabe == 'A' )
                {
                    targetLife = targetLife - hit;
                    cout << "Treffer! Das Ziel verliert 20LP" << endl;
                    cout << "Das Ziel hat noch " << targetLife << " Lebenspunkte!" << endl;
                }
                else
                {
                    while( eingabe != 'A' )
                    {
                        cout << "Diesen Befehl gibt es nicht!" << endl;
                        cout << "Um das Ziel anzugreifen, gebe A für Angriff ein: " << endl;
                        cin >> eingabe;
                        if( eingabe == 'A' )
                        {
                            targetLife = targetLife - hit;
                            cout << "Treffer! Das Ziel verliert 20LP" << endl;
                            cout << "Das Ziel hat noch " << targetLife << " Lebenspunkte!" << endl;
                        }
                    }
                }
            }
    		cout << "Super, du hast das Ziel besiegt!" << endl;
        }
    }
    

    Danke jetzt klappts 😉



  • Hab dir hier das ganze mal ein wenig aufgepeppt :D.
    Ja, mir war grade langweilig. Geht bestimmt noch besser, aber vllt hilfts ja irgendwie beim lernen...

    #include <iostream>
    #include <string>
    using namespace std;
    
    class WeaponBase
    {
    public:
    	WeaponBase( unsigned int attk, const string& name )
    		: m_attack(attk), m_name(name)
    	{}
    
    	unsigned int getAttack() const { return m_attack; }
    	const string& getName() const { return m_name; }
    
    protected:	
    	string m_name;
    	unsigned int m_attack;
    };
    
    class Enemy
    {
    public:
    	Enemy( unsigned int health, const string& name, WeaponBase w ) 
    	   : m_health(health), m_name(name), m_weapon(w)
    	{}
    
    	unsigned int getHealth() const { return m_health; }
    	const string& getName() const { return m_name;  }
    	const WeaponBase& getWeapon() const { return m_weapon; }
    
    	void takeDamage( Enemy& e )
    	{
    		m_health -= e.getWeapon().getAttack();
    	}
    
    	void changeWeapon(WeaponBase w )
    	{
    		m_weapon = w;
    	}
    
    	void changeName( const string& name )
    	{
    		m_name = name;
    	}
    
    protected:
       WeaponBase m_weapon;
       unsigned int m_health;
       string m_name;
    };
    
    class Player : public Enemy
    {
    public:
    	Player(const string& name) 
    		: Enemy(100, name, WeaponBase(20, "Holzschwert") )
    	{}
    };
    
    bool combat(Player& p, Enemy& e)
    {
    	char input = 0;
    
    	cout << "----------------------------------------" << endl;
    	cout << "\tEin Kampf!" << endl;
    	cout << "\t" << p.getName() << " vs. " << e.getName() << endl;
    	cout << "----------------------------------------" << endl;
    
    	while ( e.getHealth() != 0 && p.getHealth() != 0 )
    	{
    		cout << "a) Angreifen" << endl;
    		cout << "f) Fliehen" << endl;
    		cin  >> input;
    		if ( input == 'a' )
    		{
    			e.takeDamage( p );
    			if ( e.getHealth() != 0 ){				
    				cout << "Treffer! " << e.getName() << " hat noch " << e.getHealth()  << " Leben" << endl;
    			}
    
    			p.takeDamage( e );
    			if ( p.getHealth() != 0 ){
    				cout << "Treffer! " << p.getName() << ", sie haben noch " << p.getHealth()  << " Leben" << endl;
    			}			
    		}
    		if ( input == 'f' )
    		{
    			cout << p.getName() << ", sie konnten entkommen." << endl;
    			p.changeName( p.getName() + string( " der Angsthase" ) );
    			break;
    		}
    	}
    	if ( e.getHealth() == 0 ){
    		cout << e.getName()  << " wurde besiegt!" << endl;
    		return true;
    	}
    	if ( p.getHealth() == 0 ){
    		cout << "Sie wurden besiegt!" << endl;
    		return false;
    	}
    }
    
    int main()
    {
    	char input = 0;
    	string name;
    
    	cout << "Ihr Name: "; 
    	cin  >> name;
    	Player player(name);
    
    	while ( input != 'q' )
    	{
    		cout << player.getName() << ", bitte w\x84 \bhlen sie eine Aktion: " << endl;
    		cout << "t) Training" << endl;
    		cout << "q) Beenden" << endl;
    		cin  >> input;
    
    		switch( input )
    		{
    			case 't':
    			{
    				Enemy e( 100, "Trainingspuppe", WeaponBase(1, "Faust") );
    				combat(player, e);
    				break;
    			}
    			default:
    				break;			
    		}
    	}
    }
    


  • OOP habe ich mir noch nicht angeschaut, das kommt erst noch 😉
    Sobald ich mich auch damit beschäftige werde ich deinen Code mal genauer angucken, hilft mir bestimmt 🙂
    Danke



  • Ok, dann will ich euch meinen Murks auch ned vorenthalten:

    #include <string>
    #include <iostream>
    
    class character_t {
    
        friend std::ostream & operator<<(std::ostream&, const character_t&);
    
        private:
            const std::string name;
            const unsigned int initial_power;
            unsigned int current_power;
    
        public:
            character_t( const std::string &name, unsigned int power )
                : name(name), initial_power(power), current_power(power)
            {
            }
    
            operator bool( ) const
            {
                return current_power > 0;
            }
    
            std::string get_name()
            {
                return name;
            }
    
            void attack( character_t &victim )
            {
                victim.current_power -= 2;
            }
    };
    
    std::ostream & operator<<(std::ostream &os, const character_t &character)
    {
        os << character.name << " " << character.current_power << " / " << character.initial_power;
        return os;
    }
    
    int main()
    {
        character_t player( "Spieler", 10 );
        character_t enemy( "Monsti", 10 );
    
        char choice = 0;
        do {
    
            std::cin >> choice;
            if( std::tolower( choice ) == 'a') {
    
                player.attack( enemy );
            }
    
            std::cout << player << " - vs - " << enemy << "\n" << std::endl;
    
        } while( player && enemy );
    
        std::cout << ( player ? player.get_name() : enemy.get_name() ) << " hat gewonnen!\n\n" << std::endl;
    }
    

    Wer g'winnt is zumindest klar 😉


Anmelden zum Antworten