Hier ist, was der Wachstumsalgorithmus mit einer Rekursionstiefe von 32 Schritten hervorbringt. Der Kram ist natürlich arg beta und der finale Output würde hübscheres HTML erzeugen.
[Ergebnis] [mit Debugoutput (Achtung, große Datei)]
Was ich habe:
- Das Programm hat eine Liste von Tiles, jeweils mit erlaubten Nachbartiles.
- Es wird ein Tile gelegt und dann (sofern welche definiert sind und der Zielort frei ist) nach Norden, Osten, Süden und Westen weitergebaut.
- Wenn ein Tile gelegt werden soll, wird bei allen Nachbarn geprüft, ob diese das zu legende Tile erlauben.
- Wenn kein passendes Tile gelegt werden kann, wird "Geröll" (auf der Karte rot) gelegt. Dies ist ein Fehlerfall.
Was fehlt:
- Ich habe momentan nur die nötigen Tiles, um Räume zu modellieren. Gänge würden andere Tiles erfordern.
- Wenn kein passendes Tile gelegt werden kann, sollte das Programm Backtracking verwenden (sprich: das Legen des letzten Tiles rückgängig machen).
- Die Liste der Nachbartiles sollte gewichtet sein, so daß beispielsweise Wände dazu neigen, lieber andere Wände statt Ecken zu legen.
- Diese Gewichtung sollte eigentlich auch noch adaptiv sein, damit Räume nur kurz bevorzugt wachsen und dann auf einen Abschluß zustreben.
- Dadurch, daß der Zustand jedes Tiles im Speicher bleibt (weil ja alles rekursiv läuft) ist der Speicheraufwand bei großen Maps verhältnismäßig enorm. Das könnte man kompensieren, indem man blockweise arbeitet (es wird versucht, einen Block von X×X Tiles zu füllen; dann wird der Block als komplett angesehen und daneben weitergebaut).
Was momentan gar nicht modelliert ist:
- Der Algorithmus wächst einfach vor sich hin und ist nicht in der Lage, eine bestimmte Anzahl von Räumen zu erzeugen.
Eventuell wäre es allgemein einfacher, einen großen Haufen Tileblöcke vorzudefinieren und einfach die aneinanderzupappen.
PS:
So, hier habe ich noch einen Durchlauf mit 256 Schritten und etwas getweakten Listen (leere Flächen werden doppelt so gern angelegt). Achtung, die Seite selbst ist über ein Megabyte groß.
[Ergebnis 256]