[gelöst] Benutzung von Strukturen in Schleifen



  • Moin

    Ich bin zur Zeit dabei ein kleines Strategiespiel zu schreiben und hänge jetzt an einer Stelle fest die für das Weiterprogrammieren von großer Wichtigkeit ist.

    Ich frage an diversen Stellen innerhalb des kompletten Codes die Einheitenkürzel der verschiedenen im Spiel möglichen Einheiten ab.

    Das struct "einheitenwerte" ist in einer klasse definiert.

    Das Problem, welches sich mir ergibt is,t dass ich versuchen möchte irgendeine Möglichkeit zu finden mit der ich Einheiten hinzufügen kann ohne das ich alle möglichen Schleifen absuchen muss nur um die Kürzel(und natürlich noch viele andere Statuswerte) der Schleife hinzuzufügen.

    Ich hoffe das ihr eine idee habt wie ich aus dem Codeteil

    while(!(spielfeld[altzeile-1][altspalte-1]==einheit1.kuerzel 
                 || spielfeld[altzeile-1][altspalte-1]==einheit2.kuerzel
                 || spielfeld[altzeile-1][altspalte-1]==einheit3.kuerzel 
                 || spielfeld[altzeile-1][altspalte-1]==einheit4.kuerzel
                 || spielfeld[altzeile-1][altspalte-1]==einheit5.kuerzel
                 )
    

    Soetwas wird

    while("zugriff auf irgendein algorithmus der für alle erstellten einheiten die Kürzel durchsucht)
    

    Ich hoffe ich konnte halbwegs verständlich erklären was gemeint ist.

    mfg Lucky Luke

    PS Falls ihr den Titel nicht treffend findet nennt mir bitte einen der verständlicher ist als der jetztige damit ich ihn abändern kann.

    struct einheitenwerte{
                     char kuerzel;};
           einheitenwerte einheit1;
           einheitenwerte einheit2;
           einheitenwerte einheit3;
           einheitenwerte einheit4;
           einheitenwerte einheit5;
    


  • Kurz gesagt: Du willst Funktionen.

    Hast du ein Buch?



  • Naja wenns mit Funktionen klappt sehr gern.

    Buch: Objektorientiertes Programmiern von Anfang an

    Wie ich mit Funktionen umzugehen habe weiß ich eigentlich, immerhin sind es bei dem Spiel bereits 1100 Zeilen die fehlerfrei funktionieren, aber es ist zu umständlich Alles von anhand zu ändern und deswegen will ich jetzt so ziemlich alles "automatisieren" 🙂



  • Hi,

    ich hoffe noch ist Zeit:
    Pack die einheitenwerte in einen vector! Das Problem wirst du sonst noch andauernd bekommen!



  • Also bissl Plan habe ich von C++, aber wie funktioniert das mit dem vector.

    Zur zusätzlichen Erklärung möchte ich noch darauf hinweisen das innerhalb des struct für viele verschieden Einheiten die Eerte gespeichert sind. Ich hoffe das geht mit einem vector trotzdem.

    struct einheitenwerte{
                         char kuerzel;
                         int kampfkraftf;
                         int kampfkraftn;
                         int staerke;
                         int verteidigung;
                         int lebenspunkte;
                         int attacken;
                         int reichweite;
                         int mut;
                         int angweite;
                         int punktewert;};
    


  • Mmh, vector Erklärungen findet sich im Netz sicherlich massenhaft.
    Die solltest du lesen, da kommst du früher oder später eh nicht drum herum.

    Nur kurz skizziert:

    //Statt deiner Variablen
      einheitenwerte einheit1;
      einheitenwerte einheit2;
      einheitenwerte einheit3;
      einheitenwerte einheit4;
      einheitenwerte einheit5;
    // hat du einen
      vector<einheitenwerte> einheiten;
    // in dem alle Einheiten gespeichert werden.
    // Um später dann so Sachen wie 'kurzel vorhanden?' abzufragen, machst du dann sowas:
    
    for(int i=0; i < einheiten.size(); ++i)
    {
      if(einheiten[i].kuerzel == 'X') // oder sowas
    // mach was
    }
    

    Edit:
    Info's gibt's zB hier im Magazin.



  • Danke, scheint verständlich.

    Also kann ich dann innerhalb der whileschleife eine for-schleife durchlaufen lassen und wenn eine Kürzelübereinstimmung mit dem eingegeben Wert zutrifft wird das erkannt und die Schleife läuft weiter? (habe ich das so richtig verstanden?)

    mfg Lucky Luke

    Edit Also das wichtige an der Sache ist, dass ich das als Überprüfung der Bedingung der whileschleife brauche.



  • Nein, was für eine while-Schleife?
    Du wirst dir am besten eine Funktion bauen:

    bool DeineKlasse::ExistiertKuerzel(char kuerzel)
    {
      for(int i=0; i < einheiten.size(); ++i)
      {
        if(einheiten[i].kuerzel == kuerzel)
          return true;   
      } 
      return false;
    }
    

    Ach so, ich sehe gerade:

    while("zugriff auf irgendein algorithmus der für alle erstellten einheiten die Kürzel durchsucht)

    Das meinst du, oder?
    Ja, das wird dann zu

    while(instanz.ExistiertKuerzel('x')...)
    


  • Genau, das letztere meine ich.

    Aber wie ich anhand des beispiels sehe scheine ich dann dennoch alle kürzel eingeben zu müssen.

    while(instanz.ExistiertKuerzel('x')...
               instanz.ExistiertKuerzel('b')...)//das ich also hier den nächsten buchstaben abfrage??
    

    Falls dies der fall ist bin ich ja wieder beim Ausgangsproblem das ich nicht bei jeder Schleife die kürzel hinzufügen möchte.

    mfg Lucky Luke



  • Wo kommen denn diese Kürzel her, die du mit den Kürzel der Einheiten vergleichen willst?



  • Diese kommen von einer vorrangegangen Abfrage.

    cout << "Spalte:"<<endl;
                         cin >> altspalte;                                        
                         cout << "Zeile:"<<endl;
                         cin >> altzeile;
    

    Um die Sache vllt etwas genauer zu erklären. Am anfang wird eine array erstellt und darüber ein Feld in der dos ausgabe realisiert. Anschließend werden die benutzten Einheiten auf das Feld gesetzt. Wenn ich diese bewegen möchte so wird die Zeile und Spalte abgefragt und dann soll überprüft werden ob der Buchstabe auf dem Feld mit einem einheitenkürzel der möglichen Einheiten von Player 1 übereinstimmt.

    Da ich später weitere Einheiten implementieren möchte wäre es ein Riesenaufwand jedes mal alle Schleifen zu verändern, sodass ich das eben anders lösen möchte.

    Ich hoffe dir ist die Funktionsweise jetzt vllt etwas klarer.



  • Lucky Luke schrieb:

    Ich hoffe dir ist die Funktionsweise jetzt vllt etwas klarer.

    Nö.
    Das sieht doch immer noch so aus wie am Anfang:

    while(!(spielfeld[altzeile-1][altspalte-1]==einheit1.kuerzel
                 || spielfeld[altzeile-1][altspalte-1]==einheit2.kuerzel
                 || spielfeld[altzeile-1][altspalte-1]==einheit3.kuerzel
                 || spielfeld[altzeile-1][altspalte-1]==einheit4.kuerzel
                 || spielfeld[altzeile-1][altspalte-1]==einheit5.kuerzel
                 )
    

    Um die geht es doch und die kannst du doch durch

    while(! ExistiertKuerzel(spielfeld[altzeile-1][altspalte-1]))...
    

    ersetzen.



  • Jockelx schrieb:

    Um die geht es doch und die kannst du doch durch

    while(! ExistiertKuerzel(spielfeld[altzeile-1][altspalte-1]))...
    

    ersetzen.

    Also würde diese eine Zeile alle vorhanden Kürzel überprüfen und bei einem Treffer die Schleife abbrechen?

    Wenn du jetzt ja antwortest danke ich dir recht herzlich, ansonsten würde ich dir einen ausführlicheren Teil des Codes per pn schicken und alles bis ins kleinste Detail erläutern 🙂



  • Ja, bitte schön 😉
    Aber versuch doch die sehr einfache Funktion 'ExistiertKuerzel' selber zu verstehen!
    Da passiert doch nichts wildes!?



  • Danke für die Hilfe.

    Natürlich werde ich mir nun alles möglich dafür Notwendige aneignen, aber ich mußte ja erstmal von dir erfahren ob deine Überlegung im Endeffekt funktioniert.

    mfg Lucky Luke


Anmelden zum Antworten