|
||||||||
MySweeper: Noch'n Javascript-MinesweeperJetzt konnte ich es doch nicht lassen: Ich dachte, nee, es ist zu langweilig, Minesweeper selbst zu programmieren, und ich habe auch gar keine Zeit, mich in Ruhe damit zu befassen. Abends oder zwischendurch mal ein Spiel in die Sammlung einzugeben oder nach neuen Spielen zu suchen, ja, das geht, aber nicht, ein Spiel von Grund auf neu zu programmieren. Neulich habe ich für die Webseite der Kinderkrippe meiner Frau den Code aus anderen Javascript-Minesweeper-Spielen zu einem neuen Spiel: "Tritt keinen Käfer tot!" zusammengestellt, aber so ganz von Anfang an, sich Gedanken zu machen, wie die einzelnen Abläufe des Spiels genau funktionieren und in Programm-Code umzusetzen sind, dazu, so dachte ich, habe ich keine Ruhe. Aber dann kam es doch plötzlich über mich: Ich wollte immer schon mal genauer verstehen, wie man in Javascript objektorientiert programmiert, und da dachte ich, warum nicht mal diese Technik an dem überschaubaren Bei-Spiel "Minesweeper" ausprobieren und erlernen. Ja, so kam es dazu, dass die letzten drei Nächte kürzer wurden und einige andere Dinge unerledigt blieben, es dafür aber jetzt einen weiteren Minesweeper-Klon gibt: MySweeper, ganz ohne Grafiken. |
||||||||
Wie ich Minesweeper programmierteUm überhaupt erstmal einen Einblick in die objektorientierte Programmierung mit Javascript zu bekommen, gab ich "Javascript" "objektorientiert" bei Yahoo ein und stieß dabei auf diese Seite des Louise-Schroeder-Gymnasiums in München. Hier wird nicht nur kurz und knapp die Erstellung einer Klasse in Javascript beschrieben, sondern auch noch ein kleines Beispiel angeboten: eine Tabellen-Klasse.
Zwei weitere Seiten, die mir weitergeholfen haben, möchte ich erwähnen: im Coder-Wiki wurde mir der Unterschied zwischen privaten und öffentlichen Eigenschaften und Methoden einer Klasse deutlich, das Code-Inside-Blog hat mir des Anlegen von set- und get-Methoden nahegelegt. |
||||||||
What's up, Doc?oder: Was läuft im Innern eines Minesweeper-Spiels ab?
All diese Eigenschaften und Arbeiten muss ein Minesweeper-Programm haben bzw. erfüllen (dazu kommen natürlich noch ein paar andere, wie z. B. die Wiederherstellung des Spiels, die Anzeige der vorhandenen Minen und der verronnenen Sekunden sowie die Änderung des Smileys). Bis zu diesem Zeitpunkt hatte ich gerade mal eine Grundlage, um das Spielfeld erstellen zu können (siehe die obige Tabellen-Klasse). |
||||||||
Eine üble Sache - das Minen-LegenWenn also ein Spielfeld erstellt ist (oder auch während des Erstellens), muss eine bestimmte Anzahl Minen in diesem Feld möglichst wahllos, d. h. vom Zufall bestimmt, verteilt werden. Die wahllose Verteilung der Minen ist aber gar nicht so leicht, wie ich anfangs dachte. Vielleicht hätte ich mir mal ein paar andere Programme ansehen sollen, um schnell eine elegante Lösung für dieses Problem zu finden, denke ich heute; doch mir macht es besonderen Spaß, eigene Lösungen zu ersinnen. Möglicherweise lerne ich dabei auch mehr, als wenn ich nur fremde Lösungen übernehme. Aber ich glaube, dass es dieses Suchen und Finden von Lösungen für Probleme ist, was mich am Programmieren besonders reizt; deshalb hier erst mal mein Ansatz - später will ich auch noch ein paar andere Lösungsmöglichkeiten vorstellen; denn oft macht es auch große Freude, die genialen Ideen anderer zu sehen und von ihnen zu lernen. Ich bin so vorgegengen: Ich erzeuge einen Array mit soviel Elementen, wie das Spielfeld insgesamt Kästchen hat (Reihen * Spalten); dabei gebe ich sovielen Elementen, wie Minen zu verteilen sind, den Wert 9, allen anderen Elementen den Wert 0. Später, wenn die Tabelle erzeugt wird, bekommt jede Tabellen-Zelle einen Wert aus diesem Array; diejenigen, die den Wert 9 bekommen, sind dann die Minenfelder.
P.S. Heute, am 21-Dez-2009, hat mich die Internet-Suche eines Besseren belehrt:
Ich glaube, kürzer und genialer geht's nicht; habe diese Funktion deshalb heute ins Spiel eingebaut. P.P.S. Heute, am 29-Dez-2009 muss ich mich schon wieder korrigieren: die Zufallsverteilung schien mir nicht vollkommen; deshalb habe ich die zweitbeste Lösung implementiert, die ich finden konnte:
// TODO: find a better way for placing the mines
|
||||||||
Andere LösungenWie haben andere das Problem gelöst, die Minen unregelmäßig im Spielfeld zu verteilen?
|
||||||||
Wieviele Minen grenzen an jedes Kästchen?Dies ist nun die nächste Aufgabe: Es muss für jedes Kästchen, das keine Mine enthält, ermittelt werden, wieviele Minen in den acht Käsctchen versteckt sind, die es umgeben.
Die beste Variante dieser Lösung habe ich im Spiel von Lutz Tautenhahn gefunden. Ich finde sie am besten, weil er sie schon beim Setzen der Minen benutzt; wenn eine Mine in ein Spielfeld-Kästchen deponiert wird, wird sofort anschließend allen angrenzenden Feldern mit Hilfe dieser Routine der Minen-Nachbarschafts-Index hochgezählt. Ich glaube, das ist weitaus besser, als erst alle Minen zu verteilen und dann nochmal alle Kästchen durchzugehen und die angrenzenden Minen zu zählen, so wie ich es mache.
|
||||||||
| © 2008 Jürgen Müller-Lütken | P-six.de/sign | Home | Sitemap | Impressum | Kontakt |