Les boutons Indice et Automatique sous la grille ne donnent pas de conseils tout faits. Ils lancent une vraie recherche sur votre position exacte, dans votre navigateur, et renvoient le coup le mieux noté. Indice affiche une flèche sur la grille ; Automatique continue de jouer ce coup jusqu’à la fin de la partie. Rien n’est envoyé à aucun serveur.
Laissée jouer seule depuis une grille neuve, cette recherche finit avec une tuile 2048 dans 91,4 % des parties. Voici comment elle y parvient.
L’outil évident pour un arbre de jeu est minimax : supposer que l’adversaire choisit la pire réponse possible et planifier contre elle. Le 2048 n’a pas d’adversaire. Il a une tuile qui apparaît au hasard, et cette différence compte énormément.
Un joueur minimax traite l’apparition des tuiles comme malveillante et suppose que le 4 tombe toujours sur la pire case possible. Cela donne un jeu paranoïaque et défensif, qui dépense tout son budget à se protéger d’une grille qui ne se présente peut-être qu’une fois sur trente. Expectimax, au contraire, prend le résultat moyen de toutes les apparitions qui peuvent réellement se produire, pondéré par la probabilité de chacune. Il joue les probabilités plutôt que le cauchemar — le bon modèle quand le hasard vous est indifférent.
La recherche alterne donc entre deux types de nœud. À un nœud du joueur, elle essaie les quatre directions et garde le meilleur résultat. À un nœud de hasard, elle place un 2 sur chaque case vide avec un poids de 0,9 et un 4 sur chaque case vide avec un poids de 0,1, évalue chaque cas et en fait la moyenne — la même répartition 90/10 que le jeu lui-même utilise pour faire apparaître une tuile.
L’arbre ne peut pas être exploré jusqu’à la fin de la partie, donc au bas de la recherche, le solveur note la position selon quatre mesures, additionnées avec ces poids :
| Terme | Poids | Ce qu’il mesure |
|---|---|---|
| Cases vides | 2.7 | Simplement le nombre de cases libres. C’est de loin le terme le plus lourd — manquer de place, c’est comme ça qu’on perd. |
| Monotonie | 1 | Si les valeurs augmentent régulièrement dans une direction le long des lignes et des colonnes, au lieu de faire des zigzags. |
| Coin | 1 | Un bonus, proportionnel à la taille, quand la plus grosse tuile se trouve dans l’un des quatre coins. |
| Régularité | 0.1 | Une pénalité pour les tuiles voisines de tailles très différentes — un 2 à côté d’un 512 ne pourra jamais fusionner, c’est donc du poids mort. |
Trois de ces quatre termes ne sont que le conseil humain de toujours écrit sous forme d’arithmétique : gardez de l’espace, gardez de l’ordre, gardez la grosse tuile dans un coin. Les poids sont ce qui transforme le conseil en décisions — la recherche accepte volontiers une moins bonne position de coin si elle gagne en échange assez de cases vides, et c’est justement l’arbitrage que les gens ont tendance à rater dans l’autre sens.
Chaque terme utilise le logarithme en base 2 de la valeur d’une tuile plutôt que la valeur elle-même, de sorte que le saut de 2 à 4 compte autant que celui de 1024 à 2048. Sans cela, la plus grosse tuile de la grille écraserait tout le reste.
Les nœuds de hasard se ramifient une fois par case vide, et cela deux fois. Une grille ouverte avec dix cases libres a vingt branches à chaque niveau ; une grille presque pleine avec trois cases libres en a six. Explorer les deux à la même profondeur serait faire les choses à l’envers — la grille ouverte pardonne beaucoup mais coûte cher à explorer, et la grille pleine est exactement l’inverse.
La profondeur s’adapte donc à la grille :
| Cases vides | Profondeur de recherche |
|---|---|
| 7 ou plus | 2 coups d’avance |
| De 4 à 6 | 3 coups d’avance |
| 3 ou moins | 4 coups d’avance |
C’est le même instinct qu’un bon joueur humain — jeter un coup d’œil rapide à une grille ouverte et freiner net quand elle se corse — appliqué avec précision, et cela maintient l’indice sous un délai confortable entre le clic et la flèche à n’importe quel moment de la partie.
Sur 500 parties complètes, il a atteint 2048 dans 91,4 % des cas, avec un score médian de 37 004 et une durée médiane de 1 943 coups. Les résultats complets, avec leurs points de comparaison remettent ces chiffres en contexte.
Ce n’est pas un bot de 2048 dernier cri, et il vaut mieux le dire clairement. Les solveurs publiés atteignent 32768 en cherchant bien plus profondément, avec des représentations en bitboard, des tables de coups précalculées et des caches de transposition. Celui-ci tourne sur un tableau ordinaire dans le fil principal du navigateur, ne garde aucun cache d’un coup à l’autre et est limité à quatre niveaux pour que la page ne se fige jamais. Il est fait pour répondre à « que faire ici ? » assez vite pour sembler instantané, pas pour battre des records.
La façon la plus utile de se servir d’Indice n’est pas de lui obéir. Décidez d’abord de votre propre coup, puis appuyez dessus. Quand la flèche concorde, vous n’avez rien appris que vous ne sachiez déjà — mais quand elle diffère, vous avez trouvé une grille que vous lisez mal, et c’est là que l’on progresse vraiment.
Automatique sert davantage de démonstration que de bouée de sauvetage. Lancez-le depuis une position qui vous a posé problème et observez quelle direction il protège et quelles fusions il refuse de faire. Appuyer sur une flèche à tout moment vous rend la main immédiatement.
Le solveur, c’est environ 250 lignes de JavaScript sans dépendance, servies comme un simple fichier à /js/ai.js — vous pouvez le lire avec « afficher le code source » dans votre navigateur si vous voulez vérifier quoi que ce soit de tout ceci.
Prêt à passer à la pratique ?
Jouer au 2048