Die Knöpfe Tipp und Automatik unter dem Spielfeld liefern keine vorgefertigten Ratschläge. Sie führen eine echte Suche über deine tatsächliche Stellung aus, in deinem Browser, und geben den Zug zurück, den sie am höchsten bewertet. „Tipp“ zeigt einen Pfeil über dem Spielfeld; „Automatik“ spielt diesen Zug immer weiter, bis die Partie endet. Nichts wird an einen Server gesendet.
Lässt man diese Suche von einem frischen Spielfeld aus allein spielen, endet sie in 91,4 % der Partien mit einer 2048-Kachel. So kommt sie dorthin.
Das naheliegende Werkzeug für einen Spielbaum ist Minimax: annehmen, dass der Gegner die schlechtestmögliche Antwort wählt, und dagegen planen. 2048 hat keinen Gegner. Es hat eine zufällig erscheinende Kachel, und dieser Unterschied ist enorm wichtig.
Ein Minimax-Spieler behandelt die neue Kachel als bösartig und nimmt an, dass die 4 immer auf dem schlimmsten Feld landet. Das führt zu paranoidem, defensivem Spiel, weil das ganze Budget dafür draufgeht, sich gegen ein Spielfeld abzusichern, das vielleicht in einem von dreißig Fällen eintritt. Expectimax nimmt stattdessen das durchschnittliche Ergebnis über jede neue Kachel, die tatsächlich erscheinen kann, gewichtet danach, wie wahrscheinlich sie ist. Es spielt die Wahrscheinlichkeiten statt den Albtraum — das richtige Modell, wenn der Zufall weder für noch gegen dich arbeitet.
Die Suche wechselt also zwischen zwei Arten von Knoten. An einem Spielerknoten probiert sie alle vier Richtungen aus und behält das beste Ergebnis. An einem Zufallsknoten setzt sie auf jedes freie Feld eine 2 mit Gewicht 0,9 und eine 4 mit Gewicht 0,1, bewertet jeden Fall und bildet den Durchschnitt — dieselbe 90/10-Verteilung, die das Spiel selbst verwendet, wenn eine neue Kachel erscheint.
Der Baum lässt sich nicht bis zum Ende der Partie durchsuchen, also bewertet der Löser am unteren Ende der Suche die Stellung mit vier Messungen, die mit diesen Gewichten addiert werden:
| Faktor | Gewicht | Was er misst |
|---|---|---|
| Freie Felder | 2.7 | Einfach, wie viele Felder frei sind. Mit Abstand der schwerste Faktor — wem der Platz ausgeht, der verliert. |
| Monotonie | 1 | Ob die Werte entlang der Zeilen und Spalten gleichmäßig in eine Richtung ansteigen, statt im Zickzack zu springen. |
| Ecke | 1 | Ein Bonus, nach Größe gestaffelt, wenn die größte Kachel in einer der vier Ecken liegt. |
| Glätte | 0.1 | Ein Abzug für benachbarte Kacheln, deren Werte weit auseinanderliegen — eine 2 neben einer 512 kann nie verschmelzen und ist damit totes Gewicht. |
Drei dieser vier Faktoren sind nichts anderes als der übliche Rat an Menschen, als Rechnung aufgeschrieben: Platz freihalten, Ordnung halten, die große Kachel in der Ecke halten. Erst die Gewichte machen aus Ratschlägen Entscheidungen — die Suche nimmt eine schlechtere Eckposition gern in Kauf, wenn sie dafür genug freie Felder bekommt, und genau diesen Tausch machen Menschen meist in die andere Richtung falsch.
Jeder Faktor verwendet den Logarithmus zur Basis 2 des Kachelwerts statt des Werts selbst, sodass der Schritt von 2 auf 4 genauso viel zählt wie der von 1024 auf 2048. Ohne das würde die größte Kachel auf dem Spielfeld alles andere übertönen.
Ein Zufallsknoten verzweigt sich für jedes freie Feld zweimal, einmal für die 2 und einmal für die 4. Ein offenes Spielfeld mit zehn freien Feldern hat auf jeder Ebene zwanzig Zweige, ein fast volles mit drei freien Feldern hat sechs. Beide gleich tief zu durchsuchen, wäre verkehrt herum — das offene Spielfeld ist leicht zu überleben und teuer zu durchsuchen, beim vollen ist es genau umgekehrt.
Also passt sich die Tiefe dem Spielfeld an:
| Freie Felder | Suchtiefe |
|---|---|
| 7 oder mehr | 2 Züge voraus |
| 4 bis 6 | 3 Züge voraus |
| 3 oder weniger | 4 Züge voraus |
Das ist derselbe Instinkt, den ein guter menschlicher Spieler hat — ein offenes Spielfeld nur kurz ansehen, bei einem engen deutlich langsamer werden —, nur präzise angewandt. So erscheint der Pfeil in jeder Phase der Partie praktisch sofort nach dem Klick.
Über 500 vollständige Partien erreichte er 2048 in 91,4 % der Fälle, mit im Median 37.004 Punkten und 1.943 Zügen pro Partie. Die vollständigen Ergebnisse mit Vergleichswerten ordnen diese Zahlen ein.
Er ist kein 2048-Bot auf dem neuesten Stand der Technik, und das sollte man klar sagen. Veröffentlichte Löser erreichen 32768, indem sie viel tiefer suchen, mit Bitboard-Darstellungen, vorberechneten Zugtabellen und Transpositionstabellen. Dieser hier läuft auf einem einfachen Array im Haupt-Thread des Browsers, speichert zwischen den Zügen nichts zwischen und ist auf vier Halbzüge begrenzt, damit die Seite nie ruckelt. Er ist dafür gebaut, „Was soll ich hier tun?“ schnell genug zu beantworten, dass es sich sofort anfühlt — nicht, um Rekorde aufzustellen.
Am meisten bringt „Tipp“, wenn du ihm nicht einfach folgst. Entscheide dich zuerst selbst für einen Zug und drück dann den Knopf. Stimmt der Pfeil zu, hast du nichts gelernt, was du nicht schon wusstest — weicht er ab, hast du ein Spielfeld gefunden, das du falsch liest, und genau dort liegt die eigentliche Verbesserung.
„Automatik“ taugt eher als Vorführung denn als Rettung. Starte sie aus einer Stellung, die dir schwergefallen ist, und beobachte, welche Richtung sie schützt und welche Verschmelzungen sie auslässt. Ein Druck auf eine Pfeiltaste gibt dir jederzeit sofort die Kontrolle zurück.
Der Löser besteht aus rund 250 Zeilen JavaScript ohne Abhängigkeiten, ausgeliefert als einfache Datei unter /js/ai.js — lesbar über die Quelltextansicht deines Browsers, falls du irgendetwas davon nachprüfen willst.
Bereit, es auszuprobieren?
2048 spielen