Pyanfänger hat geschrieben:
Und wie mache ich diese Infos zum Tile :O
Naja, dafür musst Du Dir eben etwas passendes ausdenken. Es kommt dabei ja immer auf Deine Anforderungen an.
Du musst ja irgend wo eine Definition eines solchen "Bioms" haben, also nehmen wir mal dieses vereinfachte Beispiel:
Code: Alles auswählen
Tile: A
###
...
###
Tile: B
###
#..
#.#
Tile: C
###
###
###
Du kannst doch nun die Kanten leicht bestimmen. Du hast ja pro Makrotile immer vier Kanten: Oben, unten, rechts, links. Diese kannst Du leicht aus dem Makrotile auslesen.
Nehmen wir nun an, Du hast Tile A "gelegt". Nun willst Du links daneben ein Tile platzieren. Man sieht selber intuitiv schon, dass A und B passen und C nicht. Algorithmisch vergleichst Du einfach nur die linke Kante des betrachteten Tiles A und der jeweiligen rechten Kanten der anderen Tiles. Aus den passenden kannst Du dann per Zufall eines auswählen und bist dennoch sicher, dass die Übergänge passen.
Das wäre ein Weg.
Du kannst je nach Komplexität oder wenn Du unterschiedliche Symbole verwendest, die dennoch zusammen passen sollen, eine "neutrale", also von der Symbolen unabhängige, Kantenbeschreibung etablieren.
Analog zum Carcassonne Beispiel wäre das z.B. so denkbar:
Code: Alles auswählen
Tile A:
Kante links:
- Wiese
- Weg
- Wiese
Kante oben:
- Wiese
Kante rechts:
- Wiese
- Weg
- Wiese
Kante unten:
- Wiese
Man kann sich überlegen, ob man eine fixe Anzahl an Verbindungs-"Ports" haben will, oder lieber beliebig lange Sequenzen. Ob ich nun drei mal "Wiese" schreibe oder einmal ändert ja eigentlich nichts am Informationsgehalt. Evtl. ist es aber einfacher, sich auf eine fixe Anzahl an Ports festzulegen und man erspart sich unnötige Komplexität.
Nun kann ich ein Makrotile bauen, welches ein anderes Symbol für eine Wieso verwendet aber dennoch eine Verbindung herleiten.
Man könnte nun sogar mit Wildcards arbeiten, also Angaben, dass eine Kante beliebig besetzt werden kann. Z.B. wenn man eine Stadt rechts an den "Weg durch die Wiese" legen will:
Code: Alles auswählen
Tile A:
Kante rechts:
- Wiese
- Weg
- Wiese
Tile Stadteingang:
Kante links:
- Mauer
- Weg # Stadttor als Symbol
- Mauer
Bei diesen Angaben würde ein "steifer" Algo scheitern, da:
zu einer Ablehnung führte. Man könnte nun also statt der Wiese und Mauer auch einen "*" nehmen und damit zeigen, dass es einem egal ist, was dort drankommt. Mir fiel aber mittlerweile auf, dass das keine tolle Idee ist.
Besser ist es, dieses zu lassen, aber eine Art "Äquivalenzklassen"-Definition für solche Verbindungen zu schaffen. Also etwa so:
Code: Alles auswählen
combinables = (
("wall", "meadow", "forest"),
("way", "gate"),
...
)
Die Struktur ist aber noch ungünstig, da man nun alles durchsuchen müsste, um für die Wiese zu gucken, ob eine Mauer dran passt. Wie man das gut lösen kann, fällt mir grad nicht wirklich ein. Vermutlich läuft es darauf hinaus, für jedes Element (Key) eine Liste mit kompatiblen Elementen (Value) in einem Dictionary abzulegen. Damit könnte man bei einem Vergleich so vorgehen:
Code: Alles auswählen
def is_combineable(first, second):
return second in combinables[first]
is combinable("meadow", "wall")
>>> True
Da das ganze ja vermutlich symmetrisch ist, würde ich dieses Dictionary aus den oben zunächst von mir angedachten Tupeln generieren.
So, das war nun genug Sermon von mir
