Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Container für Baumstruktur

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] > 2 <
010
19.05.2016, 08:55 Uhr
Noby



Die anfängliche Struktur, zu komplex und wenig effizient:

C++:
struct Zuege
{
       Zug zug; // bildet den Schach-Zug ab.
       int Zugwert; // Rating des Zugs
       Zuege* naechste_Zug_Alternative;
                 // das sollte die Liste mit möglichen Zügen pro Stellung abbilden
       Zuege* vorige_Zug_Alternative; // Teil der Liste mit möglichen Zügen pro Stellung
       Zuege* naechster_Zug; // Zeiger auf die nächsten Zugmöglichkeiten nach dem Zug
       Zuege* voriger_Zug; // Um den Baum von unten nach oben kommen zu kommen,
                                        // also Zeiger auf den vorangegangenen Zug
       int gewandelt_in; // für den Baum, um e7-e8T von e7-e8S unterscheiden zu können.
};


Nach dieser Struktur mit Zeigern in vier Richtungen (horizontal und vertikal) scheint mir keine gute Lösung mehr. Zwar sehr fungibel, konnte damit alles machen, aber überhaupt nicht angemessen zum Problem, da das den Baum nicht 1:1 abbildet, sondern ein Art Gitternetz. Meinen Rekursions-Algo dazu zeige ich erst gar nicht

Die momentane präferierte Struktur:

C++:
class Zuege;

class Zug_Liste
{
      Zuege* naechste_Zug_Alternative;
      Zuege* vorige_Zug_Alternative;
};


class Zuege
{
       Zug zug; // bildet den Schachzug ab
       int Zugwert; // Rating des Zugs
       Zuege* voriger_Zug; // Um den Baum von unten nach oben kommen zu kommen
       Zug_Liste* Start_Liste; // enthält die möglichen Züge des Gegners nach dem Zug
       int gewandelt_in; // wenn Bauer sich auf 8. Reihe in Figur wandelt
};


Die Zugmöglichkeiten nach dem Zug sind in der Zug_Liste. Durch die Liste ergibt sich die Baumstruktur. Mit dem Sprung in die Liste komme ich zu den nächsten Zügen (Baum nach unten), durch voriger_Zug zum vorigen Zug, Baum nach oben (dafür muss ich nicht auf die Liste zugreifen, von unten nach oben geht es direkt von Zug zu Zug, da immer nur eine Möglichkeit). Und meine Zug_liste kann ich durch std::list ersetzen.

Und wieder ein Schritt nach vorne geschafft ...

edit ao: cpp-Tags eingefügt

Dieser Post wurde am 19.05.2016 um 09:18 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
19.05.2016, 09:17 Uhr
ao

(Operator)



Zitat von Noby:
Eigentlich brauche ich noch eine Zeigerstruktur in der class Move, dass ich im Baum von unten nach oben komme.

Das dachte ich mir. Wie wärs mit sowas?

C++:
class Move
{
    std::string move;                //    z.B. "Sg1-f3"
    std::list<Move> nextMoves;        //    alle möglichen folgenden Züge
    int rating;                        //    Bewertung des Zugs
    
    Move * previousMove;            //    Rückverweis auf den Vorgänger
    
public:

    Move (const std::string & move_
        , Move * previousMove_
        ) : move (move_), rating (0)
            , previousMove (previousMove_)
            {}
    
    int Rate ();                    //    Diesen Zug bewerten. Braucht evtl. die Ratings der Folgezüge.
};



Der Pointer previousMove zeigt auf den Vorgänger, der zur Konstruktionszeit bereits bekannt ist.

Beachte noch das hier: Beim Einfügen in die Listen (oder Vektoren, das ist hier dasselbe) werden die Objekte kopiert (das machen die STL-Container so). Das heißt: Wenn es zum Kopieren eines Moves reicht, die einzelnen Member nacheinander zu kopieren (was momentan der Fall ist), dann brauchst du nichts weiter zu tun, denn das erledigen der Default-Copy-Konstruktor und der Default-operator=, die der Compiler für jede Klasse automatisch bereitstellt.

Wenn das nicht reicht und zusätzliche oder andere Dinge getan werden müssen, dann musst du den Copy-Konstruktor und den operator= selber definieren, und in vielen Fällen brauchst du dann auch einen Destruktor, der die Zerstörung eines Move-Objekts übernimmt.

Das ist zum Beispiel der Fall, wenn die Klasse irgendwelche C-Style-Arrays oder selbstgebastelte Pointer-Gebilde enthält, um die kümmern sich die Default-Methoden nämlich nicht. Das ist ein ganz wichtiger Grund, weshalb man sich in C++ so weit wie möglich von Oldschool-C-Datenstrukturen verabschieden sollte: Sie machen mörderisch viel Arbeit,
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
19.05.2016, 09:36 Uhr
Noby



@ao: Danke, prima, das sieht sehr gut aus. Ich versuche das umzusetzen und eine Rekursion hierfür zu basteln. Das wird aber noch dauern.

Für den Anfang sollen die Defaults (constructor, copy, destructor) reichen, da die Member nur nacheinander aufgebaut werden.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: