Hallo Felix,
Sehr gern gesehen ist auch Feedback bezüglich des User Interfaces. Wenn jemand ganz andere (Verbesserungs)Vorschläge hat, so bin ich daran selbstverständlich ebenso interessiert.
Da hätte ich schon einige Vorschläge zum Design des ganzen Programms, nicht zum Look & Feel der Oberfläche. Letzere finde ich ganz gut gelungen: Man ist unweigerlich an das Original erinnert, das auch so bunt und relativ schlicht daherkommt.
Die Spielfiguren sind einfach süß. Jetzt, wo ich auch mal die Gewinner sehen konnte, gefallen sie mir noch besser. Etwas fällt mir noch dazu ein: Wenn Schlagzwang besteht und es nur eine Möglichkeit zum Ziehen gibt, dann kann die zu schlagende Figur bereits sofort nach dem Würfeln wissen, dass sie jetzt fällig ist. Sie könnte sich also schon ängstlich zeigen, bevor man die schlagende Figur zum Ziehen anklickt. So wie es jetzt ist, kann man nämlich die ängstlichen Gesichter immer nur ganz kurz genießen ;), während die schlagende Figur sich fortbewegt.
Aber den Code und das ganze Konzept, naja... die würde ich anders gestalten:
Für das Spielfeld mit den Waypoints z.B. könnte man hervorragend mit Object.create (JavaScript 1.8.5) bzw. der Crockfordschen Urversion davon arbeiten. Ich würde jeder Figur ein eigenes Parcours-Array mitgeben, die alle einfach vom Basisobjekt erben und zum Ziehen und Einstellen des Startpunkte nur die einzelnen Parcours-Arrays rotieren mit meiner genialen Array.rotate-Funktion, die ich im Forum schon mal vorgestellt habe, aber fast nur Spott erntete, ihr Ignoranten :P ;).
Diese Parcours-Arrays wären ja eigentlich leer; es reicht, wenn sie den Basisparcours als Prototyp haben. Die aktuelle Position eines Spielsteins wäre immer Figur.Parcours[0], wobei der das tatsächliche Waypoint-Objekt natürlich nur im Prototyp existiert, was für den Zugriff aber keinen Unterschied macht. Die Startposition als Waypoint für jedes Farbvolk würde man anfangs wie gesagt einfach durch Rotation des neu erzeugten FarbParcours einstellen.
Die Infos über die Nachfolger eines Waypoints wären überflüssig. Die Waypoint-Objekte selber könnte man direkt miteinander vergleichen, weil jeder Waypoint nur einmal als Objekt existiert (im Basisparcours) so dass ein Vergleich auf Gleichheit immer das richtige Ergebnis liefert (nur true wenn die Operanden identisch sind).
Irgendwie so:
var parcours = [ ],
gelb.parcours = Object.create(parcours),
grün.parcours = Object.create(parcours).rotate(10),
rot.parcours = Object.create(parcours).rotate(20),
blau.parcours = Object.create(parcours).rotate(30);
Man könnte natürlich eleganter in einer Schleife über die vier Member eines Farbvölker-Objekts iterieren. Die StartObjekte liegen danach jeweis in volk.parcours[0] griffbereit.
Für die einzenen Spielsteine einer Farbe in einer Schleife i=0..3 den individuellen Weg initialisieren:
grün.Figur[i].weg = Object.create(grün.parcours);
Zum Ziehen einer Figur und Position vergleichen etwas wie
volk.figur[i].weg.rotate(wurf);
if (volk.figur[i].weg[0] === volk.parcours[0]) {}
if (volk.figur[i].weg[1] === volk.parcours[0]) {}
if ( isbesetzt(volk.figur[i].weg[wurf]) ) {}
usw.
JSLint würde vielleicht wieder sagen "Weird program.", aber was soll's...
Gruß, Don P