Card Game Deck Generierung

Krikus

Mitglied
Hi,

unten habe ich eine Klasse für ein 32 Card Game geschrieben.
Allerdings gefällt mir die Deckerstellung nicht sehr gut. Mit dem Hintergedanken, dass ich vielleicht ja auch 52 Karten nehmen könnte.
Lässt sich dies in irgendeiner Weise verkürzen bzw. optimieren?

Hier der Code:

PHP:
#include <iostream>
#include <cstdlib>
#include <string>
#include <conio.h>
#include <algorithm>

using namespace std;


class Card { 
   public:

	void assign(const string & s, const string & f) {
		suit = s;
		face = f;
	}	

	const string getSuit() const {
		return suit;
	}

	const string getFace() const {
		return face;
	}

   private:
	string suit;
	string face;
};


class Game {
   public:
	Game() {
		deck[0].assign("sieben", "Karo");
		deck[1].assign("sieben", "Herz");
		deck[2].assign("sieben", "Pik");
		deck[3].assign("sieben", "Kreuz");

		deck[4].assign("acht", "Karo");
		deck[5].assign("acht", "Herz");
		deck[6].assign("acht", "Pik");
		deck[7].assign("acht", "Kreuz");

		deck[8].assign("neun", "Karo");
		deck[9].assign("neun", "Herz");
		deck[10].assign("neun", "Pik");
		deck[11].assign("neun", "Kreuz");

		deck[12].assign("zehn", "Karo");
		deck[13].assign("zehn", "Herz");
		deck[14].assign("zehn", "Pik");
		deck[15].assign("zehn", "Kreuz");

		deck[16].assign("Bube", "Karo");
		deck[17].assign("Bube", "Herz");
		deck[18].assign("Bube", "Pik");
		deck[19].assign("Bube", "Kreuz");

		deck[20].assign("Dame", "Karo");
		deck[21].assign("Dame", "Herz");
		deck[22].assign("Dame", "Pik");
		deck[23].assign("Dame", "Kreuz");

		deck[24].assign("Koenig", "Karo");
		deck[25].assign("Koenig", "Herz");
		deck[26].assign("Koenig", "Pik");
		deck[27].assign("Koenig", "Kreuz");

		deck[28].assign("Ass", "Karo");
		deck[29].assign("Ass", "Herz");
		deck[30].assign("Ass", "Pik");
		deck[31].assign("Ass", "Kreuz");
	}

	
	
   private:
	Card deck[32];
};
 
Hallo Krikus,

statt eines Arrays mit fester Größe könntest du eine Container-Klasse der STL, z.B. vector, verwenden.

Gruß
MCoder
 
Hi.

Ich würde die Farben und Bilder der Karten nicht als String festlegen, sondern eine Enumeration dafür verwenden.

Die textuelle Repräsentation kannst du dann z.B. in einem ostream& operator<<() festlegen.
C++:
enum face_t {
  seven, eight, nine, ten, jack, queen, king, ace
};

face_t& operator++ (face_t& f) {
  return f = static_cast<face_t>(f+1);
}
...
for (face_t f = seven; f <= ace; ++f) {
  for (suite_t s = ...) {
    deck.push_back(card(f, s));
  }
}
Gruß
 
Zuletzt bearbeitet:
Danke für die Antworten.
Allerdings bin ich in OOP noch nicht so weit, als dass ich deinen Code verstehen würde.
Geht es auch einfacher ,bzw etwas unschöner, was einfacher verständlich ist?
 
Ich werd die Optimierung vornehmen, sobald ich diese eine Problem welches, ich noch habe gelöst habe.
Komme damit aber nich ganz weiter.
Unt zwar habe ich die Klasse um einige Methoden erweitet, und eine feste Anzahl von Spielern (4) eingestellt. Jetzt hänge ich an dem Konstrucktor, welche die Anzahl der Spieler übergeben bekommt, so das ich keine feste Anzahl mehr habe, sondern eingeben muss.
Weiß aber nicht wo ich da überhaupt ansezten soll nun.
Oder wäre es sinvoll, noch eine Klasse player anzulegen, wo die Anzahl der Spieler sowie die Anzahl der Karten geregelt wird.
Hier mal die classen(die Methoden sind habe ich teilweise weggelassen):

PHP:
class Card { 
   public:

	void assign(const string & s, const string & f) {
		suit = s;
		face = f;
	}	

	const string getSuit() const {
		return suit;
	}

	const string getFace() const {
		return face;
	}

   private:
	string suit;
	string face;
};


class SkatGame {
   public:
	SkatGame() {
		cout << "Aufruf von SkatGame()" << endl;
		deck[0].assign("sieben", "Karo");
		deck[1].assign("sieben", "Herz");
		deck[2].assign("sieben", "Pik");
		deck[3].assign("sieben", "Kreuz");

		deck[4].assign("acht", "Karo");
		deck[5].assign("acht", "Herz");
		deck[6].assign("acht", "Pik");
		deck[7].assign("acht", "Kreuz");

		deck[8].assign("neun", "Karo");
		deck[9].assign("neun", "Herz");
		deck[10].assign("neun", "Pik");
		deck[11].assign("neun", "Kreuz");

		deck[12].assign("zehn", "Karo");
		deck[13].assign("zehn", "Herz");
		deck[14].assign("zehn", "Pik");
		deck[15].assign("zehn", "Kreuz");

		deck[16].assign("Bube", "Karo");
		deck[17].assign("Bube", "Herz");
		deck[18].assign("Bube", "Pik");
		deck[19].assign("Bube", "Kreuz");

		deck[20].assign("Dame", "Karo");
		deck[21].assign("Dame", "Herz");
		deck[22].assign("Dame", "Pik");
		deck[23].assign("Dame", "Kreuz");

		deck[24].assign("Koenig", "Karo");
		deck[25].assign("Koenig", "Herz");
		deck[26].assign("Koenig", "Pik");
		deck[27].assign("Koenig", "Kreuz");

		deck[28].assign("Ass", "Karo");
		deck[29].assign("Ass", "Herz");
		deck[30].assign("Ass", "Pik");
		deck[31].assign("Ass", "Kreuz");
	}
	
	void mischen() 
	{
	......
	}

	void deal() {
	for (int i=0; i<8; i++ ) {
			player1[i] = deck[i];
			player2[i] = deck[8+i];
			player3[i] = deck[16+i];
			player4[i] = deck[24+i];
		}
	}


	void print() const {
		int auswahl;

		do{
			system("cls");
			cout << "Karten eines Spielers anschauen" <<endl;
			cout <<"(1) Karten von Spieler 1"<<endl;
			cout <<"(2) Karten von SPieler 2"<<endl;
			cout <<"(3) Karten von SPieler 3"<<endl;
			cout <<"(4) Karten von SPieler 4"<<endl;
			cout <<"(0) zurueck zum Hauptmenue"<<endl;
			cout <<"Auswahl (0-4): " ;
			auswahl=getch();
			if(auswahl=='1')
			{	
				system("cls");
				for (int i=0; i<8; i++){
					cout << "player1[" << i << "] = " 
						<< player1[i].getSuit() << " " << player1[i].getFace() << endl;
				}getch();
			}
		...........

	}

	void options()
	{

	.......
	}

   private:
	   int anzahl_player;
	   int anzahl_karten_player;
	Card deck[32];
	Card player1[8];
	Card player2[8];
	Card player3[8];
	Card player4[8];
};
 
Zuletzt bearbeitet:
Zurück