*argh* Blackjack



  • Ich habe mal ein anderes Kartenspiel geschrieben. Vielleicht geben dir folgende Programmausschnitte einen Eindruck wie man das ganze objektorientiert lösen könnte.

    karte.h

    #ifndef __BLACKJACKKARTE_H__
    #define __BLACKJACKKARTE_H__
    
    #include <string>
    #include "farbe.h"
    #include "wert.h"
    
    namespace blackjack {
    
    static const int max_wert_ass = 11;
    
    class Karte {
    private:
        Farbe farbe;
        Wert wert;
    
    public:
        Karte()
                : farbe(PICK), wert(ASS) {}
    
        explicit Karte(Farbe f, Wert w)
                : farbe(f), wert(w) {}
    
        ~Karte() {}
    
        Farbe getFarbe() const {
            return farbe;
        }
    
        std::string getFarbeStr() const;
    
        Wert getWert() const {
            return wert;
        }
    
        std::string getWertStr() const;
    
        int minValue() const;
        int maxValue() const;
    };
    
    }
    
    #endif
    

    kartenstapel.h

    #ifndef __BLACKJACKKARTENSTAPEL_H__
    #define __BLACKJACKKARTENSTAPEL_H__
    
    #include <vector>
    #include "karte.h"
    
    static const int anzahlDecks = 6;
    static const int kartenProDeck = 52;
    static const int anzahlKarten = anzahlDecks * kartenProDeck; 
    
    namespace blackjack {
    
    class Kartenstapel{
    private:
    	typedef std::vector<Karte*> vec_type;
    	vec_type v;
    
    public:
        void initStapel();
    
        Karte* getKarte();
    
    };
    
    }
    
    #endif
    

    kartenstapel.cpp

    #include "kartenstapel.h"
    #include <algorithm>
    
    #include <iostream>
    using namespace std;
    
    using namespace blackjack;
    
    struct generator_ {
        int f, w;
    
        generator_()
                : f(blackjack::PICK), w(0) {}
    
        Karte* operator()() {
            if (w == blackjack::KOENIG) {
                w = blackjack::ASS;
    
                if (f == blackjack::KARO)
                    f = blackjack::PICK;
                else
                    ++f;
            } else
                ++w;
    
            return new Karte(static_cast<Farbe>(f)
                             , static_cast<Wert>(w));
        }
    };
    
    namespace blackjack {
    
    void Kartenstapel::initStapel() {
        vec_type::iterator i = v.begin();
        while (i != v.end())
            delete *i++;
    
        v.resize(anzahlKarten, 0);
        generate(v.begin(), v.end(), generator_());
    
    #ifdef _GLIBCPP_HAVE_DRAND48
    
        srand48(time(0));
    #else
    
        srand(time(0));
    #endif
    
        random_shuffle(v.begin(), v.end());
    }
    
    Karte* Kartenstapel::getKarte() {
        if (v.empty())
            return 0;
    
        Karte* tmp = v.back();
        v.pop_back();
        return tmp;
    }
    
    }
    


  • auf so etwas kompeliziertes wäre ich zwar nicht gekommen, ist aber richtig geil
    danke! 🙂



  • auf so etwas kompeliziertes wäre ich zwar nicht gekommen, ist aber richtig geil
    danke!

    Kompliziert finde ich das ganz und garnicht. Nimm mir das jetzt nicht böse 🙂 - aber unübersichtlicher und redundanter Quelltext ist viel umständlicher zu lesen. Aber mit der Zeit und mit guten Büchern eignet man sich schon einen guten Programmierstiel an 😉



  • ich habe M+T easy c++

    aber das mit dem oop will einfach net in meinen kopf 😕



  • "Die C++ Programmiersprache" von Bjarne Stroustrup ist das ideale Buch für Fortgeschrittene C++-Programmierer. Es wird sehr detailliert auf alle wichtigen Konzepte eingegangen.

    Ansonsten finde ich spezielle Bücher über objektorientierte Analyse und Design recht gut, da die Konzepte der OOP unabhängig von der Programmiersprache behandelt werden.

    Ich würde mich auch mit der UML beschäftigen, so erlernt man nicht nur eine Sprache mit der man die objektorientierten Gedanken ausdrücken kann, sondern vertieft auch die Kenntnisse der OOP.

    Von den C++-Büchern von Markt & Technik bin ich eher weniger begeistert.



  • den code würde ich ganz schnell vergessen aber mach dir kein zu großen kopf darüber so haben wir fast alle angefangen. Mich zumindest erinner das an mein erstes VB Programm welches symbolisch ableiten sollte und da ich dahmals noch net wusste wie man das richtig macht (Parser Baum) habe ich so eine ähnlichen Code geschrieben um eine Klammer hirachie reinzubekommen das war echt graussam 🙂



  • @ MadMax:

    Welchen Code meinst du? Bezog sich das auf meinen Quelltextausschnitt?



  • Hier noch ein bischen Futter für den C/C++ -Compiler.
    Habe den Autorenhinweis noch drin da das meiste aus den ersten 20 Zeilen vom
    Initiator.

    /* 
    Blackjack made by Marc G. 2006 
    */ 
    
    /* 
    Ass = 1 oder 11 --> noch nicht implementiert 
    König = 10 
    Königin = 10 
    Bube = 10
    */ 
    
    // todo: Spielfarben noch nicht eingebaut
    // todo: Falscheingaben abfangen 
    
    //Libarys 
    #include <iostream> 
    #include <cstdlib> 
    #include <ctime> 
    
    using namespace std; 
    
    //Haupt-Funktion 
    int main() 
    { 
    	char ch = 0;
    	int insg;
    	int ende;
    
    	srand(time(0)); 
    	int a = rand() % 13 + 2;	// König, Dame und Bube sollten auch vertreten sein
    	if(a > 11)
    		a = 10;	// brutal ;)  <-- aber sonst Kartenwert 10 unterrepräsentiert
    	insg = a;
    	do{
    		ch = 'z';
    		ende = 0; 
    		int a = rand() % 13 + 2;	// König, Dame und Bube sollten auch vertreten sein
    		if(a > 11)
    			a = 10;	// brutal ;)  <-- aber sonst Kartenwert 10 unterrepräsentiert
    		insg = insg + a;
    		cout << "bisher hast du " << insg << " Augen" << endl;
    		if(insg<=21)
    		{
    			cout << "willst du eine weitere Karte ziehen? j/n" << endl;
    			cin >> ch;
    			if(ch != 'j')
    				ende = 1;     
    		}
    		else
    		{
    			cout << "zu hoch gezockt! ;) " << endl;
    			cout << "genug gesehen? j/n" << endl;
    			cin >> ch;
    			if(ch == 'j')
    				ende = 1;     
    		}
    
    	//SCHLEIFE + Schließen 
    	} while(ende!=1); 
    }
    


  • das ist doch mal was, damit kann ich aber richtig gut was anfangen.

    wollte nochmals allen danken, für ihre nette hilfe 🙂

    so langsam krieg ich es auf die reihe 😃

    grüßle, freer0m



  • hier jetzt mein 0.2 alpha release 🙂
    will noch spielgeld und spielkartenfarbe implementieren!

    /*
         Blackjack made by Marc G. 2006
    
         ?todo: Spielfarben noch nicht eingebaut *4
         ?todo: Falscheingaben abfangen *3
         !done: Design *1
         ?todo: Spielgeld *2
    */
    
    //Libarys
    #include <iostream>
    #include <cstdlib>
    #include <ctime>
    
    using namespace std;
    
    //Haupt-Funktion
    int main()
    {
        char ch = 0;
        char ee = 0;
        int insg;
        int ende;
        int i=2;
    
        srand(time(0));
        int a = rand() % 13 + 2;    // König, Dame und Bube sollten auch vertreten sein
        if(a > 11)
            a = 10;    // brutal ;)  <-- aber sonst Kartenwert 10 unterrepräsentiert
        insg = a;
    
            cout << "--------------------------------------------\nWillkommen zu C++ Solo-Blackjack von Marc G.\n----------------------------------------2006" << endl;
            cout << "\n* Erklaerung der Shortcuts... \n  - j=ja\n  - n=nein\n  - q=beenden\n\n" << endl;         
            cout << "* Erklaerung von Blackjack...\n  - Bei diesem Solo-Player von Blackjack, versuchen Sie, so nah wie moeglich an   21 heran zu kommen, ueberschreiten Sie die 21, so ist das Spiel zu Ende. Errei  chen Sie direkt 21 mit 2 Karten, so nennt man dies dann 'Blackjack'."<<endl;
            cout << "\n\n\n* Weiter mit:\n b = Bugs\n k = Kontact\n w = Weiter (zum Spiel starten)\n\n\nZum einfachen fortfahren, 'w' und dann 'ENTER'-Taste druecken." << endl;
            cin>>ee;
            if(ee == 'b')
            {
                  system("cls");
                  cout << "------------------------------------------------------------------------\n| 1. Moechte man keine Karte mehr ziehen, so stuertzt das Programm ab. |\n| 2. ?                                                                 |\n------------------------------------------------------------------------\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"<<endl;
                  system("pause");
                  return main();
            }
            else if(ee == 'k')
            {
                  system("cls");
                  cout << "-----------------------------------\n| E-Mail: marc.gunit(at)gmail.com |\n| MSN: r0m(at)hotmail.de          |\n-----------------------------------\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"<<endl;
                  system("pause");
                  return main();
            }
            else if(ee == 'w')
            {
    
            }
            system("cls");
      do{
            ch = 'z';
            ende = 0;
            int a = rand() % 13 + 2;    // König, Dame und Bube sollten auch vertreten sein
            if(a > 11)
                a = 10;    // brutal ;)  <-- aber sonst Kartenwert 10 unterrepräsentiert
            insg = insg + a;
            cout << "--------------------------------------------\n| Bisher hast du " << i << " Karten und " << insg << " Augen" << endl;
            if(insg<21)
            {
                cout << "--------------------------------------------\n| Willst du eine weitere Karte ziehen? j/n |\n--------------------------------------------" << endl;
                cin >> ch;
                i++;
                if(ch != 'j')
                ende = 1;
            }
            else if(insg == 21)
            {
                 cout<<"Glueckwunsch, Sie haben genau 21 erreicht!"<<endl;
            }
            else
            {
                system("cls");
                cout << "--------------------------------\n| End-Ergebniss: "<< insg << endl;
                cout << "| Spielende - Das war zu viel! |\n--------------------------------" << endl;
                cout << "| Nochmal? j/n                 |\n--------------------------------" << endl;
                cin >> ch;
                if(ch == 'j')
                    {
                         system("cls");
                         return main();
                    }
    
                if(ch == 'n')
                    ende = 1;
                    {
                         return 0;
                    }
            }
        } while(ende!=1);
    }
    


  • Must du mehrere Tasturabfragen machen solltest du statt if - else dich
    mal mit switch - case befassen.

    Und wenn du schon system("xy")verwendest schau mal nach deiner Einleitung
    ob du da nicht ein paar einsparen kannst(von den "cls").

    system("pause") kann man auch anders lösen - es gibt genug Beispiele hier
    im Forum zum Thema system - versuchs hier mal mit suchen.
    Ausserdem, wenn du die Tasturabfragen bei mir richtig verstehst, solltest du
    selber eine passende Lösung(ohne system("pause")) erstellen können.

    Man kann schon Fortschritte bei dir erkennen, aber bis es rund läuft
    must du wohl noch einige Varianten(mit 20 bis 50 solltest du rechnen) testen
    müssen.

    MfG f.-th.



  • habs übersehen:
    wozu in 'int main()' 'return main()' gut sein? überleg mal was do-while macht.



  • okay: 'soll' vergessen

    ich hatte es absichtlich so geschrieben das du dich in Schleifen üben sollst.

    hinweis für Spielwiederhohlung: benenne 'main' z.b. in 'spiel' oder 'spieler_1'
    um, mache eine neue 'main' und rufe in einer Schleife 'spiel' auf.

    Und noch mal der dringende Hinweis versuch das mit den Schleifen wirklich zu
    verstehen oder du must bei lucky_tux seinem Quelltext weitermachen, da fallen
    weniger offensichtliche Schleifen an - aber ob du dann da den Durchblick hast?



  • danke, fth.

    darf ich dich privat (email, msn...) kontaktieren, ich hätte auch wirklich nur 3-4 fragen, die speziell auf mein blackjack gehen?!



  • damit es weitergeht:
    dummerweise kenne ich die exakten Regeln von Blackjack nicht, speziell zum
    ziehen von Ergänzungskarten, eventuell müssen die Schleifen den Regeln
    angepasst werden. ich denke aber das es wahrscheinlich mehrere Varianten
    gibt. Eine Variante '17und4' kenne ich auch mit dem normalen Skatblatt und
    Bube, Dame und König zählen wie beim Skat.
    ich nehme die zuletzt hier von mir gepostete Quelle als Basis:

    //Libarys 
    #include <iostream> 
    #include <cstdlib> 
    #include <ctime> 
    
    using namespace std; 
    
    //Haupt-Funktion 
    int spieler()
    { 
    	char ch = 0;
    	int insg;
    	int ende;
    
    	srand(time(0)); 
    	int a = rand() % 13 + 2;	// König, Dame und Bube sollten auch vertreten sein
    	if(a > 11)
    		a = 10;	// brutal ;)  <-- aber sonst Kartenwert 10 unterrepräsentiert
    	insg = a;
    	do{
    		ch = 'z';
    		ende = 0; 
    		int a = rand() % 13 + 2;	// König, Dame und Bube sollten auch vertreten sein
    		if(a > 11)
    			a = 10;	// brutal ;)  <-- aber sonst Kartenwert 10 unterrepräsentiert
    		insg = insg + a;
    		cout << "bisher hast du " << insg << " Augen" << endl;
    		if(insg<=21)
    		{
    			cout << "willst du eine weitere Karte ziehen? j/n" << endl;
    			cin >> ch;
    			if(ch != 'j')
    				ende = 1;     
    		}
    		else
    		{
    			cout << "zu hoch gezockt! ;) " << endl;
    			cout << "genug gesehen? j/n" << endl;
    			cin >> ch;
    			if(ch == 'j')
    				ende = 1;     
    		}
    
    	//SCHLEIFE + Schließen
    	} while(ende!=1);
            return(insg);
    }
    
    int main()
    {
      char c;
      int res[6];
      int end;
      do
      {
        cout << "Bitte geben Sie die Nummer des Spielers ein " << endl;
        cout << "oder 'q' für quit(ende)" << endl;
        cin >> c;
        switch(c)
        {
                 case  '1':
                       res[1] = spieler();
                       break;
                 case  '2':
                       res[2] = spieler();
                       break;
                 case  'q':
                       end = 1;
                       break;
                 default:
                       end = 1;	// oder hier wiederhohlen des Eingabehinweises             
                 	   break;
          }
          if( res[1] == res[2])
          	cout << "gleiche Augenzahl" << endl;	// Resultatauswertung ergaenzen!   
      }while(end != 1);
      // return(0);
    }
    

    du siehst das mit den Schleifen ist so trivial, dass man als Anfänger
    sich nur fragt: warum bin ich nicht gleich drauf gekommen.
    die do-while in int main() ist allerdings noch ausbaufähig. 😉

    die system(CLS) Infos such dir bitte hier im Forum zusammen.

    mfg f.-th.


Anmelden zum Antworten