Author Archives: Cookie

Cookie

Ich bin.. hmm, wie fange ich nun am Besten an? Mit dem Trivialen: Ich bin Cookie :) Und wie drücke ich nun am besten aus, wie ich mich in Science-O-Matics und in !∃2.0 einbringe? Vielleicht kurz zu mir: Ich habe Mathe mit einem Schwerpunkt in der reinen Mathematik studiert, nach meinem Abschluss dann ein Jährchen mal ein wenig Geld verdient in der ABAP Entwicklung, dann bin ich zurück zur Uni, habe mit einem kurzen Exkurs in die mathematische Optimierung mein Wirtschaftsmathe Diplom vollendet und mache gerade meinen Doktor in der quantitativen Forschung der Wirtschaftswissenschaften, also Optimierung auf Wirtschaftsseite, Modelle aufstellen, Algorithmen analysieren, anpassen oder entwickeln, implementieren.. Ist echt cool :D Also im Herzen Mathematikerin. Nein, Informatikerin.. Beides halt ^^ Für !∃2.0 mache ich vor allem Mathemagie und deren Umsetzung, aber auch viele andere Hintergrundmodelle. Sachen, die man in Spielen schon immer mal cool gefunden hätte.. "einfach" mal umgesetzt als eigenständiges Feature. So ist zum Beispiel die Generierung der Umwelt zum größten Teil aus meiner Feder. Hmm.. was schreibt man sonst noch in eine Vorstellung rein? Das Alter? - Vergesst es, nach dem Alter einer Dame fragt man nicht :P Hobbies? Tja, Computerspiele, wie man sich wohl denken kann ^^ Aber auch LARP, Gesellschaftsspiele und Trading Card Games, nähen und Sport würde ich dazu zählen.. Ehrlicherweise auch Shoppen, Schuhe und Klamotten ;) Ach, warum ich Cookie heiße? Das sollte schnell klar werden ohne dass ich es ausführe ;)

friedliche Koexistenz: zwei Baumarten

Screenshot Blender Baumarten

Screenshot Blender Baumarten

Nachdem der letzte Screenie von einem generierten Baum ja schon ein Weilchen her ist, ist es vielleicht mal an der Zeit für ein Update zur Generierung der Umwelt :) Rechts ein gerade gemachter Screenshot aus Blender heraus, in dem ihr ein paar Bäume von zwei verschiedenen Baumarten (eine der Tanne ähnlich, die andere soll einmal Birke werden) seht. Wie ihr euch also denken könnt, habe ich in letzter Zeit einige Tests mit Bäumen verschiedener Baumarten, die um dieselben Ressourcen konkurrieren. Ach, und ein paar schöne Methoden zum Pflanzenarthandling geschrieben, die einem das Erstellen und Verwalten von verschiedenen Pflanzenarten erleichtern :)

Posted in Graphic-O-Matic. Tagged with , , .

Frohe Ostern :)

Jazz Jackrabbit in seinem schwerstes Level – als Osterhase auf der ganzen Welt gefüllte Kucheneier verstecken! Leider haben wir trotz aller Bemühungen diese Aufgabe nicht geschafft und das Game Over tat weh, glaubt es mir :( Lest die ganze dramatische Geschichte weiter unten.. Trotzdem frohe Ostern wünschen die Science-O-Matics!

Jazz Jackrabbit Osterhase - Game Over

Jazz Jackrabbit Osterhase – Game Over

Jazz Jackrabbit war damals einer meiner Lieblinge.. Damals.. Ist schon ein Weilchen her, oder? Aber er war es :) Und ist leider ein wenig in Vergessenheit geraten, wie es scheint. Aber vielleicht genau deshalb gibt es doch keinen cooleren Osterhasen, den man mal in Gebäckform umsetzen könnte, oder?

Continue reading

Posted in Off-Topic-O-Matic. Tagged with , , .

How-To: Python Scripting in Blender: (0) Einrichtung der Blenderoberfläche

Wenn man hobbymäßig 3D Objekte erstellen und vielleicht sogar animieren möchte, ist Blender wohl die kanonische Wahl. Es ist umfangreich, es gibt viele schöne Tutorials im Netz und dank GPL ist der ganze Spaß auch noch umsonst. Mehr kann ich dazu gar nicht sagen – ich bin dann doch eher der Programmierer als der Graphiker. Und daher kommen wir gleich zu Python – eine Programmier- / Skriptsprache, mit der man solche 3D Objekte auch durch Coding erstellen kann. Und genau darum wird es in dieser Tutorialreihe gehen :)

Standardansicht von Blender

Standardansicht von Blender

In diesem nullten (warum nicht ersten? a) Programmierer dürfen mit Null anfangen zu zählen und b) in diesem Tutorial geht es nur um das Einstellen der Blenderoberfläche, noch nicht um Python – wer Blender schon einmal gesehen hat, wird hier nichts neues lernen..) Tutorial werden wir ausgehend von den Standardeinstellungen von Blender alle Schritte erklären, um ein erstes eigenes Python Script in Blender ausführen zu lassen.

Continue reading

Posted in Code-O-Matic, Graphic-O-Matic. Tagged with , , .

Inspiration aus dem Senckenberg Naturmuseum

groooooßes Saurierskelett

groooooßes Saurierskelett

Wir haben heute unsere letzte Woche in Darmstadt genutzt, um uns im Senckenberg Naturkundemuseum inspirieren zu lassen. Zu unserer Schande muss ich gestehen, dass ich das letzte Mal vor einigen Jahren da war und wir kein einziges Mal drin waren, obwohl wir knappe 30 Minuten entfernt gewohnt haben.. Gerade wollte ich sagen, dass ich leider ein wenig enttäuscht war, es war nicht sooo toll, wie ich es in Erinnerung hatte. Aber:

“Es gibt kein Wunder für den, der sich nicht wundern kann.” – Marie von Ebner-Eschenbach

Also mal nicht so abgeklärt hier tun: Es gibt dort schon viel Cooles zu sehen. Beeindruckend waren die großen Skelette von Dinosauriern, Walen und Panzerfischen aber auch die große Sammlung ausgestopfter Vögel, von denen ich einige kannte, bei anderen aber auch dachte “Wenn die in einem Computerspiel wären – ich hätte gedacht, da hat aber ein Entwickler einen im Tee gehabt..”. Toll waren auch die Sammlungen von Fossilien, Muscheln und kleinen Meeres- und Strandbewohnern. Dazu vielleicht später mehr, wenn wir in der Entwicklung an einer Stelle angelangt sind wo ein Inspirationsfunke dazu gebraucht wird :)

Wo jetzt schon ein Inspirationsfunke nicht schadet ist ja die Generierung der Flora, sowohl der Models als auch des Wachstumsverhaltens. Bisher von mir umgesetzte Pflanzenarten haben alle eine kleine “Standardgröße” von bis zu 5 Metern. Natürlich werden eigentlich selbst schon Birken wesentlich größer, da werde ich die Tage mal dran schrauben. Und ich glaube ich nehme den folgenden Baumstumpf aus dem Senckenbergmuseum mal als neuen Ingame-Maßstab für “große” Bäume :) Schön, dass es noch viele schöne Wörter zur Steigerung gibt, vielleicht wird es ja auch noch “riesige” Bäume geben :) “gigantische” Bäume? “irrsinnig übertrieben gigantomanische” Bäume? ;)

grooooßer Baumstumpf

grooooßer Baumstumpf

Posted in Inspiration-O-Matic, Off-Topic-O-Matic. Tagged with , , .

von Coding, Customizing und Daten

Ich habe in letzter Zeit häufiger mal das Stichwort Customizing genutzt und daher entschieden, mal einen kurzen Artikel über die Unterscheidung von Coding, Customizing und Daten einzustellen. Die Art der Unterscheidung die ich hier eben vorstellen möchte wird in der Praxis viel genutzt und hat dort ihre Eignung für komplexe Systemlandschaften  gezeigt, Systemlandschaften mit mehreren Produktivsystemen und pro Produktivsystemen zu mindestens ein Entwicklungssystem, wahrscheinlicher jedoch mit einem Entwicklungs- und einem Testsystem pro Produktivsystem. Wir unterscheiden also drei Arten von “Informationen”:

  • Coding: Ok, das ist wohl selbsterklärend. Coding ist alles, was der Entwickler in einer Programmiersprache (im Editor) schreibt und für die Ausführung compiliert wird. Coding kann (sollte) nur auf dem Entwicklungssystem geändert werden, nach Freigabe auf das Testsystem transportiert werden und erst nach erfolgreichen Tests auf das Produktivsystem übernommen werden.
  • Customizing: Customizing beinhaltet alle Informationen, die auf der Datenbank gespeichert werden und Einfluss auf die Ausführung des Programms haben. Im Normalfall werden Customizing Einstellungen auf dem Entwicklungssystem geändert und dann wie Coding gehandhabt: Die Änderungen werden auf das Testsystem transportiert, dort getestet und im Erfolgsfall auf das Produktivsystem übernommen. Beispiele für Customizingdaten sind zum Beispiel globale Einstellungen – ist ein Service aktiv? Wie hoch ist der Schwellwert für..? Oder in unserem Fall gehören pflanzenartspezifische Informationen wie in Fast ein Baum im Baum oder von Umweltfaktoren und ihren Auswirkungen angesprochen dazu.
  • Daten: Daten sind auch Information, die auf der Datenbank gespeichert werden, aber anders als Customizingdaten bedarfen diese Daten keinen Tests und werden daher nicht durch die Stufen der Entwicklungslandschaft transportiert. Zu Daten zählen alle Informtionen, die (im Betrieb) im Lifesystem entstehen. Sie werden nicht handisch vom Entwickler eingegeben, sondern im Normalfall importiert oder während des Lifebetriebs erhoben und direkt auf der Datenbank des Produktivsystems gespeichert. Beispiele sind Kundendaten, Bestellungen oder – in unserem Fall – Pflanzen, Vertices, Sprites und Werte von Umweltfaktoren.

So weit zur Unterscheidung, aber warum der ganze Zirkus? Eine “Informationsart” Daten zu haben ist einleuchtend – die täglich anfallenden Daten, die keiner Tests bedarfen täglich, stündlich, minütlich durch die Systeme zu transportieren ist unnötig, langsam und teuer. Dass wir Coding brauchen ist wohl auch klar – wie sonst soll das System wissen, was zu tun ist? Dass Coding nicht direkt im Betrieb geändert werden sollte ist wegen der Gefahr ovn Inkonsistenzen und Bugs auch schnell ersichtlich. Aber warum brauchen wir Customizing? Wir könnten doch einfach alles hart kodieren? Oder direkt auf dem produktivsystem ändern? Letzteres entfällt eben wieder wegen der Gefahr von Inkonsistenzen und Bugs. Zur anderen Option: Einstellungen, Schwellwerte etc. in Customizing Tabellen zu speichern anstatt sie hart im Code zu hinterlegen hat viele Vorteile. Zunächst sind mögliche Änderungen um einiges einfacher – wenn ein Schwellwert doch zu hoch oder zu niedrig ist, dann ist der (sinnvoll benamste) Wert in der Tabelle schnell geändert.  Hunderte von Codezeilen zu durchforsten ist um einiges mehr Arbeit, egal wie gut der Code geschrieben und kommentiert ist. Ein zweiter Vorteil ist die bessere Wiederverwendbarkeit von Code. In der Simulation der Umwelt folgen alle Berechnungen demselben logischen Grundmuster, unabhängig von der Pflanzenart. Alle pflanzenartspezifischen Eigenheiten werden von der Datenbank gelesen und automatisch vom Coding berücksichtigt. Ohen die Verbindung mit Datenbanktabellen müsste ich für jede Spezies eine Kindklasse einführen. Die Liste der Gründe für Customizingtabllen geht noch weiter, aber ich will eure Geduld nicht mehr als nötig strapazieren. In der Zusammenfassung: Coding sollte sich auf die Logic des programms beschränken, alle notwendigen Werte (die getestet werden sollen) gehören in Customizingtabellen. Alle Daten, die nicht getestet oder von einem Entwickler geprüft werden müssen können (direkt) auf der Datenbank des Produktivsystems gespeichert werden.

Posted in Code-O-Matic. Tagged with .

Gimmick: Das Orakelirgendwas :D

Sooo.. Neben den ganzen ernsten (wenn auch hoffentlich coolen) Features, die man gerne in so einem Spiel umsetzen möchte, gibt ja noch eine weitere Klasse von Features, die in keinem guten Spiel fehlen dürfen und (in meiner Vorstellung) noch mehr Spaß zu entwickeln und umzusetzen machen als die großen, coolen, echten Features: Gimmicks :D In einer langen, arbeitsintensiven Session *hust* hatten wir dazu ein paar Ideen, von denen ich eine nun teilen möchte: Die Orakelkluft / -klippe / -höhle ist ein Ort auf der Spielwelt, nicht zu einfach zu erreichen. Wenn man die richtigen Fragen in die Orakelirgendwas ruft, kommt nicht das Echo zurück, sondern eine passende oder eben nicht passende Antwort :) Am besten mit viele schönen Seitenverweisen :) Die Fragen mit Blödsinnsantworten müssen schwer zu finden sein, während man gerne auch spielrelevante ernsthafte Fragen fragen kann. Beispiele für Blödsinn:

  • Yo, my son, which of these is the most stylish thing to wear? – Hey, whatever I select. (Terry Pratchett, the Monks of Cool).
  • Hast Du schon mal jemanden getroffen, den Du noch nicht getötet hast? – DICH habe ich noch nicht getötet.. (Lethal Weapon)
  • Aber was, wenn es kein Morgen gibt? – Heute gab es nämlich auch keinen.. (Täglich grüßt das Murmeltier)

Beispiele für mögliche sinnvolle Fragen:

  • Wer ist der mächtigste Magier/Kämpfer / der beste Schmied / Koch /..? – Antwort: Charaktername, der das entsprechende Talent am höchsten hat. Dies wäre ein schöner, nicht spielrelevanter Anreiz, der beste, der allerbeste zu werden / zu bleiben und einmal vom Orakel genannt zu werden.
  • Fragen zur Geschichte / zur Welt: Wie heißt das Land, aus dem wir kommen? Wie heißt die Magie der blabla?

Vor allem bei den spielrelevanten Fragen müssen wir aufpassen, dass das Orakel ein Gimmick bleibt und nicht zu einem wichtigen Teil des Spieles wird.. Aber ich fände es lustig :)

Posted in Inspiration-O-Matic. Tagged with .

Wo gehört der Himmel hin?

Ich möchte heute mal ein Problemchen ansprechen, das sicher viele von uns kennen und sich auch in meiner neueren Erfahrung als dankbares (Party-) Gesprächsthema erwiesen hat – zumindestens unter Informatikern ;) Die Situation ist folgende: Man proggt (oder konzeptioniert) fröhlich vor sich hin und im aktuellen Konzept gibt es eine Variable, vielleicht ein Customizingwert oder aber auch die Instanz einer Handlerklasse *hust*, die an unglaublich vielen Stellen verfügbar sein muss. An uuuunglaublich vielen Stellen. So, und was nu? Da gibt es doch einiges, was man tun könnte, spontan fallen mir ein:

  • Die Variable durchreichen, von Objekt zu Objekt, von Methode zu Methode, auf dass sie überall verfügbar ist, wo es notwendig ist.
  • Eine global genutzte Vaterklasse mit entsprechender Instanzvariablen erstellen, von der alle anderen genutzten Klassen (oder zumindestens alle, in denen die Variable benötigt wird), erben.
  • Eine globale Variable erstellen.

Wie finden wir das? Das kommt ganz drauf an, wen man fragt und für welche Situation :) Ich persönlich nutze die erste Variante, solange es genügend Programmzweige / Klassen / Methoden gibt, in denen die Variable nicht genutzt wird und in denen das vor allem auch nicht geplant ist. In der Umweltsimulation ist vor Kurzem der Zeitpunkt gekommen, in dem ich diese Variante unschön geworden ist. Da der Datenbankhandler auch sämtliche gepufferten Daten verwaltet, kann es nun vorkommen, dass auf recht niedriger Ebene Änderungen auftreten, durch die die Kenntnis der Handlerklasse notwendig wird. Dadurch wird eine Änderung von allen Methoden in der Aufrufhistorie notwendig, bis man zu einer ersten Methode gekommen ist, die die entsprechende Instanz kennt. Dann bleiben also noch zwei Möglichkeiten übrig. Tendenziell, wenn die Variable tatsächlich im gesamten Programm verfügbar sein darf und muss, gefällt mir die Möglichkeit einer globalen Variable besser. In der Simulation der Umwelt habe ich mich auch für diesen Teil entschieden. Der Programmieraufwand, diese beiden Möglichkeiten ineinander zu überführen ist glücklicherweise gering, da die Änderung sich beschränkt auf die Headerdateien der vorhandenen Vaterklassen und eben die globals.cpp beziehungsweise die (sehr kurze) neue Vaterklasse, von der alle erben sollen. Warum sich für eine Variante entscheiden um direkt im Anschluss über einen Übergang zur anderen Variante nachzudenken? Die Variante über die Vererbung hat den Vorteil, dass man die Kenntnis auf Programmteile beschränken kann. Momentan ist nicht geplant, dass andere Teile der Offtime Berechnungen in das Programm zur Simulation der Umwelt aufgenommen werden. Wenn wir uns doch dafür entscheiden sollten und die neu hinzukommenen Programmteile die Instanz der Handlerklasse nicht benötigen, würde ich einen Wechsel zur Vererbungsvariante in Erwägung ziehen.

Ach, was der Titel hiermit zu tun hat? In der Simulation der Umwelt hat fast jede Klasse eine 1-1 Entsprechung in der realen Welt, die ich auch so wenig wie möglich zu verletzen versuche. Auch dies war ein Grund für die Entscheidung für eine globale Variable. Die Handlerklasse ist – finde ich – wie der Himmel oder die Luft in dieser Entsprechung – immer da, wird von überall genutzt und ist überall bekannt. Den Himmel im Methodenaufruf weiterzureichen oder ihn als Attribut zu vererben stört diese Realwelt-Entsprechungen.

Posted in Code-O-Matic. Tagged with , .

von Umweltfaktoren und ihren Auswirkungen

Als ich zum ersten Mal über die Auswertung der Umweltfaktoren in der Simulation der Umwelt erzählt habe (zum nochmal Nachlesen: Fast ein Baum im Baum), habe ich mich auf die Reihenfolge der Umweltfaktoren in der Auswertung konzentriert und die dort angesprochene zweite Frage (2. Wie bildet man alle möglichen Beeinflussungsarten wie “beeinflusst die Photosyntheserate” oder “setzt eine obere Grenze” ab?) auf später vertagt – jetzt ist später :) Noch einmal kurz die Ausgangslage: Pflanzen werden von verschiedenen Umweltfaktoren auf die eine oder andere Art beeinflusst. Die Beeinflussung kann abhängig von anderen Umweltfaktoren und deren Konzentration in der die Pflanze umgebenen Umwelt und von der Größe der Pflanze sein und kann verschiedenen Auswirkungen haben, so zum Beispiel Veränderung der der Pflanze zur Verfügung stehenden Energiemenge durch eine feste obere Grenze oder prozentuale Verringerung haben. Welche Umweltfaktoren die Pflanze auf welche Art beeinflussen ist abhängig von der Pflanzenart und muss dementsprechend vom Coding flexibel gehandhabt werden.

Welche Anforderungen stellen sich also?

  • Die Berechnung der Beeinflussung muss an die Pflanzenart angepasst werden können.
  • Änderung und Neuanlage von Pflanzenarten muss ohne Änderung des Codings (Stichwort Customizing) möglich sein.
  • Die Aufnahme eines Umweltfaktors kann von mehreren anderen Umweltfaktoren und auch von Produkten anderer Umweltfaktoren beeinflusst werden.
  • Die Beeinflussungsart kann aus einer Liste von Beeinflussungsarten gewählt werden.
  • Die Beeinflussung kann zeitabhängig oder zeitunabhängig sein.

In der Umsetzung habe ich mich für die Speicherung der Beeinflussung in einer Customizingtabelle entschieden. Im Coding gibt es eine Methode, die die Datensätze aus dieser Customizingtabelle interpretiert und die Berechnung durchführt. Jeder Datensatz enthält die Pflanzenart, den Umweltfaktor, dessen Beeinflussung berechnet werden soll, die Beeinflussungsart, ein Flag, ob die Beeinflussung zeitahängig ist und natürlich alle notwendigen Informationen zu Abhängigkeiten von anderen Umweltfaktoren, dazu zählen bis zu zwei IDs anderer Umweltfaktoren und ein Zahlenwert. In allen bisher angedachten Pflanzenarten hängt kein Umweltfaktor von einem Produkt von mehr als zwei anderen Umweltfaktoren ab. Wenn dieser Fall dennoch eintritt, muss ein Umweg über einen Dummy-Umweltfaktor gewählt werden: Gilt beispielsweise Umweltfaktor1 = Umweltfaktor1 – Zahlwert * Umweltfaktor2 * Umweltfaktor3 * Umweltfaktor4, kann dies umgesetzt werden über DummyUmweltfaktor1 = Umweltfaktor2 * Umweltfaktor3 und Umweltfaktor1 = Umweltfaktor1 – Zahlwert * DummyUmweltfaktor1 * Umweltfaktor4. Auch die Energie wird als Pseudoumweltfaktor umgesetzt, ebenso die Reserveenergie und die Fortpflanzungsenergie. So können alle Werte nach demselben Vorgehen berechnet werden.

In der angesprochenen Methode in der Simulation wird in einer Schleife dann der Einfluss aller Umweltfaktoren in der (mit der im obigen Artikel erklärten topologischen Sortierung) Reihenfolge berechnet. Die ermittelten Werte werden gespeichert und können dann von den anderen Methoden der Simulation ausgelesen werden. Momentan werden nur die genannten Pseudoumweltfaktoren von anderen Programmteilen genutzt, aber es ist aufgrund der gewählten Speicherung der Ergebnisse ohne weiteres möglich, dies auch auf andere Umweltfaktoren auszuweiten. So könnten Pflanzen einer bestimmten Art aufgenommenes Wasser speichern, dies könnte sich in der Wuchsform niederschlagen und letzten Endes auch vom Spieler genutzt werden. :)

Posted in Code-O-Matic. Tagged with , .

So weit, so gut – der aktuelle Stand der Datenbank Handlerklasse

Nachdem eine gemeine Erkältung zuerst Chro und dann mich außer Gefecht gesetzt hat, hat die Umsetzung der Datenbank Handlerklasse leider länger gedauert als gedacht. Aber nun steht sie, zumindestens soweit wie geplant. Sämtliche Datenbankzugriffe laufen über sie, die Pufferfunktionalitäten sind implementiert. Der Rahmen für die Berechtigungsprüfungen ist fertig, doch mangels Berechtigungskonzept werden momentan alle Zugriffe erlaubt. Ähnliches gilt für die Logfunktionalitäten – noch wurde nicht entschieden, was ich alles mitloggen möchte. Aber mit dem momentanen Stand kann man leben und – noch viel wichtiger – weiter arbeiten. Ab morgen werde ich mich also wieder dem eigentlichen Thema, dem Feinschliff der Simulation widmen.

Posted in Code-O-Matic. Tagged with , .

Be my Valentine..

Man mag den Valentinstag ja nicht mögen – ich bin selber kein besonderer Fan. Aber als Grund für kitschiges Naschwerk taugt er doch allemal :) Also wünsche ich allen einen romantisch-leckeren Valentinstag :) Ach, und halte für die Zukunft fest: Schokolade hält nicht auf Wackelpudding :(

Posted in Off-Topic-O-Matic. Tagged with .

Hauszeichen

Hauszeichen - Wappen

Hauszeichen – Wappen

Beim Stöbern in den Urlaubsfotos von unserem Pragurlaub im letzten Jahr bin ich wieder bei den Hauszeichen hängen geblieben und dachte mir, ich teil das mal mit euch :) Ein Hauszeichen ist das Zeichen einer Familie außen an einem Haus oder Gegenstand. Es zeigte nicht nur den Besitz an, sondern erlaubte auch das eindeutige Erkennen von Häusern ohne Straßennamen und Straßennummern, ohne Lesen können zu müssen. Im Anhang sind Beispiele aus Prag zu sehen, hier sind diese Hauszeichen noch aus dem 14. – 18. Jahrhundert erhalten. Die Häuser sind heute noch bekannt als “Haus zu den Geigen / zum Löwen / zu den Herzen / zu den Straußen / zum Einhorn” (letzteres hatte als Hauszeichen eine einhornige Ziege). Das fände ich auch in einem Spiel (wenn es denn Houing gibt) eine sehr elegante Möglichkeit, um Besitz eines Spielers anzuzeigen :)

Posted in Inspiration-O-Matic. Tagged with , .

Ordnung schaffen: eine Datenbank Handlerklasse

Eigentlich wollte ich am Wochenende dafür sorgen, dass endlich mal ein paar Screenshots von einem ganzen Wald (noch ohne schöne Texturen, aber immerhin..) online kommen. Dafür notwendig waren ein paar Änderungen, die das Langzeitverhalten der Wuchsform der Bäume betreffen. Uneigentlich.. ist mir mein stiefmütterliches Behandeln der Datenbankzugriffe auf den Kopf gefallen.. Irgendwo schreibt eine Methode Werte auf die Datenbank, die ich zu dem Zeitpunkt da noch nicht drin haben will. Aber wo? Es war immer geplant, dass ich das Coding nochmal aufräume, aber ich hatte gehofft es verschieben zu können bis alle Grundfunktionalitäten stehen. Und dann gründlich aufzuräumen, ohne die Funktionsweise zu schädigen. Aber statt mich durch den Code zu wühlen und den “schuldigen” Datenbankzugriff händisch rauszusuchen, ziehe ich zu mindestens dieses Schritt des Aufräumens vor und implementiere ein zentrales Handling der Datenbankzugriffe.

Folgende Anforderungen an das Handling habe ich mir gestellt:

  • Sämtliche Datenbankzugriffe laufen über die Methoden der Handlerklasse, außerhalb von dieser ist die Verbindung zu Datenbank nicht bekannt.
  • Die Handlerklasse ist verantwortlich für die Datenkonsistenz innerhalb des Programmaufrufs und für die Verwaltung entsprechender Sperreinträge auf der Datenbank.
  • Die Handlerklasse dient als Puffer zwischen Datenbank und Programm.
  • Programmteile brauchen die Berechtigung, um Datensätze des Puffers auslesen oder schreiben zu dürfen.
  • Alle Datenbankzugriffe werden mitgeloggt.
UML Buffer

UML Buffer

Nebenstehend ein Diagramm, das den groben Ablauf des Handlings der Datenbankabfragen zeigt. Jede Datenanfrage der Umweltsimulation wird an den Datenbankhandler gestellt. Dieser prüft, ob die Berechtigung vorhanden ist, ansonsten wird abgebrochen. Wenn diese Daten noch nicht geladen wurden, werden sie aus der Datenbank geladen. Es wird geprüft, ob die Daten einen Sperrvermerk haben, ansonsten werden die entsprechenden Datensätze ausgelesen und mit einem Sperrvermerk versehen. Die ermittelten Daten werden in die benötigten Strukturen überführt und in den Puffer geschrieben. In beiden Fällen werden die Informationen aus dem Puffer an die Simulation zurück gegeben. Jede Änderungsanfrage der Umweltsimulation wird ebenfalls an den Datenbankhandler gestellt. Dieser prüft, ob die Berechtigung vorhanden ist, ansonsten wird abgebrochen. Wenn die Berechtigung vorhanden ist, werden die Daten im Puffer geändert. Zusätzlich können aus der Simulation heraus das Committen oder Verwerfen der Änderungen angestoßen werden.

Posted in Code-O-Matic. Tagged with , , , .

Mein NSC versteht mich nicht..

Wäre das nicht imba, wenn dein Lieblings NSC dich nicht nur nett anlächeln könnte oder wortlos mit dir handeln könnte, sondern dich verstehen, dir antworten und sich vielleicht sogar an die Gamersprache gewöhnen könnte? Wenn du einen Söldner NSC ansprichst mit “Hey, LFM Torlahöhle, Interesse?” und der antwortet mit “Alles FFA?” – ich fände es toll :) Und klar, Gamersprache ist in einem RP nicht gewollt, aber auch dort gibt es genug Anwendungsfälle, in denen das nice ist: andere Namen für Orte, sprachliche Umgangsformen..

Aber ist das umsetzbar? Nach den ersten Kapiteln aus “The Handbook of Computational Linguistics and Natural Language Processing” von A. Clark, Ch. Fox, Sh. Lappin (Beute aus meinem letzten Unibib Raid) lautet meine vorläufige Antwort leider “Nein”. Aber so schnell lasse ich mich nicht entmutigen..

Posted in Theory-O-Matic. Tagged with , , .

Fast ein Baum im Baum..

Wie versprochen möchte ich immer mal wieder auf interessante Aspekte in Konzeption und Coding der von mir implementierten Features eingehen. Dabei geht es mir nicht so sehr um eine flächendeckende Beschreibung – ich habe nicht vor, die Doku in den Blog zu verlagern ;) – sondern darum, einzelne, aus meiner Sicht schöne oder interessante Stellen zu erläutern. Beginnen möchte ich dabei mit einer Stelle in der Simulation der Umwelt, genauer mit der Auswertungsreihenfolge der Umweltfaktoren.

Die Menge der durch Photosynthese umgewandelte und damit der Pflanze zur Verfügung stehenden Energie hängt von einer Reihe von abiotischen Faktoren ab, die sich gegenseitig beeinflussen (siehe auch Wikipedia). In der realen Welt sind dies Kohlenstoffdioxid, Licht, Wasser und Temperatur. In einer fiktiven Welt können natürlich beliebige Umweltfaktoren wie Magie, Schall oder eine andere Art Licht hinzukommen. Diese Umweltfaktoren beeinflussen sich gegenseitig und beeinflussen die Effektivität der Photosynthese, ein paar Beispiele aus der realen Welt sind: Die Menge an aufnehmbaren Kohlenstoffdioxid kann gedrosselt werden durch die Wassermenge bzw. die Luftfeuchtigkeit, die Temperatur beeinflusst die Photosyntheserate. Wenn man beliebige Kombinationen von beliebig vielen verschiedenen Umweltfaktoren zulassen möchte, stellen sich vor allem zwei Probleme:
1. In welcher Reihenfolge können die Umweltfaktoren ausgewertet werden? Im obigen Beispiel sollte die Wassermenge berechnet werden, bevor die Kohlenstoffdioxidmenge berechnet wird, da dieses Ergebnis von der aufgenommenen Wassermenge abhängt.
2. Wie bildet man alle möglichen Beeinflussungsarten wie “beeinflusst die Photosyntheserate” oder “setzt eine obere Grenze” ab?

Wir beschäftigen uns zunächst (also in diesem Beitrag) mit der ersten Frage. Da theoretisch beliebige Kombinationen von a priori nicht bekannten Umweltfaktoren möglich sein sollen, kann dem Programm keine vorher festgelegte Reihenfolge vorgegeben werden. Wie soll eine solche Reihenfolge also festgelegt werden? Dazu zunächst ein wenig Graphentheorie [1], wirklich nur ein ganz wenig. Ein gerichteter Graph G = (V, E) besteht aus einer Menge von Knoten V und eine Menge von gerichteten Kanten E, wobei jede Kante definiert ist als ein geordnetes Paar von Knoten. Ein solcher gerichteter Graph ist kreisfrei, falls es keinen Weg gibt, der aus einem Knoten heraus und später wieder in ihn hinein führt. Wenn wir unsere Problemstellung nun übersetzen in die neu gelernten Begriffe, so ist jeder Umweltfaktor ein Knoten und immer, wenn ein Umweltfaktor einen anderen Umweltfaktor beeinflusst, zeichnen wir eine Kante vom Knoten des ersten Umweltfaktors zum Knoten des zweiten Umweltfaktors. Wenn in diesem Graph ein Kreis auftritt heißt das, dass sich die Umweltfaktoren ringförmig beeinflussen, also zum Beispiel wäre “Wassermenge beeinflusst Kohlenstoffdioxidmenge beeinflusst Magie beeinflusst Wassermenge” ein Kreis. Diesen Fall wollen wir ausschließen, da man sich in der Berechnung sonst ewig im Kreis drehen könnte. Wir haben nun also einen kreisfreien, gerichteten Graphen vorliegen. Ein solcher Graph ist topologisch sortiert, wenn man eine Reihenfolge der Knoten gefunden hat, in der für jede Kante der Endknoten weiter hinten in der Reihenfolge liegt als der Anfangsknoten. Wenn man eine solche topologische Sortierung der Umweltfaktoren hat und die Umweltfaktoren in dieser Reihenfolge auswertet, dann beeinflusst jeder Umweltfaktor nur Umweltfaktoren, die später ausgewertet werden -> perfekt :)

Ist man erst einmal zu dieser Erkenntnis gelangt, dann ist der Rest kein Hexenwerk mehr – ein Algorithmus zum topologischen Sortieren von Graphen ist schnell gefunden. Man startet mit einer leeren Liste bereits sortierter Knoten und sucht in jeder Iteration im Graphen nach Knoten ohne eingehende Kanten, nimmt diese ans Ende der Liste bereits sortierter Knoten auf und entfernt den Knoten und alle ausgehenden Kanten aus dem Graphen. Am Ende ist der Graph leer und die Knoten sind topologisch sortiert. In der so ermittelten Reihenfolge werden die Umweltfaktoren dann vom Programm ausgewertet. Das obige Beispiel hat als eine mögliche topologische Sortierung Wasser -> Temperatur -> Luftfeuchtigkeit ->Kohlenstoffdioxid -> Licht.

[1] Algorithmische Graphentheorie, Volker Turau, Oldenbourg Verlag, 3. Auflage, 2009

Posted in Code-O-Matic, Theory-O-Matic. Tagged with , , .

Das Buch der Science-O-Matics

Das Buch der Science-O-Matics

Das Buch der Science-O-Matics

Das Projekt hat begonnen. Das Buch, ein Käsekuchen mit einer Kirschkompottfüllung mit leichter Chilinote, wartet auf die ersten Einträge. Auf ins erste Kapitel!

Posted in Off-Topic-O-Matic. Tagged with , , .