Ein Skat Programm verstehen



  • Hallo,

    ich würde gerne folgendes Programm verstehen. Ich habe schon einige Kommentare hineingesetzt und werde auch noch zu einigen anderen Dingen schreiben wie ich Sie verstanden habe. Würde mich freuen, wenn ihr mir helft es zu verstehen.

    include <string>
    using std::string;
    class Card
    {
    	private:
    		string suit;
    		string face;
    	public:
    		Card();
    		Card(string, string);
    		~Card();
    		string getSuit() const;
    		string getFace() const;
    		string toString() const;
    };
    

    Ich denke da gibt es nicht viel falsch zu verstehen. Mich würde einzig interessieren, ob das const sein muss und wenn ja wieso?

    #include <iostream>
    #include "Card.h"
    
    Card::Card(){};
    
    Card::Card(string a, string b) 
    { 
    	face = a;
    	suit = b;
    };
    
    Card::~Card()
    {
    
    }
    
    string Card::getSuit() const //Ausgabe Farbe
    {
    	return suit;
    }
    
    string Card::getFace() const //Ausgabe Wert
    {
    	return face;
    }
    
    string Card::toString() const // Ausgabe Blatt des Spielers
    {
    	string output;
    	output = getFace() + " " + getSuit();
    	return output;
    }
    

    Hier ist auch alles klar, nur wieso wird Face=a und suit=b gesetzt? ich finde dazu irgendwie keinen wirklichen sinn?

    #include "Card.h"
    
    class SkatGame
    {
    	private:
    		Card deck[32];
    		Card player1[10];
    		Card player2[10];
    		Card player3[10];
    		Card skat[2];
    	public:
    		SkatGame();
    		~SkatGame();
    		void shuffle();
    		void deal();
    		void print() const;
    		Card *getSkat();
    };
    

    Ist soweit klar

    #include <iostream>
    #include <iomanip>
    #include <ctime>
    #include <cstdlib>
    #include "SkatGame.h"
    using namespace std;
    
     SkatGame::SkatGame()
    {
    	int k=0;
    	string Faces[8] = { "sieben","acht","neun","zehn","Bube","Dame","Koenig","As" }; //Definition Wert
    	string Suits[4] = { "Kreuz","Pik","Herz","Karo" }; // Definition Farbe
    
    	for (int i = 0; i<8; i++)
    	{
    		for (int j = 0; j<4; j++)
    		{
    			deck[k] = Card(Faces[i], Suits[j]);
    			cout << k+1 << ": " << deck[k].toString() << endl;
    			k++;
    		}
    	}
    }
    
    SkatGame::~SkatGame()
     {
    
     }
    
    void SkatGame::shuffle() 
    { 
    	Card mem;
    	int pos;
    
    	for (int i = 0; i < 32; i++)
    		{
    			pos = 1 + rand()%32;
    			mem = deck[i];
    			deck[i] = deck[pos];
    			deck[pos] = mem;
    		}
    }
    
    void SkatGame::deal()
    {
    	int pos=0;
    	for (int i = 0; i < 10; i++)
    	{
    		player1[i] = deck[pos];
    		pos++;
    	}
    
    	for (int i = 0; i < 10; i++)
    	{
    		player2[i] = deck[pos];
    		pos++;
    	}
    
    	for (int i = 0; i < 10; i++)
    	{
    		player3[i] = deck[pos];
    		pos++;
    	}
    
    	for (int i = 0; i < 2; i++)
    	{
    		skat[i] = deck[pos];
    		pos++;
    	}
    
    }
    
    void SkatGame::print() const
    {
    	cout << "Karten fuer: " << endl << endl;
    	cout << setw(15) << "Spieler 1 "
    		 << setw(15) << "Spieler 2 "
    		 << setw(15) << "Spieler 3 "
    		 << setw(15) << "Skat " << endl
    	     << setw(15) << "--------- "
    		 << setw(15) << "--------- "
    		 << setw(15) << "--------- "
    		 << setw(15) << "---- " << endl;	 
    
    	for(int i=0; i < 10; i++)
    	{
    		cout << setw(15) << player1[i].toString() 
    			 << setw(15) << player2[i].toString() 
    			 << setw(15) << player3[i].toString();
    		if (i == 0 || i == 1)
    		{
    			cout << setw(15) << skat[i].toString();
    		}
    		cout << endl;
    	}
    	cout << endl << endl;
    };
    
    Card* SkatGame::getSkat() 
    {
    	return skat;
    }
    

    hier habe ich die meisten schwierigkeiten (oh wunder ist wohl sozusagen auch der Code mit den eigentlichen Funktionen)

    Wofür genau ist hier die äußere schleife mit der Bedingung i<8

    for (int i = 0; i<8; i++)
    	{
    		for (int j = 0; j<4; j++)
    		{
    			deck[k] = Card(Faces[i], Suits[j]);
    			cout << k+1 << ": " << deck[k].toString() << endl;
    			k++;
    		}
    	}
    }
    

    Die Innere verstehe ich schon, schließlich sind es 3 Spieler + Skat =4, oder?

    void SkatGame::shuffle() 
    { 
    	Card mem;
    	int pos;
    
    	for (int i = 0; i < 32; i++)
    		{
    			pos = 1 + rand()%32;
    			mem = deck[i];
    			deck[i] = deck[pos];
    			deck[pos] = mem;
    		}
    }
    

    Sehe ich es richtig, dass es hier 1+ rand()%32 heisst weil es 32 Karten sind und das arry bei 0 anfängt?

    void SkatGame::deal()
    {
    	int pos=0;
    	for (int i = 0; i < 10; i++)
    	{
    		player1[i] = deck[pos];
    		pos++;
    	}
    
    	for (int i = 0; i < 10; i++)
    	{
    		player2[i] = deck[pos];
    		pos++;
    	}
    
    	for (int i = 0; i < 10; i++)
    	{
    		player3[i] = deck[pos];
    		pos++;
    	}
    
    	for (int i = 0; i < 2; i++)
    	{
    		skat[i] = deck[pos];
    		pos++;
    	}
    
    }
    

    Hier sind wohl die schleifen bis <10 dafür verantwortlich, dass jeder spieler 10 Karten bekommt, aber wofür wird die variable pos hochgezählt?

    #include <iostream>
    using std::cout;
    using std::endl;
    #include "SkatGame.h"
    
    int main()
    {
    	const int loops = 1000000;
    	double sum;
    
    	int count=0;
    	SkatGame Skat;
    	Card *card;
    
    		for (int i = 0; i < 5; i++)
    	{
    		Skat.shuffle();
    		Skat.deal();
    		Skat.getSkat();
    		Skat.print();
    	}
    
    	for (int i = 0; i < loops; i++)
    	{
    
    		Skat.shuffle();
    		Skat.deal();
    		card = Skat.getSkat(); 
    
    		if (card[0].getFace() == "Bube" || card[1].getFace() == "Bube")
    			{ 
    
    			  count++;  
              } 
    	}
    
    		cout << "Bei einer Million betrachteten Spielen ist bei " << count << " Spielen "<< endl;
    		cout << "mindestens ein Bube im Skat. " << endl;
    
    		sum = (static_cast<double>(count)/static_cast<double>(loops))*100;
    		cout <<  sum  << " % der Skat-Blaetter enthalten mindestens einen Buben im Skat." << endl;
    
    		system("pause");
    		return 0;
    }
    

    So das wären ne Menge Verständnis Fragen, aber ich hoffe ihr beantwortt Sie mir trotzdem 🙂



  • ThaRealMatix schrieb:

    Hallo,

    ich würde gerne folgendes Programm verstehen. Ich habe schon einige Kommentare hineingesetzt und werde auch noch zu einigen anderen Dingen schreiben wie ich Sie verstanden habe. Würde mich freuen, wenn ihr mir helft es zu verstehen.

    include <string>
    using std::string;
    class Card
    {
    	private:
    		string suit;
    		string face;
    	public:
    		Card();
    		Card(string, string);
    		~Card();
    		string getSuit() const;
    		string getFace() const;
    		string toString() const;
    };
    

    Ich denke da gibt es nicht viel falsch zu verstehen. Mich würde einzig interessieren, ob das const sein muss und wenn ja wieso?

    Wenn du die 'const' hinter den get-Methoden meinst - die sichern dir zu, daß diese Methoden deine Karte nicht versehentlich verändern (und ermöglichen es auch, Farbe und Wert von 'const Card' Objekten zu erfahren).

    #include <iostream>
    #include "Card.h"
    
    Card::Card(){};
    
    Card::Card(string a, string b) 
    { 
    	face = a;
    	suit = b;
    };
    [...]
    

    Hier ist auch alles klar, nur wieso wird Face=a und suit=b gesetzt? ich finde dazu irgendwie keinen wirklichen sinn?

    Der Ctor von 'Card' erhält zwei Parameter, die den Wert und die Farbe der Karte darstellen sollen. Wie du diese Parameter nennst, bleibt dir überlassen, wichtig ist, daß der Ctor sie an die richtigen Membervariablen übergibt.

    Wofür genau ist hier die äußere schleife mit der Bedingung i<8

    for (int i = 0; i<8; i++)
    	{
    		for (int j = 0; j<4; j++)
    		{
    			deck[k] = Card(Faces[i], Suits[j]);
    			cout << k+1 << ": " << deck[k].toString() << endl;
    			k++;
    		}
    	}
    }
    

    Die Innere verstehe ich schon, schließlich sind es 3 Spieler + Skat =4, oder?

    Du hast acht Kartenwerte (7,8,9,10,B,D,K,A) in vier verschiedenen Farken (Karo, Herz, Pik, Kreuz), die du mit dieser Doppelschleife initialisieren mußt.
    (die Anzahl der Spieler spielt hier noch keine Rolle)

    void SkatGame::shuffle() 
    { 
    	Card mem;
    	int pos;
    
    	for (int i = 0; i < 32; i++)
    		{
    			pos = 1 + rand()%32;
    			mem = deck[i];
    			deck[i] = deck[pos];
    			deck[pos] = mem;
    		}
    }
    

    Sehe ich es richtig, dass es hier 1+ rand()%32 heisst weil es 32 Karten sind und das arry bei 0 anfängt?

    Ich würde sagen, das "1+" ist hier überflüssig. Aber das "%32" steht dort tatsächlich für die Anzahl der Karten.

    void SkatGame::deal()
    {
    	int pos=0;
    	for (int i = 0; i < 10; i++)
    	{
    		player1[i] = deck[pos];
    		pos++;
    	}
    
    	for (int i = 0; i < 10; i++)
    	{
    		player2[i] = deck[pos];
    		pos++;
    	}
    
    	for (int i = 0; i < 10; i++)
    	{
    		player3[i] = deck[pos];
    		pos++;
    	}
    
    	for (int i = 0; i < 2; i++)
    	{
    		skat[i] = deck[pos];
    		pos++;
    	}
    
    }
    

    Hier sind wohl die schleifen bis <10 dafür verantwortlich, dass jeder spieler 10 Karten bekommt, aber wofür wird die variable pos hochgezählt?

    Die Variable 'pos' wird (über alle Schleifen hinweg) hochgezählt und kennzeichnet die oberste Karte des (noch nicht verteilten) Kartenstapels - der nacheinander auf die drei Spieler und den Skat aufgeteilt wird.

    (übrigens entspricht die Art des Aufteilens nicht den Skatregeln, die ich kenne ;))



  • *g* hey ich hab das Programm ja nicht geschrieben @ Kartenregeln

    wenn

    for (int j = 0; j<4; j++)
            {
                deck[k] = Card(Faces[i], Suits[j]);
                cout << k+1 << ": " << deck[k].toString() << endl;
                k++;
            }
    

    nicht für die 3 spieler + Skat steht, wofür ist das j=4 dann da? Die Farben wären 4 aber die Werte ja nicht?

    Wo du gerade von fehlern drin sprachst.. sind da eventuell noch mehr? nicht dass ich mir das anschau verinnerliche und dann die gleichen mache?



  • jep, selbe meinung.. falsch ausgeteilt 😉
    ordnung muss sein!

    aus wikipedia:
    Spielvorbereitung [Bearbeiten]

    Ein Spiel beginnt mit dem Mischen der Karten durch den Geber. Anschließend lässt dieser vom Spieler rechts neben sich einmal abheben und legt den liegengebliebenen Teil der Karten auf den abgehobenen Teil. Beim Abheben müssen mindestens vier Karten abgehoben und mindestens vier Karten liegen gelassen werden.

    Danach teilt der Geber verdeckt und im Uhrzeigersinn, beginnend beim Spieler links neben sich (sogenannte „Vorderhand“), jedem Spieler zunächst drei Karten aus. Bei vier Spielern gibt er sich selbst dabei keine Karte, da der Geber in diesem Fall aussetzt. Danach legt er zwei Karten verdeckt in die Mitte des Tisches. Diese bilden den sogenannten Skat oder Stock. Anschließend teilt er wieder verdeckt und im Uhrzeigersinn beginnend bei der Vorderhand jedem Spieler zunächst vier und anschließend drei Karten aus. Auch hier lässt er sich bei vier Spielern selbst aus. Insgesamt erhält jeder Spieler also zehn Karten. Beim nächsten Spiel wechselt die Rolle des Gebers im Uhrzeigersinn.



  • ThaRealMatix schrieb:

    for (int j = 0; j<4; j++)
            {
                deck[k] = Card(Faces[i], Suits[j]);
                cout << k+1 << ": " << deck[k].toString() << endl;
                k++;
            }
    

    nicht für die 3 spieler + Skat steht, wofür ist das j=4 dann da? Die Farben wären 4 aber die Werte ja nicht?

    Wenn schon, dann betrachte mal die gesamte Schleifenstruktur:

    for (int i = 0; i<8; i++)
        {
            for (int j = 0; j<4; j++)
            {
                deck[k] = Card(Faces[i], Suits[j]);
                cout << k+1 << ": " << deck[k].toString() << endl;
                k++;
            }
        }
    }
    

    Die äußere Schleife (i) läuft durch die möglichen Kartenwerte, die innere (j) durch die Farben - durch die Kombination beider erzeugst du nacheinander alle Karten von "Kreuz sieben" bis "Karo As" und packst sie auf deinen Kartenstapel.

    PS: Abgesehen von der überflüssigen "1+" (und der falschen Kartenaufteilung) sind mir keine Fehler aufgefallen - aber ich habe das Programm auch nur überflogen.


Anmelden zum Antworten