Lektion 26:

Klasse NimmSpiel

 Das NimmSpiel als Klasse zu schreiben, ist, nachdem der alte Code vorliegt, recht einfach:

#include <iostream.h>
class NimmSpiel
{
private:
   int anzahlDerMuenzen;
public:
   void zugRechner()
   {
      int wunschZug=anzahlDerMuenzen%4;
      if(wunschZug==0)
         anzahlDerMuenzen=anzahlDerMuenzen-1;
      else
         anzahlDerMuenzen=anzahlDerMuenzen-wunschZug;
   };
   void zugMensch()
   {
      int ergebnis;
      cout<<"Jetzt liegen "<<anzahlDerMuenzen<<" Muenzen auf dem Tisch."<<endl;
      cout<<"Wieviele moechten Sie nehmen? ";
      cin>>ergebnis;
      anzahlDerMuenzen=anzahlDerMuenzen-ergebnis;
   };
   bool gewonnen()
   {
      return anzahlDerMuenzen==0;
   };
   void starteSpiel()
   {
      cout<<"Mit wievielen Muenzen fangen wir an? ";
      cin>>anzahlDerMuenzen;
   };
};
void main()
{
   NimmSpiel spiel;
   spiel.starteSpiel();
   while(true)
   {
      spiel.zugRechner();
      if(spiel.gewonnen())
      {
         cout<<"Ich habe gewonnen!"<<endl;
         return;
      };
      spiel.zugMensch();
      if(spiel.gewonnen())
      {
         cout<<"Sie haben gewonnen!"<<endl;
         return;
      };
   };
};

Dabei bedeutet die Zeile

   void zugRechner()

daß die zugRechner-Funktion keinen Rückgabewert hat. Sie soll also nichts ausrechnen, ganz im Gegensatz zu den Funktionen, die wir bisher gesehen haben, sondern nur etwas ausführen.

  In anderen Sprachen heißen solche Funktionen Prozeduren. In C++ sagt man void-Funktion.

private:

Ab jetzt ist alles für klassenfremde Funktionen tabu, also nicht zugreifbar. Der Compiler wehrt alle Versuche ab, Sachen zu verwenden, die private sind. Generell gilt, daß alle Attribute private sein sollen. Dabei bedeutet private nicht, daß keine anderen Objekte auf die Attribute eines Objektes zugreifen können. Die Kollegen aus der selben Gewerkschaft (die Objekte aus der selben Klasse) dürfen sich gegenseitig in die Karten sehen.

public:

Auf alles, was jetzt kommt, darf zugegriffen werden.

Dieses Hauptprogramm muß jetzt keine Details mehr über das Nimm-Spiel wissen. Man braucht hier nur darauf zu achten, daß der Spielablauf korrekt ist. Und das schönste daran ist, daß genau dieses Hauptprogramm für sehr viele Spiele funktioniert, wenn man nur eine andere Klasse einsetzt. Man könnte darüber nachdenken, eine Klasse Spiel, mit einer Methode einSpielDurchfuehren, zu erzeugen, die nichts anderes macht, als dieses Hauptprogramm auszuführen. Die einzelnen Spiele würden dann von Spiel erben und dann die jeweils aufgerufenen Funktionen polymorph anbieten. Aber das ist eine andere Geschichte.

Einsendungen:

void main() oder int main()


Falls Ihnen Fehler im Text auffallen oder Sie Verbesserungsvorschläge haben, dann schicken Sie mir bitte eine Mail. Ich werde mich dann sofort darum kümmern.
[aktuelle Version] [inhalt] [index]      [Fehlerkorrektur, Verbesserungsvorschlag]

© Volkard Henkel <volkard@normannia.de>, last update: 08/25/00