Hilfe bei der Problemfindung [Anfänger]



  • 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