Projekte

Tactical Dungeon Master

Dies ist an sich ein sehr altes Projekt das ich bereits in Angriff nahm, als ich noch mit Visual Basic programmierte. Es sollte dazu dienen meine Fähigkeiten im Programmieren durch das Bewältigen der unweigerlich entstehenden Herausforderungen zu verbessern. Vor allem aber, mich in die Programmiersprache C# einzuarbeiten, die mir mein Bruder ans Herz gelegt hatte.

Ich fing trotzdem in Visual Basic mit dem Projekt an, weil ich damals noch nicht verstanden hatte was Instanzen sind und ich Referenzprobleme mit den Variablen hatte. So konnte ich auf deklarierte Variablen nicht zugreifen und gab C# vorerst auf. Bis ich eine alte Frage, die ich mir in Visual Basic einmal gestellt habe, beantworten konnte. Die Frage “Woher weiß das Programm eigentlich, welche “Version” (Instanz) von der Klasse ich eigentlich meine?”. Dann bin ich auch dahinter gekommen dass ich meine eigenen Klassen deklarieren kann und von da an war für mich C# neu entdeckt.

Es gab mehrfache Anläufe zur Realisierung des Projektes, mit einigen spielbaren Versionen in der Sandbox, in der ich die KI und Methoden ausprobierte. Im aktuellen Ansatz beschäftige ich mich gerade damit, wie das Spielfeld gestaltet werden soll. Soll es aus 6-Ecken oder 8-Ecken oder gar keinen Feldern bestehen? Das hat Auswirkungen auf die Programmierung der KI, das Sichtfeld, das Schussfeld und die taktischen Möglichkeiten.

Die Informationen zum Spielstand speichere ich auf meinem Webserver in einer Datenbank und in einer Log-Datei. Die lädt der Spieler bei seiner Anmeldung herunter und der Client interpretiert die Einträge, sodass der korrekte Spielfortschritt, inklusive Items, Erfolge und Ingame-Währung, angezeigt wird. Dazu muss ich mit dem Client PHP-Skripte ansprechen die dann die Daten aus der Datenbank holen bzw. den Zugriff auf die Log-Datei ermöglichen und Änderungen des Spielstandes speichern. Es ist also mit der Zeit durchaus einiges an Herausforderungen hinzugekommen.

Hotel

Als ich bei einem Freund das Brettspiel “Hotel” gespielt hatte – eine Variante von Monopoly – hatte ich mir gedacht: so ein Spiel könnte ich auch programmieren. Also zumindest die Mechaniken könnte ich in einem Programm nachstellen. Es begann das aufwendigste Projekt in meiner Zeit in Visual Basic. Tatsächlich ist es mir gelungen das Spielfeld und die teils etwas komplizierten Spielregeln zu übernehmen. Dabei musste beachtet werden, dass man nur bauen kann, wenn man auf bestimmte Felder kam. Und in einer Runde – bis man Start wieder erreicht hatte – entweder nur bauen oder nur kaufen konnte. Außerdem konnte der Spieler, kam er auf ein Kaufen-Feld, nur eine bestimmte Auswahl von Hotels kaufen – auch vom anderen Spieler.

“Hotel-Mechsim” habe ich das Projekt damals genannt. Module verwendete ich lediglich zur Gliederung des Codes, der die 10.000-Zeilen Marke schon bald überstieg. Was vor allem daran lag, dass ich Code kopiert und einmal für den ersten Spieler und dann für den zweiten Spieler schrieb. Wie bereits erwähnt, wusste ich noch nicht was Instanzen und Referenzen sind. In späteren Projekten habe ich dann mit hash tables, auf die ich in der Dokumentation gestoßen war, gearbeitet. Heute würde ich sagen, ich hatte ein Wörterbuch <string, Control> benutzt.

Über Bildschirmübertragung habe ich dann zusammen mit diesem Freund dieses Spiel dann auch einmal ausprobiert. Es war auch eine Zeit lang spielbar. Als allerdings unerklärliche Fehler auftraten, war oft die gesamte Partie hinüber und das war dann doch zu ärgerlich. Der Code war riesig und trotz Kommentaren schlecht zu überblicken – auch weil vieles doppelt geschrieben wurde. Deshalb habe ich das Projekt nach ein paar weiteren Debug-Versuchen eingestellt. Aber die Erfahrungen waren durchaus lehrreich und ich bin zum Entschluss gekommen, dass ich Programmieren zum einen richtig toll finde und zum anderen es nur durch eigen initiierte Projekte wirklich lernen werde. Also startete ich weitere Projekte.

Das MAZE-Experiment

An sich ging es darum darzustellen, wie wichtig ein Gedächtnis für die evolutionäre Entwicklung ist. Dazu sollten Spielfiguren selbstständig durch ein Labyrinth nach voreingestellter Strategie (KI) laufen. Das zu erwartende Ergebnis war, dass die mit Gedächtnis schneller ans Ziel kommen und damit einen evolutionären Vorteil hätten. Besonders, wenn sie aus Erfahrungen gelernt haben, in späteren Labyrinthen in der Lage waren, Hinweise erneut richtig zu interpretieren. Und natürlich was passiert, wenn sich die Bedeutung dieser Hinweise plötzlich ändert. Dann überleben nur die, die das rechtzeitig erkennen und sich anpassen. Die Bedeutung der Hinweise war assoziiert mit Institutionen, also Symbolen mit Bedeutungsinhalt (soziologisches Verständnis von Institutionen).

Die Anwendung lief auch erfolgreich. Geschrieben in Visual Basic und mit der Benutzung von “hash tables” konnte ich über die ausführende Anwendung Labyrinthe erstellen, diese speichern und später wiederherstellen. Außerdem konnte ich Figuren durch das Labyrinth schicken die dann selbstständig zu ihrem Ziel fanden.

Das Projekt wurde eingestellt, als ein Freund mir sagte, dass die Figur immer ans Ziel kommen wird, wenn sie nur einfach der Wand folgt. Das heißt: zuerst links, dann geradeaus, dann rechts und dann zurück – so die Versuchsreihenfolge zur Bewegung der Figur. Nachdem ich das ausprobiert hatte, verabschiedete ich mich vom Projekt. Die Idee war aber trotzdem gut.

ServerClientClass

Bereits zu Visual Basic–Zeiten hatte ich ein Modul geschrieben, das universell für alle späteren Projekte einsetzbar sein sollte um eine Verbindung zwischen Server und Client aufzubauen und die empfangenen Informationen aufzugreifen. Es war nur eine Frage der Zeit bis ich eine eigene Bibliothek dazu in C# für zukünftige Netzwerkspiele verfasste. Dabei musste ich lernen, wie man die Endpoints asynchron abhört und ein eigenes Event programmiert, das empfangene Daten dann anderen Klassen zur Verfügung stellt. Hier kam ich zum ersten Mal auch mit den Problemen des Multithreading in Berührung, mit Delegaten und Genetics. Zwar benutzte ich bereits in Visual Basic ein List Of<T>, aber dass das generische Listen waren wusste ich damals noch nicht. Sie haben damals meine alt gedienten ArrayLists abgelöst.

Diese Bibliothek steht noch auf meiner Liste der zu veröffentlichen Arbeiten. Allerdings müsste ich sie noch einmal testen bevor ich sie veröffentliche und dazu habe ich momentan keine Zeit.

StoreClassLibrary

Ein Problem das ich immer wieder hatte war das Speichern meiner Programmeinstellungen und meiner eigenen Klassen. Die Features die Microsoft von Haus aus anbietet halte ich für zu umständlich und schlichtweg unbrauchbar.

Bei der Speicherung der Einstellungen über die Eigenschaften des Projektes – das Programm speichert die Einstellungen im XML-Format im Ordner “Lokale Einstellungen” – kam schnell das Problem auf, dass ich auf die Einstellungen nicht von einer anderen Bibliothek aus zugreifen kann. Das war allerdings nötig, wenn ich das Programm aufteilen möchte, damit bei späteren Aktualisierungen nicht unnötig große Daten heruntergeladen werden sollen.

Und die Serialisierung halte ich für einen schlechten Witz. Wenn sich die Klasse ändert, gehen alle Informationen verloren. Für ein sich entwickelndes Projekt einfach nicht zu gebrauchen.

Die Lösung bestand anfangs in einer Klasse die über Tokens die Informationen in eine Textdatei speicherte und dann wieder auslesen konnte. Bis ich es in Angriff nahm das ein für alle Mal zu lösen und daraus eine eigene Bibliothek zu machen.

Heute speichere ich meine Einstellungen in einer Instanz der StoreClass (sc) über sc.Add(string Key, string Wert) und rufe sie über eine geladene StoreClass wieder auf sc.Get(string Key, T standard [, int count]). Alle Informationen werden in einem Wörterbuch <string, string> gespeichert. Beim Aufrufen der Variablen über einen Schlüssel gibt man einen Standard-Wert an. Wenn der Schlüssel vorhanden ist, dann wird der Wert im Typ des angegebenen Standard-Wertes zurückgegeben. Wenn der Schlüssel nicht vorhanden ist, dann wird der Standard-Wert zurückgegeben. Und sollte count angegeben sein, dann bekommt man eine generische Liste im Typ des Standard-Wertes mit dem angegebenen count, notfalls mit dem Standard-Wert aufgefüllt, zurück. So bekommt man immer zuverlässig gültige Werte.

Die Einstellungen lassen sich im Klartext, komprimiert oder verschlüsselt mit Rijndael speichern. Es gibt zahlreiche Methoden und Überladungen die das Benutzen der Klasse kinderleicht macht.

Der Los-Generator und Fluke

Als ich mich mit der Idee beschäftigte in meinem Spiel Tactical Dungeon Master auch vereinzelte Glücksspielchen für die Spieler anzubieten, fragte ich mich, wie ich denn die Auslosung realisieren könnte, sodass das auch als fair und zufällig empfunden wird.

Mit dem Los-Generator habe ich versucht “mehr zufällige” Zahlen zu generieren und diese den Teilnehmern zuzuordnen. Es gibt dazu eine Online-Version (https://fluke.magony.org) und eine Offline-Version in C# geschrieben.

Die PLZ und BLZ Bibliotheken

Ich habe mich auch bereits an einem Programm für ein simples Kassenbuch probiert. Allerdings habe ich daraus dann ein immer komplizierter werdendes Programm entwickelt das einem ermöglichen sollte, detaillierte Angaben zu seinen Ausgaben zu machen, um später ganz genau analysieren zu können, für was man sein Geld eigentlich ausgegeben hat. An diesem Punkt habe ich dann irgendwann aufgegeben – auch weil das Interesse am Programm mit der Zeit verloren ging.

Allerdings überlebten zwei Bibliotheken. Die BLZ-Bibliothek sollte bei der Eingabe der Bankleitzahl den Namen der Bank in ein Textfeld schreiben. Von der Bundesbank habe ich dazu eine Liste heruntergeladen in der die nötigen Informationen vorhanden waren. Weil in dieser Liste allerdings noch viel mehr stand, habe ich PAN, PIC usw. ebenfalls noch hinzugefügt. Dazu schrieb ich eine Anwendung die die Liste der Bundesbank parsen konnte und in eine Textdatei umwandelte, die ich bei der Initialisierung der Klasse dann zum Laden verwendete.

So gehörte zu der BLZ-Bibliothek auch immer eine BLZ-Quelle.txt. Und da ich gerade dabei war, habe ich auch dasselbe mit einer Liste von PLZ und Ort gemacht. Die PLZ-Bibliothek ist in meinem Forum veröffentlicht, die BLZ-Bibliothek müsste ich vorher nochmal aktualisieren.

Der Geldkalender

Eines der neuesten Projekte. Die Idee kam, als ich mir einen Kalender mit 12 Monaten auf einer DIN-A4 Seite ausdruckte, um mir die Beträge zu notieren, wann welche Rechnungen von meinem Konto abgebucht werden. Ich dachte mir, dass könnte ich auch in einem Programm realisieren und Voilà!

Die aktuelle Version ermöglicht bereits das Eingeben und Speichern von Beträgen, merkt sich Eingaben und bietet eine Filteroption. Das Projekt ist zurzeit pausiert, weil die Bewerbung drängt. Näheres zum Projekt gibt es in meinem Forum.

Meine Webseite und das Forum

Als ich letztes Jahr wieder keine Ausbildung bekommen habe, war ich natürlich sehr enttäuscht. Allerdings hatte ich mir vorgenommen meine berufliche Zukunft in der Programmierung zu finden und habe mich deshalb dazu entschlossen, mich einfach schon einmal selbst fortzubilden.

Dazu gehörte ein Internetauftritt und später ein Forum. Schon als ich acht Jahre alt war habe ich mich mit HTML auseinandergesetzt. Damals hatte ich von meinem Vater einen Computer geschenkt bekommen und Zugriff auf das Internet. Mein Bruder selbst befand sich damals mitten in seiner Ausbildung zum Fachinformatiker für Systemintegration – wechselte später zu Anwendungsentwicklung. Als ich ein Buch über HTML bei meinem Vater gefunden hatte das richtig toll illustriert war, beschloss ich das Wissen aus dem Buch anzuwenden und eine Webseite zu erstellen, die anderen dieses Wissen näher brachte. Um nicht zu sagen, ich habe bei dem Projekt den Inhalt des Buches auf eine Webseite befördert.

Deshalb war mir HTML keineswegs fremd als ich letztes Jahr im September meine eigene Homepage erstellte. Über YouTube-Videos und Tutorials im Internet habe ich stets Antworten auf all meine Fragen gefunden und konnte fast all meine Ideen realisieren. Zumindest die, die mit der Realität etwas gemein hatten.

Das Forum kam erst später hinzu. Zunächst lernte ich was ein CMS ist und bin dann auf phpBB gestoßen. Als ich das auf meinem Computer eingerichtet hatte, fiel mir auf, wie einfach es ist, phpBB zu bedienen und Inhalte hinzuzufügen. Auch gefiel mir das ausgesuchte Design.

Da ich für Neues immer ein offenes Herz habe, habe ich mir auch gleich überlegt aus meiner Webseite ein einziges Forum zu machen. Da dies allerdings meine Möglichkeiten einschränken würde meine Internetseite zu gestalten, wird das Forum wohl eine Subdomain bleiben und als nächster Schritt ein CMS für magony.org entwickelt.

Das Design dieser Subdomain gefällt mir momentan richtig gut und ich denke, dass ich dieses für das geplante CMS verwenden werde. Andere CMS wie Drupal, joomla oder TYPO3 möchte ich nicht verwenden, weil es sich hier nicht um eine fremde Seite, sondern um meine eigene Seite handelt. phpBB ist als Forum und als Subdomain durchaus in Ordnung. Aber meine Internetseite sollte komplett mein eigenes Werk sein und sie sollte mit meinen Fähigkeiten wachsen. Und selbstverständlich sollen meine Fähigkeiten an meiner Internetseite wachsen. Mich interessiert wie und warum etwas funktioniert und ich möchte mich an meiner eigenen Schaffenskraft erfreuen.