Objekt-(des)Orientierung



  • Hallo,

    Ich denke, ich bin schlicht zu dämlich das System der OOP zu verstehen:

    Ich habe eine Klasse 'Karten' erstellt, welche die Memberfunktionen DeckErstellen() und mischen() kennt. In der Hauptfunktion wird dann ein Objekt der Klasse Karten erstellt, dieses ruft DeckErstellen() auf und dieses nun erstellte Deck soll mit mischen() gemischt werden:

    class cards
    {      
            //mach etwas 
    	bool createDeck();
    	bool shuffle(cards deck[52]);
    
    };
    
    bool cards::createDeck()
    {
       //Erstelle für jede Karte ein Objekt
    
       cards deck [52] =
       {
          //fülle das array mit den karten in sortierter reihenfolge
       };
    
    }
    
    bool cards::shuffle(cards deck[52])
    {
    
        vector <cards> shuffledDeck;
    
        shuffledDeck.push_back(deck[1]); //Befülle das gemischtedeck mit den Karten //aus Deck (aus Gründen der einfachheit hier noch immer sortiert)
    
    }
    
    int main()
    {
    
        cards gamedeck;
        gamedeck.createDeck();
        gamedeck.shuffle(deck);
    
    }
    

    Natürlich funktioniert das nicht, weil in diesem Bereich das Array 'deck' nicht bekannt ist. ich kann aber auch schlecht das gamedeck als paramter übergeben.
    Die Funktionen mischen und erstellen möchte ich auch nicht zusammenfassen.

    Wo also lässt sich eine Verbesserung einbringen?



  • Zu einem Objekt gehört normalerweise auch sinnvolle Daten, auf welchen die Funktionen der Klasse operieren. Mach also deck zu einer Member der Klasse cards .

    Dann geht natürlich die Initialisierung nicht mehr so einfach, aber da kannst du einfach ne Schleife oder so benutzen.



  • Die Klasse cards macht hier nicht viel Sinn, du versuchst damit die Funktion eines namespaces nachzubilden.
    Sinnvolle Klassen wären Deck (hat einen Vektor mit Karten, kann sich selbst mischen, etc.) und Karte (hat einen Wert, vielleicht eine Farbe, etc.).


  • Mod

    Der Schlüssel sind Membervariablen. Vorschlag:

    class Card{
      // Modell einer Karte, wie auch immer das aussehen soll. 
    };
    
    class Deck
    {      
    private:
        Card deck[32];
    public:
        Deck();
        bool shuffle();
    
    };
    
    Deck::Deck()
    {
       {
          //fülle das array deck mit den karten in sortierter reihenfolge
       };
    }
    
    bool Deck::shuffle()
    {
       random_shuffle ( deck[0], deck[31] );
    }
    
    int main()
    {
    
        Deck gamedeck;
        gamedeck.shuffle();
    
    }
    


  • Deck::Deck()
    {
       {
          //fülle das array deck mit den karten in sortierter reihenfolge
       };
    }
    

    An dieser Stelle scheitert das ganze. Ein anderer User meinte dass ein Array nur dann auf diese weise initiallisiert werden kann, wenn er angelegt wird. Hier also ist ein

    deck[32] =
    {
    //viele karten
    };
    

    nicht möglich.



  • Füll es in einer Schleife !

    for(int i = 0; i < 32;++i)
    {
    card[i] = // Mach was mit der aktuellen karte
    }
    


  • Das würde funktionieren wenn die Karten gleich bleibend aufsteigende Werte hätten und sich nicht in Farbe und Wert unterscheiden würden.



  • serbud schrieb:

    Das würde funktionieren wenn die Karten gleich bleibend aufsteigende Werte hätten und sich nicht in Farbe und Wert unterscheiden würden.

    Naja, wenn deine Kartenwerte 7-14 und deine Farben 0-3 sind, mach es z.B. so:

    for (int i=0;i<32;i++)deck[i]=Card(7+i/4,i%4);
    

    Wenn deine Werte und Farben enums sind, ist jeweils noch ein static_cast fällig.


Anmelden zum Antworten