Die Spielsituation wird intern unabhängig von der Grafik
dargestellt. Die Möglichen Züge immer über die Grafik zu
berechnen würde natürlich viel zu lange dauern.
Einfach nur die Verbindungen der Punkte zu speichern würde nicht
ausreichen, weil die Information fehlt, wie die Flächen zerteilt
sind und welche Punkte abgeschnitten sind.
Die Verbindungen werden als gerichtete Kanten gespeichert, jede
Verbindung entspricht einem Paar gerichteter Kanten.
Es ergeben sich zyklische Pfade, wenn man an einer Kante startet, und
bei jedem Punkt immer rechts abbiegt.
zu jedem Pfad gehört eine Fläche, sie liegt rechts vom Pfad.
Mehrer Pfade können an der selben Fläche liegen.
Es können nur Punkte neu verbunden werden, die an einer
gemeinsamen Fläche liegen.
Ein mögliche Darstellung wäre:
struct situ
{ int np; // anzahl der Punkte
int na; // anzahl der Flächen
int cnext[MAXP*3]; // nummer der Nachfolgerkante (-1 = unbenutzt; wenn alle 3 vorhanden, dann gegen uhrzeigersinn)
int carea[MAXP*3]; // nummer der Fläche zu der die Kante gehört
};
Kantennummern sind dann 3*Punktnummer + Kantenindex(0..2) . Die
Verwendung eindimensionaler Arrays anstelle von 2 dimensionalen macht
es etwas einfacher, die Nummern der Folgekanten als einfache integer
Werte zu speichern. Da die Stellungen nur eine begrenzte
Maximalgrösse haben (MAXP == 31, bei max. 8 Startpunkten),
bieten sich statisch dimensionierte Arrays an.
Beim Ausführen von Zügen müssen dann Pfade aufgebrochen
/ vereingt werden und evtl unabhängige Teilnetze der neuen
Fläche zugeordnet werden.
Die Darstellung die ich im Programm benutzte ist etwas grösser.
Sie enthält noch ein paar redundante informationen, die aber viele
Berechnungen beschleunigen. Darin sind auch die Pfade durchnummeriert
und Beziehungen zwische Pfaden und Flächen gespeichert.
Zusätzlich gibt es erweiterte Informationen, die für die
Grafikdarstellung nützlich sind. Die oben angegebene struct , kann
auf verschiedene Weise grafisch dargestellt werden, je nach dem, welche
der Flächen man als Aussenfläche wählt.
Im Spiel mit Grafik bleibt aber die Wahl der Aussenfläche immer
konstant. Zu jeder Fläche (ausser der Aussenfläche) ist dann
ein bestimmter Pfad der Umschliessende Pfad der Fläche.