Mühle
Das Brettspiel mit den drei Ringen, vollständig mit Setz-, Zug- und Sprungphase — gegen den Rechner oder zu zweit.
Mühle ist eines der ältesten Brettspiele der Welt — Spielbretter wurden in ägyptischen Tempeldächern aus dem 14. Jahrhundert vor Christus eingeritzt gefunden, weitere in Troja, in römischen Ruinen und auf mittelalterlichen Kirchenbänken. Die Regeln sind seit Jahrhunderten unverändert.
Jeder Spieler hat neun Steine. Das Spiel läuft in drei Phasen ab. In der Setzphase werden die Steine abwechselnd auf freie Punkte gelegt. Danach folgt die Zugphase: Ein Stein wird entlang einer Linie auf einen benachbarten freien Punkt geschoben. Wer nur noch drei Steine hat, darf in der Sprungphase auf jeden beliebigen freien Punkt springen — die letzte Chance des Unterlegenen.
Wer drei Steine in eine Reihe bringt, hat eine Mühle geschlossen und darf einen gegnerischen Stein vom Brett nehmen. Dabei gilt die Regel: Steine aus einer geschlossenen gegnerischen Mühle sind tabu, solange der Gegner noch andere Steine hat. Verloren hat, wer unter drei Steine fällt oder keinen Zug mehr machen kann.
Der Rechner spielt solide, aber nicht meisterhaft: Er schließt eine Mühle, wenn er kann, verhindert eine gegnerische, wenn er sie sieht, und bevorzugt sonst Punkte mit vielen Verbindungen. Am wertvollsten sind die vier Punkte in den Seitenmitten des mittleren Rings — von ihnen gehen vier Linien aus, von einem Eckpunkt nur zwei.
Verwandtes im Archiv: Vier gewinnt und Tic Tac Tile sind die schnelleren Verwandten, Die Türme von Hanoi ein Denkspiel ganz ohne Gegner.
So funktioniert das Script
Mühle hat mehr Regeln als die meisten Spiele dieser Sammlung. Der Schlüssel zu einem übersichtlichen Programm ist, das Brett vollständig als Daten zu beschreiben — dann bleibt für die Regeln erstaunlich wenig Code übrig.
const muehlen = [
[0,1,2],[3,4,5],…,[2,14,23]
];
const nachbarn = [
[1,9],[0,2,4],[1,14],…
];
Zwei Tabellen genügen, um das ganze Brett zu beschreiben: die sechzehn möglichen Mühlen und für jeden der 24 Punkte die Liste seiner direkten Nachbarn. Das Brett selbst ist dann nur noch eine flache Liste aus 24 Zahlen. Wer stattdessen versucht, die Geometrie aus Koordinaten zu berechnen, verheddert sich sofort — die drei Ringe sind eben kein gleichmäßiges Raster.
return muehlen.some(function (m) {
return m.indexOf(feld) !== -1 &&
felder[m[0]] === spieler && felder[m[1]] === spieler && felder[m[2]] === spieler;
});
Die Mühlenprüfung wird damit zu einer Zeile: Gibt es unter allen Mühlen eine, die den gerade gesetzten Punkt enthält und vollständig dem Spieler gehört? some liefert true, sobald ein Eintrag die Bedingung erfüllt, und bricht dann ab.
const frei = alle.filter(function (i) { return !istMuehle(gegner, i); });
return frei.length > 0 ? frei : alle;
Das ist die Regel, die Anfängern am häufigsten entgeht: Steine in einer geschlossenen Mühle darf man nicht schlagen — es sei denn, der Gegner hat nur noch solche. Genau das steht hier: erst die freien Steine sammeln, und nur wenn keine übrig sind, alle zulassen.
const ziele = darfSpringen(spieler)
? … alle freien Punkte …
: nachbarn[von].filter(function (i) { return felder[i] === 0; });
Die drei Spielphasen unterscheiden sich nur darin, welche Züge erlaubt sind. Solange Steine im Vorrat sind, ist jeder freie Punkt ein Ziel; danach nur noch freie Nachbarn; und bei genau drei Steinen wieder jeder freie Punkt. Diese eine Funktion beantwortet die Frage für alle Phasen — und liefert nebenbei die Zugliste für den Rechner und die Prüfung auf Zugunfähigkeit.
if (zug.von !== undefined) felder[zug.von] = 0;
felder[zug.nach] = 2;
const schliesst = istMuehle(2, zug.nach);
felder[zug.nach] = 0;
if (zug.von !== undefined) felder[zug.von] = merkerVon;
Der Rechner probiert jeden möglichen Zug durch: ausführen, prüfen, zurücknehmen — dasselbe Muster wie bei Vier gewinnt. Beim Zurücknehmen muss hier zusätzlich der Ausgangspunkt wiederhergestellt werden, denn ein Zug in der Zugphase verändert zwei Felder.
const gewicht = nachbarn[zug.nach].length;
for (let i = 0; i < gewicht; i++) auswahl.push(zug);
Fehlt ein zwingender Zug, entscheidet gewichteter Zufall: Punkte mit vier Nachbarn kommen viermal in den Lostopf, Eckpunkte mit zwei Nachbarn nur zweimal. Das ist eine grobe, aber wirksame Stellungsbewertung. In genau zwei Mühlen liegt zwar jeder der 24 Punkte — der Unterschied steckt in den Verbindungen: Zwölf Eckpunkte haben zwei Nachbarn, acht Punkte drei, und nur die vier Seitenmitten des mittleren Rings haben vier. Von dort aus bleibt man beweglich, und Beweglichkeit entscheidet in der Zugphase über Sieg und Niederlage.
knopf.style.left = (orte[i][0] / 6 * 100) + "%";
Die Punkte werden in Prozent auf einem quadratischen Feld platziert, die Verbindungslinien als SVG darüber gelegt. Weil alles relativ angegeben ist, passt sich das Brett jeder Bildschirmbreite an, ohne dass eine einzige Pixelangabe im Spiel wäre.
Zum Anpassen: Für die Variante „Zwickmühle zählt doppelt" oder für ein Brett mit Diagonalen ändert ihr nur die beiden Tabellen am Anfang. Ein deutlich stärkerer Gegner entstünde durch eine Vorausschau über mehrere Züge — bei Mühle ist das gut machbar, weil selten mehr als zwanzig Züge zur Wahl stehen.
Script für die eigene Homepage
Kopiert euch den kompletten Code und fügt ihn an der Stelle eurer Seite ein, an der das Script erscheinen soll. Er läuft ohne weitere Dateien und ohne fremde Server.
Mehr aus der Kategorie Spiele
-
ASCII Minesweeper
-
Asteroids
-
Ausweichen
-
Ballspiel
-
Bennys Quiz
-
Blackjack
-
Blu Mania
-
BreakOut
-
Buchstaben zählen
-
Buchstabenpuzzle
-
Checkbox Spiel
-
Concentration
-
Der längste Drücker
-
Die Türme von Hanoi
-
Einmaleins Trainer
-
Escape
-
Galgenmännchen
-
Galgenmännchen 2
-
Game Over Game
-
Glücks Klick
-
Glücksbuttons
-
Ich sehe was
-
Kniffel
-
Labyrinth
-
Liebesrechner
-
Lights Out
-
Lights Out 2
-
Mastermind
-
Minesweeper