Lektion 15:Nimm-SpielJetzt wird es aber Zeit, ein wenig zu spielen! Ein recht bekanntes und einfaches Spiel ist das Nimm-Spiel (mit zwei m): Es werden z.B. zwanzig Münzen auf den Tisch gelegt, und die beiden Spieler dürfen abwechselnd eine, zwei oder drei Münzen nehmen. Wer die letzte Münze nimmt, der hat gewonnen. Wir wollen dieses Spiel gegen den Rechner spielen. Davor steht aber zuerst einmal das Programmieren. Der große Rahmen des Programms könnte ungefähr so aussehen:
Das Programm scheint sehr einfach und übersichtlich zu werden, nur die Zeilen
und
könnten noch ein wenig Aufwand bedeuten. Um diesen Aufwand drücken wir uns zunächst, indem wir diese beiden Zeilen als Funktionen auslagern und zunächst nur das Hauptprogramm schreiben. Dazu muß aber die Schnittstelle der Funktionen klar sein. Das heißt, es muß klar sein, welche Parameter die Funktion bekommt, und welchen Wert sie zurückgibt. Sinnvoll ist z.B. folgendes: Die Funktion bekommt als Parameter die aktuelle Münzenanzahl und gibt zurück, wie viele Münzen weggenommen werden sollen. Hier das Hauptprogramm:
Angenommen, die beiden Zug-Funktionen seien korrekt, dann müßte ja alles funktionieren. Wir schreiben die einfachere zuerst:
Und gleich darauf die schwierigere. Und davor steht, eine Gewinnstrategie zu finden. Wenn nur eine Münze auf dem Tisch liegt, und man ist am Zug ist, dann nimmt man sie. Ebenso bei zwei oder drei Münzen. Aber bei vier Münzen ist jeder Zug ein Fehler, denn nimmt man eine, dann nimmt der Gegner drei, nimmt man zwei, dann nimmt der Gegner auch zwei, nimmt man drei, dann nimmt der Gegner eine. Hier eine kleine Aufstellung, wie viele Münzen man bei welcher Münzenanzahl nehmen sollte: 1 => 1 2 => 2 3 => 3 4 => egal 5 => 1 6 => 2 7 => 3 8 => egal 9 => 1 Oh! Das sieht, wie der geübte Programmierer sofort sieht, nach dem Modulo-Operator aus. Zum Vergleich die Zahlen modulo 4: 1%4==1 2%4==2 3%4==3 4%4==0 5%4==1 6%4==2 7%4==3 8%4==0 9%4==1 Aha! Überall, wo eine 0 steht, ist egal, was man zieht (z.B. nur eine Münze), sonst zieht man Münzenanzahl modulo 4. Das ergibt also folgende Funktion:
Und sie haben sicher daran gedacht, die beiden neuen Funktionen vor der main-Funktion, aber nach der include-Zeile einzufügen. Würden Sie die Funktionen nach der main-Funktion einfügen, dann wären sie aus der main-Funktion nicht aufrufbar. Der Compiler liest sich nämlich die Datei von oben nach unten durch und merkt sich unterwegs alle wichtigen Sachen. Er macht aber keine Versuche, etwas zu verwenden, das erst weiter unten steht. Einsendungen:Darf man Endlosschleifen benutzen?Übung:Der Rechner soll auf dem Bildschirm jeweils anzeigen, wie viele Münzen er nimmt. Außerdem sollen für den Menschen nur gültige Züge möglich sein. Schreiben Sie dazu in die Funktion zugMensch eine Schleife, die so lange Eingaben erwartet, bis der Spieler einen gültigen Zug macht. Eine andere Variante dieses Spiels hat die folgende Gewinnregel: Wer die letzte Münze nimmt, der hat verloren. Schreiben Sie ein Programm für diese Spielvariante. Einsendungen:Lösungsvorschlag ALösungsvorschlag B Warum geht 1<=ergebnis<=3 nicht? 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 |