Gibts das in schön???



  • Gibts eine möglichkeit das schöner zu gestalten??
    Wäre nett wenn jmd einen tipp für mich hätte.

    if (!in_use || !wearable_)
     {
      if(atk_ || ac_ || dmg_)
      {
        int counter =0;
        if (atk_)....
          counter++;      
        if (ac_) ...
          counter++;
        if (dmg_) ...
          counter++;      
        if (counter == 1) .... 
        if (counter == 2) ....  
        if (counter == 3)....
      }
    

    Ich danke euch gleich mal im voraus, damit ichs später nicht mehr machen muss 😉



  • Was steht in den Auslassungszeichen? Ich meine jetzt nicht konkret, aber es wäre noch nützlich zu wissen, wo gleiche Anweisungen vorkommen.

    Poste am besten ein komplettes Beispiel (z.B. eine Funktion), das aber trotzdem keine irrelevanten Details beinhaltet.



  • if (!in_use || !wearable_)
    {
      int counter = !!atk+!!ac+!!dmg;
      if (counter == 1) .... 
      if (counter == 2) ....  
      if (counter == 3)....
    }
    

    uU statt den ifs noch

    state_map[counter]();
    

    also eine map die funktionszeiger beinhaltet



  • hab mir den code nochmal angeschaut und, das ist eigentlich das was ich brauche

    if (!in_use || !wearable_)
     {
      if(atk_ || ac_ || dmg_)
      {
        if (atk_)
          cout << "du hast um" << atk "atk erhöht" << endl;
        if (atk_ && ac_)
          cout << "du hast" << atk "mehr atk und" << ac_ << "mehr ac" << endl;      
        if (atk_ && ac_ && dmg_)
          cout << "du hast" << atk << "atk," << ac_ << "ac und" << dmg_ << "dmg mehr." << endl;
        if (ac_)
          cout << "du hast" << ac_ << "mehr ac" << endl;
        if (ac_ && dmg_)
          cout << "du hast" << ac_ << "mehr ac und" << dmg_ << "mehr dmg" << endl;  
        if (dmg_)
          cout << "du hast" << dmg_ << "mehr dmg" << endl;  
        if (dmg_ && atk_)
          cout << "du hast" << dmg_ "mehr dmg und" << ac_ << "mehr" << endl;
      }          
     }
    

    und das in allen möglichen varianten. ich hoffe ihr versteht was ich meine



  • !in_use || !wearable_ ist nach dem DeMorgan !(in_use && wearable_)

    Also
    !(in_use && wearable_) && (atk_ || ac_ || dmg_)
    Die beiden äußersten If's zusammenfassen



  • Müssen es Vollständige Sätze ( das mit dem "und") sein oder reicht aus:
    "Du hast +15 Atk +7 AC +5 DMG erhalten.
    Könnte sein:

    cout << "Du hast ";
    if(atk_)
    cout << "  +" << atk << " Atk  ";
    if(ac_)
    cout << "  +" << ac<< " AC  ";
    if(dmg_)
    cout << "  +" << dmg<< " DMG  ";
    cout << "erhalten" << endl;
    

    Sonst musst du noch ein paar abfragen wegen "," machen.



  • Für schöne Sätze braucht es etwas mehr Code. Hier eine erweiterbare Lösung:

    void OutputAttributes(unsigned int atk, unsigned int ac, unsigned int dmg) 
    { 
    	std::vector< std::pair<const char*, unsigned int> > attributes; 
    
        if (atk > 0)    attributes.push_back(std::make_pair("atk", atk)); 
        if (ac > 0)     attributes.push_back(std::make_pair("ac", ac)); 
        if (dmg > 0)    attributes.push_back(std::make_pair("dmg", dmg)); 
    
        if (attributes.empty())    return; 
    
        std::cout << "Du hast "; 
    
        for (unsigned int i = 0; i != attributes.size(); ++i) 
        {   
    	    if (i != 0)
    	    {    
    		    if (i == attributes.size()-1)    std::cout << " und ";
    		    else                             std::cout << ", ";
            }
    
            std::cout << attributes[i].second << " " << attributes[i].first; 
        } 
    
        std::cout << " mehr." << std::endl; 
    }
    

    (Anmerkung: Ich bin sonst nicht so ein Fan von diesen Einzeiler-Ifs, aber die dürften es hier etwas klarer machen)

    Edits: Besseren Container genommen, Formatierung, auf Indizes umgestiegen, [i]-Formatbug gefixt 😃



  • Thx an alle werd die methode von Nexus mal versuchen.
    Ich werde das Ergebnis, falls erfolgreich, dann Posten.


Log in to reply