Das gute alte Kartenspiel



  • Ich arbeite gerade in der Vorbereitung für meine Klausur an einem Kartenspiel
    Dieses Soll aus 4 Spielern einem Stapel(32 Karten)bestehen man soll den Stapel mischen können, die Karten an die Spieler verteilen sowie deren Handkarten ausgeben lassen können. Folgendes Problem habe ich wie übergebe ich die karte aus meinem Stapel an den Spieler habe bis jetzt folgendes

    Karte Stapel::austeilen() {
    
        for (int i = 0; i < maxKarten; i++) {
            if (i > maxKarten) {
                cout << "Karten ausgeteilt" << endl;
                break;
            }
            currentCard = stapel[i];
            return currentCard;
        }
    }
    
    pieler::aufnehmen() {
        Stapel.austeilen()
        hand = new Karte[8];
        for (int i = 0; i < 8; i++)
            hand[i] = currentCard;
    };
    

    Ich weiß dass das ganze nicht so funktioniert wie ich es vorhabe deshalb bitte ich um Hilfe



  • Warum funktioniert es nicht? Hast du dir den Ablauf mal mit dem Debugger angesehen?



  • Wie stellst du es dir denn vor? Kann ich nämlich anhand des Beispiels leider nicht erkennen, da es einfach nur Quark ist.

    Und 2. Frage: Wobei genau hast du Probleme es zu implementieren?



  • Erstmal haha, netter Versuch.

    Persönlich, nur diese Vorgaben betrachtend, würde ich das evtl. so machen:
    (klar, geht auch alles in main())

    Karte: Der Einfachheit halber mal nen int/char
    
    Stapel:
        karten
        mischen()
        karteZiehen()
    
    Spieler:
        handkarten
        karteAufnehmen()
        handkartenZeigen()
    
    Spiel:
        (die) spieler
        stapel
        kartenAusteilen()
        handkartenAusgeben()
    

    oder so ähnlich. Muss sagen dass die karteZiehen() methode nicht ganz perfekt heißt, ist aber wurscht.

    P.S.: Für fette bonus points machste die Karten ausgabe in diesem Format:

    char(201)char(205)char(187)
    char(186)char(Karte)char(186)
    char(200)char(205)char(188)
    ( oder mit ähnlichen chars, siehe charmap/extended ASCII Codes)
    

    Lass dich überraschen 😉



  • Also ich habe mit das Stückchen code jetzt 5 Minuten lang angesehen. Ich ahne zwar was du vor hast, aber das ganze sieht mir nach einem einzigen großen Logikfehler aus. Von den Inhaltlichen Fehlern will ich nicht erst anfangen.

    Mein Tip: Nimm dir nen Zettel und nen Stift oder ein Whiteboard und mache folgendes:
    1. Spielablauf planen
    2. Die Klassen und Funktionen grob planen und solange dran rum basteln bis klar ist was von wo nach wo gehen soll und wer was machen soll.



  • Ich muss mich bei euch Entschuldigen da ich das gestern alles einfach schnell hier rein kopiert habe obwohl ich etwas verändert hatte...naja ich bin jetzt hier gelandet

    #include "deckOfCards.h"
    
    void deckOfCards::printDeck() const {
        cout << left;
        for (int i = 0; i < CARDS_PER_DECK; i++) {
            cout << setw(19) << deck[i].print();
            if ((i + 1) % 4 == 0)
                cout << endl;
        }
    }
    
    deckOfCards::deckOfCards() {
        string faces[] = {"Sieben", "Acht", "Neun", "Zehn", "Bube", "Dame", "Koenig","Ass"};
        string suits[] = {"Herz", "Karo", "Kreuz", "Pik"};
        deck = new card [CARDS_PER_DECK];
        currentCard = 0;
        for (int i = 0; i < CARDS_PER_DECK; i++)
            deck[i] = card(faces[i % 8], suits[i / 8]);
    }
    
    void deckOfCards::shuffle() {
        currentCard = 0;
        for (int first = 0; first < CARDS_PER_DECK; first++) {
    
            int second = (rand() + time(0)) % CARDS_PER_DECK;
            card temp = deck[first];
            deck[first] = deck[second];
            deck[second] = temp;
        }
    }
    
    card deckOfCards::dealCard(){
        return deck[currentCard++];
    
    }
    
    void Spieler::aufnehmen() {   
        hand=new card[8];
        for (int i = 0; i < 8; i++){
            hand[i]=deckOfCards.dealCard();
    
        }
    }
    

    Die zeile hand[i]=deckOfCards.dealcard gibt mir den Fehler:Expected primary expression before '.'... was ich jetzt nicht ganz verstehe.



  • Du brauchst ein Objekt der Klasse 'deckOfCards', um dessen Klassenfunktion aufzurufen.



  • deckOfCards ist eine Klasse und keine Instanz davon, d.h. irgendwoher musst du einen Kartenstapel bekommen.



  • Ahh logisch macht sinn danke ich probier es mal 😃



  • hand[i]=deck.dealCard();
    

    Das hier funktioniert aber auch nicht obwohl deck ein array aus der klasse deckOfCards ist



  • Lapa1503 schrieb:

    hand[i]=deck.dealCard();
    

    Das hier funktioniert aber auch nicht obwohl deck ein array aus der klasse deckOfCards ist

    Nein, ist es nicht. Es ist nur ein Name, der frei im Raum schwebt. Du benötigst ein Instanz der Klasse deckOfCars.

    BTW, was ist das für ein merkwürdiger Compiler, der als Fehlermeldung "funktioniert nicht " ausgibt?



  • Zeig lieber mal deine Klassen header, lieber mal beim interface anfangen.



  • Lapa1503 schrieb:

    pieler::aufnehmen() {
        Stapel.austeilen()
        hand = new Karte[8];
        for (int i = 0; i < 8; i++)
            hand[i] = currentCard;
    };
    

    Ich weiß dass das ganze nicht so funktioniert wie ich es vorhabe deshalb bitte ich um Hilfe

    du verwirfst den returnwert von Stapel::austeilen().

    dann stellt sich die frage, wie du den rest implementiert hast. normalerweise solltest du eine klasse "bank", "spiel", "spielleiter" oder was auch immer haben, bei der sich die spieler anmelden, und die dann, wenn die karten verteilt werden, Spieler::aufnehmen() aufruft.



  • wie kann ich denn eine Karte mit der Funktion

    card deckOfCards::dealCard(){
        return (deck[currentCard++]);
    }
    

    an meine

    class Spieler{
    private:
        card *hand;
    };
    

    übergeben?



  • ja ich kann jetzt in der funktion Spieler::aufnehmen eine neue instanz des typs deckOfCards erstellen nur diese wird durch den default konstruktor als neues unsortiertes deck initialisiert. wenn ich mir das ausgeben lasse habe ich zwar meine hand nur nicht mit meinen Karten aus dem zuvor gemischten stapel sondern: Herz-Sieben, Herz-Acht, Herz Neun, Herz Zehn, Herz Bube,Herz Dame, Herz Koenig, Herz Ass. Ich weiß warum es nicht geht aber nicht wie ich das Problem löse 😕



  • So habe es jetzt geschafft. Ich hatte vergessen dass der Aufruf spieler.aufnehmen() das Deck erst übernehmen muss. Danke trotzdem für die hilfe

    void Spieler::aufnehmen(deckOfCards deck) {
        for (int i = 0; i < 8; i++){
            hand[i]=deck.dealCard();       
        }
    }
    

    und die main:

    int main(){
        deckOfCards deck;
        card currentCard;
        deck.printDeck();
        deck.shuffle();
        cout<<endl<<endl;
        deck.printDeck();
        deck.shuffle();
        cout<<endl<<endl;
        Spieler spieler1;
        spieler1.aufnehmen(deck);
        spieler1.printSpieler();
    
        system("PAUSE");
    
    }
    


  • Du weißt schon, dass

    void Spieler::aufnehmen(deckOfCards deck)
    

    eine Kopie von dem Deck in deiner main() erhält, oder? In anderen Worten: Das Deck in Main hat immernoch 52 Karten nach dem Austeilen.


Log in to reply