Prof. Franz Schweiggert Abteilung Angewandte
Informationsverarbeitung 14. Januar 2004
Christian Ehrhardt Blatt 4
Unix-basierte Implementierung kleiner Datenbanken (WS 03/04)
Abgabetermin 22.01.2004
Wer bereits weiß, wie Minesweeper funktioniert, kann diesen Abschnitt
überspringen. Für die anderen: In einem rechteckigen Spielbrett sind
Tretminen versteckt. Ein einzelnes Feld des Spielbrettes kann eine oder
keine Mine enthalten. Ziel des Spiels ist es, auf alle Felder zu klicken,
die keine Mine enthalten. Klickt man auf ein Feld, das eine Mine
enthält, so hat man verloren. Das Spiel ist gewonnen, wenn man auf
alle Felder geklickt hat, die keine Minen enthalten.
Hat man einmal auf ein Feld geklickt, das keine Mine enthält, so
erscheint dort eine Zahl zwischen 0 und 8, die angibt, wieviele Minen
insgesamt in den direkt benachbarten Feldern versteckt sind. Mit Hilfe
dieser Zahlen kann man dann auf weitere Felder schließen, die keine
Minen enthalten.
In diesem Blatt soll eine einfache Version dieses Spiels programmiert
werden. Folgende Funktionen müssen mindestens implementiert sein:
- Die einzelnen Felder des Spielbrettes sind quadratische Buttons
mit einer Größe von 40x40 Pixel. Ein noch nicht angeklickter
Button zeigt ein Fragezeichen, ein angeklickter zeigt die entsprechende
Zahl.
- Mehrmaliges Anklicken eines Buttons soll nicht möglich sein.
- Mit der rechten Maustaste soll ein noch nicht angeklickter
Button als Mine markiert werden können. Dies dient lediglich
als Gedächtnisstütze für den Spieler. Auf einem solchen Button
erscheint das Bild einer Bombe in Schwarz. Erneutes Klicken mit der
rechten Maustaste löscht die Markierung wieder.
- Beim Klicken auf einen Button, unter dem sich die Zahl 0 verbirgt
sollen automatisch alle benachbarten Buttons ebenfalls angeklickt
werden (dies gilt rekursiv).
- Wenn das Spiel beendet ist, sollen alle Zahlen und Minen
angezeigt werden. Die Felder mit Zahlen, genau so, als ob sie
angeklickt worden wären und die Felder mit einer Mine
- in Form einer Bombe in Grün, falls das Spiel gewonnen wurde.
- in Form einer Explosion in Rot, falls das Spiel verloren wurde.
- Es soll jederzeit möglich sein, das Spiel abzubrechen und ein
neues zu beginnen. Über Radiobuttons soll dabei für das neue
Spiel ein kleines, ein mittleres oder ein großes Spielfeld
ausgewählt werden können.
- Es empfiehlt sich, unter etwa einem Fünftel aller Felder
eine Mine zu verstecken.
- Zwei Bilder von einer Bombe und von einer Explosion gibt es
auf der Homepage der Vorlesung in der passenden Größe.
- Farboptionen, die für den Text in Buttons verwendet werden
können, gelten ebenso in Bitmaps.
- Setzt man den Wert einer Gestaltungsoption auf undef, so
hat dies in der Regel den selben Effekt, wie wenn die Option
garnicht angegeben worden wäre.
- Normalerweise paßt der Packer die Größe eines Parent-Widgets
an die Größe der enthaltenen Slave-Widgets an. Das kann dazu
führen, daß sich etwa ein Frame auf die Größe seines Inhalts
verkleinert, obwohl ausdrücklich eine feste Größe angegeben
wurde. Mit der Methode packPropagate läßt sich das verhindern.
Etwa so:
my $f = $main->Frame (-width => 40, -height => 40)->pack ();
$f->packPropagate (0);
- Klicken mit der rechten Maustaste löst das Ereignis
<Button-3> aus, auf das mit Hilfe von bind
reagiert werden kann. Diese Bindings bleiben auch dann wirksam,
wenn der Status des Buttons auf disabled gesetzt wird!
Beim Klicken mit der rechten Maustaste auf eine bereits zu sehende
Zahl sollen alle nicht als Bombe markierten Nachbarfelder angeklickt
werden, wenn genau so viele Nachbarfelder als Bombe markiert wurden,
wie die Zahl auf dem Feld angibt.
Christian Ehrhardt
2004-01-14