Universität Ulm - Abteilung Angewandte Informationsverarbeitung
12. Übungsblatt (30.01.02 bis 13.02.02) zur Vorlesung
WS 2001/2002
Allgemeine Informatik I für Wirtschaftswissenschaftler und Biologen
1. Alles eine Frage der Logik! (6 Punkte)
Gegeben sei ein Oberon-Programm mit der Vereinbarung
Vereinfachen Sie die folgenden Ausdrücke unter Verwendung der allgemeinen Rechenregeln (vgl. Abschnitt 6.7.12 im Skript):
Stellen Sie Ihrem Tutor Ihre Lösungen vor und erklären Sie ihm
die wichtigsten Schritte!
2. Hit The Middle! (14 Punkte)
In den letzen Wochen sind in der Vorlesung die wichtigen
Oberon-Sprachelemente ARRAY, RECORD und
PROCEDURE besprochen worden. Um deren Verwendung nochmals zu
trainieren, sollen Sie in diesem Übungsblatt ein kleines Spiel
programmieren: Hit The Middle.
Das Spielfeld ist quadratisch (ähnlich zu einem Schachbrett) aufgebaut
und hat eine ungerade Seitenlänge. Auf diesem Spielfeld springt man
mit Hilfe eines Zufallsgenerators hin und her und versucht,
möglichst viel Geld zu gewinnen.
Der Spieler startet das Spiel mit $10,000. In jeder Runde wird durch
den Zufallsgenerator bestimmt, auf welches Feld er springen muß.
Es gibt die folgenden Gewinn- bzw. Verlustfelder:
Es gibt drei Möglichkeiten, wie das Spiel enden kann:
Was die Datenstruktur in Oberon angeht, so empfehle ich Ihnen die
folgenden Konstanten- und Typvereinbarungen:
Die jeweils aktuelle Spielposition wird in einer Variable vom Typ
FieldPosition abgelegt; außerdem sollen alle Positionen des
Spiels in einem ARRAY vom Typ SavedMoves gespeichert und am
Ende ausgegeben werden.
Lagern Sie möglichst viele Funktionen und Operationen in
Prozeduren aus. Das Hauptprogramm sollte am Ende nur noch zur
Steuerung des Spiels dienen und den Kontostand des Spielers verwalten.
Hier sind ein paar Anwendungs-Beispiele zu
Hit The Middle.
Zum Schluß noch eine kleine Zusatzfrage:
Nützliche Hinweise:
Viel Erfolg!!!
Bei einer Spielfeldbreite von 7 ergibt sich aus diesem Schema eine Aufteilung in
ein Mittel-, 12 Diagonal- und 20 Randfelder. Somit ist das Spiel auch
mathematisch fair, denn der erwartete Gewinn für jede Runde ist 0.
CONST MaxGameLength = 10; (* How long do you want to play? *)
FieldSize = 7; (* This number must be odd! *)
TYPE FieldPosition = RECORD
x,y : INTEGER;
END;
SavedMoves = ARRAY MaxGameLength OF FieldPosition;
Spielen Sie Ihr Programm möglichst oft und notieren Sie sich, wie
Ihre Spiele jeweils geendet haben. Was fällt Ihnen dabei auf? Widerspricht
dies der (rechnerisch korrekten) Annahme, daß das Spiel fair ist?
PROCEDURE GetRandomNumber(max : INTEGER) : INTEGER;
(* Returns a random number between 0 and max-1 *)
BEGIN
RETURN (SHORT(RandomGenerators.Int32Val()) MOD max);
END GetRandomNumber;