weiter

C++

G.Eichelsdörfer - Staatliche Technikerschule Weilburg

Kleines Projekt 1: Zahlenratespiel (1)

Legen Sie einen neuen Arbeitsbereich mit dem Namen "projekte1" an. Diesem gliedern Sie das Projekt "zahlenraten" ein.

Beschreibung

In diesem kleinen Projekt soll der Spieler eine vom Computer gewählte Zahl zwischen 1 und 100 herausfinden. Zu diesem Zweck gibt der Spieler einen Zahlentipp ein. Der Computer soll daraufhin mitteilen, ob der Tipp trifft oder zu klein oder zu groß ist. Ist die Zahl noch nicht gefunden, gibt der Spieler den nächsten Tipp ein ... Das Spiel ist zu Ende, wenn der Spieler die Zahl gefunden hat.

Wie kann sich ein Computer eine Zahl "ausdenken"?

Eine solche Zahl könnte auch gewürfelt werden. Ein Computer ist in der Lage eine Zufallszahl zu erzeugen. Dazu benötigt das Programm einen Zufallsgenerator oder treffender: eine Zufallsfunktion.

Die Zufallszahlenfunktionen

Diejenige Funktion, welche ganze Zufallszahlen liefert, besitzt folgenden Prototyp:
int rand(void); oder kurz int rand();
Sie sehen daran, dass diese Funktion rand heißt (von random = wahlfrei, zufällig), nichts importiert und einen int-Wert liefert.
Der Prototyp steht in der Headerdatei stdlib.h, die zumeist nicht explizit per #include einbezogen werden muss.

Sie können diese Funktion testen, indem Sie einfach den von rand() gelieferten Wert ausgeben lassen.
cout << rand() << endl;
Sie werden jedoch feststellen, dass bei jedem Programmstart dieselbe Zahl erscheint, ein dummer Zufall - im wahrsten Sinne des Wortes.

Dies liegt daran, dass diese Funktion bei jedem Aufruf die gelieferte Zahl aus der vorhergehenden durch Veränderung deren Bitmusters erzeugt. Man spricht dabei auch von einem Pseudo-Zufallsgenerator. Die Werte sind jedoch trotzdem nicht berechenbar, weil die zugrunde liegenden Bitmuster mehr Bit haben als die gelieferten Zahlen.

Um bei jedem Programmstart andere Zahlenfolgen zu erhalten, ist das Anfangsbitmuster für die rand()-Funktion jedes Mal anders zu setzen. Diesem Zweck dient die folgende Funktion:
void srand(unsigned int seed);
Auszug aus dem Hilfetext:
The srand function sets the starting point for generating a series of pseudorandom integers.

Damit ist das Problem zunächst aber nur verschoben und nicht beseitigt.
Welche Zahl sollen wir denn an srand() als Parameter übergeben?
Der Benutzer könnte eine Zahl dafür eingeben. Bei derselben Anfangszahl ergeben sich jedoch immer dieselben Folgezahlen. Wir sollten die Anfangszahl besser vom Computer liefern lassen.

Idee: Die Zeit soll die Anfangszahl liefern.

Wir benötigen dazu eine Funktion, die die aktuelle Zeit liefert. Bei jedem Start des Programms liegt eine andere Zeit vor. Die folgende Funktion liefert bei jedem Aufruf die Zeit als Ganzzahl.
long time(long *timer);
In der Original-Beschreibung steht statt long der Typ time_t, der jedoch nichts anderes ist alslong. *timer ist darin ein Parameter, der zum Einstellen der Zeit dient. Wenn nichts einzustellen ist, übergibt man dafür einen speziellen Wert NULL, der das "Nichts" repräsentiert. Dieser Wert muss übergeben werden, weil die Funktion time() einen Wert erwartet. Es handelt sich dabei um den sog. NULL-Zeiger. Mit Zeigern möchte ich Sie hier aber noch nicht belästigen.

Um time() verwenden zukönnen, ist die Headerdatei ctime zu includen. Nun können Sie zu Beginn des Programms die zeitabhängige Anfangszahl holen:
long az = time(NULL);
und diese der Funktion srand() als Parameter übergeben:
srand(az);

Es geht aber auch ohne die temporäre Variable "az" (temporär = vorübergehend):
srand(time(NULL));
Hier wird zuerst die innere Funktion time() aufgerufen, deren Resultat an die äußere Funktion srand() als Parameter übergeben wird.

Nun liefert die Zufallsfunktion rand() bei jedem Programmstart eine andere Zahl. So können wir einen Computer eine Zahl "würfeln" lassen.