Kartenspiel: Karten an Spieler verteilen



  • Hallo Leute, da bin ich wieder.

    Ich stehe nun vor einem neuen Problem. Ich soll ein Kartenspiel programmieren.

    "Programmieren Sie die Grundlage für ein Kartenspiel (als Klasse kartenspiel):
    ● Eine Karte wird repräsentiert durch ihre Spielfarbe/Symbol (Kreuz, Pik, Herz, Karo)
    und einen Wert (Sieben, Acht, Neun, Zehn, Bube, Dame, König, Ass).
    ● Ein Kartenspiel besteht aus einem Stapel von 32 Karten, die vollständig an vier
    Spieler verteilt werden.

    Ich habe nun das Mischen und die Anzeige aller Karten geschafft und überlege gerade wie ich die Karten an alle Spieler vollständig verteilen und danach ausgeben lassen kann.

    "Karten austeilen: Implementieren Sie dafür eine Methode austeilen, welche
    die Karten vollständig an die vier Spieler verteilt. Geben Sie am Ende die
    Kontrollmeldung „Karten verteilt!“ auf dem Bildschirm aus."

    "Karten eines Spielers ansehen: Implementieren Sie dafür ein weiteres Menü,
    mit dessen Hilfe es möglich ist, einen der vier Spieler auszuwählen und dessen
    Karten auf dem Bildschirm anzuzeigen. Die Ausgabe soll nur dann gemacht
    werden, wenn die Karten zuvor verteilt worden sind (also nur, wenn zuletzt
    Menüpunkt 2 und nicht Menüpunkt 1 gewählt wurde)."

    Ich habe mir überlegt, pro Spieler 8 Karten zu verteilen und dann zum nächsten Spieler zu gehen und immer weiter.

    Spieler 1: 1-8, Spieler 2: 9-16...

    Doch wie realisiere ich das am Besten? Pro Spieler ein (zweidimensionales?) Array? Ich weiss echt nicht wie ich weiter verfahren soll. Ich hoffe, ihr könnt mir helfen 🙂

    Das hier ist meine Kartenspiel.cpp

    /* 
     * File:   Kartenspiel.cpp
     * Author: d0zer
     * 
     * Created on 18. Juni 2011, 12:15
     */
    
    #include "Kartenspiel.h"
    using namespace std;
    
    Kartenspiel::Kartenspiel() {
    
        for (int reihe = 0; reihe <= 3; reihe++) //Schleife durch Reihe
        {
            for (int zeile = 0; zeile <= 7; zeile++) //Schleife durch Zeile der jeweiligen Reihe
            {
                Deck[reihe][zeile] = 0; //Setze Slot auf 0
            }
        }
        srand(time(0)); //Zufallsgenerator für die Zahlen
    }
    
    //Methode zum Karten mischen
    void Kartenspiel::mischen() {
    
        int reihe;
        int zeile;
    //Karten mischen
        for (int card = 1; card <= 32; card++) {
            do {
                reihe = rand() % 4;
                zeile = rand() % 8;
            } while (Deck[reihe][zeile] != 0);
            Deck[reihe][zeile] = card;
        } cout << endl << "Karten gemischt!" << endl;
    
      //gemischte Karten ausgeben
    string farbe[4] = {"Herz", "Pik", "Kreuz", "Karo"};
        string wert[8] = {"Sieben", "Acht", "Neun", "Zehn", "Bube", "Dame", "Koenig", "Ass"};
    
        //gemischte Karten ausgeben
        for (int card = 1; card <= 32; card++) {
            for (int reihe = 0; reihe <= 3; reihe++) {
                for (int zeile = 0; zeile <= 7; zeile++) {
                    if (Deck[reihe][zeile] == card) {
                        cout << setw(5) << right << wert[zeile] << " von " << setw(8) << left << farbe[reihe] << ( card % 2 == 0 ? '\n' : '\t' );
                    }
                }
            }
        }
    }
    
    Kartenspiel::~Kartenspiel() {
    }
    

    Das hier ist meine Header Datei dazu:

    /* 
     * File:   Kartenspiel.h
     * Author: d0zer
     *
     * Created on 18. Juni 2011, 12:15
     */
    
    #ifndef KARTENSPIEL_H
    #define	KARTENSPIEL_H
    
    #include <iostream>
    #include <cstdlib>
    #include <ctime>
    #include <iomanip>
    using namespace std;
    
    class Kartenspiel {
    public:
        Kartenspiel();
        virtual ~Kartenspiel();
    
        void mischen();
        void austeilen();
    
    private:
        int Deck[4][8];
    };
    
    #endif	/* KARTENSPIEL_H */
    

  • Mod

    Ich würde das an deiner Stelle ganz anders modellieren und ich glaube dein Lehrer möchte das auch:

    ● Eine Karte wird repräsentiert durch ihre Spielfarbe/Symbol (Kreuz, Pik, Herz, Karo)
    und einen Wert (Sieben, Acht, Neun, Zehn, Bube, Dame, König, Ass).

    Du sollst eine Klasse Karte schreiben, die einen dieser Werte annehmen kann.

    ● Ein Kartenspiel besteht aus einem Stapel von 32 Karten,

    Und dann besteht ein Kartenspiel aus einem Container der die obigen Karten fassen kann. Zu Anfang packst du in das Spiel 32 verschiedene Karten.

    die vollständig an vier
    Spieler verteilt werden.

    Und ein Spieler hat dann wiederum einen Container für seine Karten - seine Hand. Zum Verteilen nimmst du eine Karte aus dem Kartenspiel und gibst sie an die Hand des Spielers.

    Ist dir klar, worauf ich hinaus möchte? Ich fürchte ein Beispiel wäre fast schon identisch mit einer Komplettlösung, weswegen ich es ungern bringen möchte.



  • Hey

    Danke erstmal für die Antwort.

    Meinst du diese STL Contaier? Wenn ja, das hatten wir noch gar nicht. Ich denke nicht, dass er das meint.

    In der Aufgabenstellung steht, dass wir ein Kartenspiel in der Klasse "Kartenspiel" programmieren sollen. Und dazu dann die Infos die ich schon gab.

    Momentan weiss ich einfach nicht weiter, wie ich Werte und Farben von den Karten, den 4 Spielern zuordnen und dann ausgeben lassen kann. Ob ich für jeden Spieler 2 Arrays nehmen sollte zum Beispiel.

    Alles so frustrierend 😞


  • Mod

    Es ist ganz egal, was für ein Container. Das Hauptproblem das ich sehe ist, dass deine Modellierung einer Karte ziemlich unpraktisch ist und du deswegen nicht zu einer Lösung kommst.



  • cout << setw(5) << right << wert[zeile] << " von " << setw(8) << left << farbe[reihe] << (card -1)/8 << ( card % 2 == 0 ? '\n' : '\t' );
    

    Eine von vielen Lösungsansätzen. Warum, wieso, weshalb - da solltest du dir etwas einfallen lassen

    wie heisst das heute - b.t.w.:
    Kannst du das Mischen und die Anzeige in getrennte Funktionen packen?
    Sieht dann besser aus.

    Hier noch mal etwas schnell eingehacktes:

    Wie oft in C oder C++ gibt es mehrere Lösungen.

    ein Weg: das ganze Deck mischen und die Zuordnung Farbe und Zählwert danach per Division und Rest.

    oder wie du das angefangen hast:

    int Deck[Farbe][Zählwert][Spieler];
    

    oder

    //Methode zum Karten mischen
    void Kartenspiel::mischen() {
    
        int reihe;
        int zeile;
    //Karten mischen
        for (int card = 1; card <= 32; card++) {
            do {
                reihe = rand() % 4;
                zeile = rand() % 8;
            } while (Deck[reihe][zeile] != 0);
            Deck[reihe][zeile] = card;  // brauchst du den Wert "card" noch, sonst 
                                        // hier direkt an Spieler verteilen
    Zeichen     } cout << endl << "Karten gemischt!" << endl;
    

    oder

    int DeckSpieler1[Farbe][Zählwert];
        int DeckSpieler2[Farbe][Zählwert];
        ...
    

    oder noch andere Varianten

    sollten Fehler drin sein - beseitigt die 👍

    so nun dürft ihr entscheiden 😃
    f.-th.



  • Gibt es denn nicht auch eine Möglichkeit ein Array z.b.: Deck[32] komplett mit den verschiedenen Karten zu füllen?

    Kann man nicht die unten genannten Karten kombinieren und in das Array Deck[32] speichern?

    farben[0] = "Kreuz";farben[1] = "Pik";farben[2] = "Herz";farben[3] = "Karo";
    
    typen[0] = "Sieben"; typen[1] = "Acht"; typen[2] = "Neun"; typen[3] = "Zehn"; typen[4]= "Bube"; typen[5]= "Dame"; typen[6]= "König" ;typen[7] = "As";
    

    Wenn ja, könnt ihr vielleicht einen Vorschlag dafür nennen?

    Vielen Dank!



  • Hallo Leute

    Laut meinem Code stecken die Farben und die Werte nun in Reihe und Zeile.

    Wie kriege ich die Farben und Werten aus den Reihen und Zeilen in ein Array[Farbe][Wert] ?



  • Du hast doch die Karten bereits in einem zweidimensionalen Array: int Deck[][];

    und das macht das Ganze schwer handhabbar. Du solltest dringend über SeppJs Vorschlag nachdenken und eine weitere Datenstruktur, zB

    struct Karte
    {
        int farbe;
        int wert;
    };
    

    einführen. Davon erstellst Du im Konstruktor von Kartenspiel dann 32 unterschiedliche und definierst Dein Deck in der Klasse Kartenspiel dann:
    Karte Deck[32];

    Das sollte den Umgang mit den Karten sehr vereinfachen. Du könntest dann bei Bedarf für Karte den << - Operator noch überladen. Jeder Spieler bekommt dann seinen eigenen Satz Karten:

    class Spieler
    {
        ...
        Karte kartenSatz[8];
        ...
    }
    

Anmelden zum Antworten