La couleur des régions est structurelle dans Meowdoku, pas décorative
Chaque case d'un plateau Meowdoku est une simple couleur de remplissage unie, et rien d'autre n'indique où une région se termine et où la suivante commence. Cela fait de la palette une pièce active du puzzle plutôt qu'une couche de peinture : mal choisir la couleur de deux régions voisines rend le plateau illisible avant même qu'un seul chat soit posé. Le jeu le traite déjà comme tel — ce qu'il n'a pas vérifié, c'est si cette même palette résiste à une déficience de la vision des couleurs, et c'est l'objet de cet article.
Ce qui marque vraiment une région
Cherchez ce qui trace une frontière entre deux régions dans le composant du plateau, et vous ne trouverez rien. Chaque case reçoit exactement la même bordure fine d'un pixel, que la case voisine appartienne à sa propre région ou à une région totalement différente. La seule chose qui change d'une case à l'autre, c'est la couleur de remplissage : pas de bordure, pas d'icône, pas de texture.
C'est un vrai choix de conception, pas un oubli — une frontière marquée à chaque limite de région serait une chose de plus à dessiner sur un plateau qui compte déjà douze couleurs et jusqu'à une centaine de cases. Mais cela signifie que la couleur porte une information qui n'a nulle part ailleurs où exister. « À quelle région appartient cette case » est le premier fait dont dépend chaque règle du jeu, et la couleur de remplissage est le seul endroit où ce fait est inscrit.
Pourquoi cela rend la palette structurelle
Dès lors que la couleur est le seul signal de frontière, deux régions voisines aux couleurs proches cessent de se lire comme deux régions — elles se lisent comme un seul bloc de forme bizarre, et chaque déduction qui dépend de les distinguer devient un effort au lieu d'un coup d'œil.
Le module qui attribue ces couleurs le dit lui-même dans ses commentaires : une attribution naïve « often produce[s] clashes like red next to rose or orange next to yellow — the player has to stare to tell whether it's one block, and 'which region is this' is the premise of every reasoning step in this game » (produit souvent des collisions comme du rouge à côté du rose ou de l'orange à côté du jaune — le joueur doit fixer l'écran pour savoir s'il s'agit d'un seul bloc, et « quelle est cette région » est la prémisse de chaque étape de raisonnement dans ce jeu). Cette phrase est à elle seule toute la justification de ce qui suit.
L'algorithme : une vraie coloration de graphe, pas une liste mélangée
`assignRegionColors` construit d'abord un graphe d'adjacence des régions : deux régions sont adjacentes si des cases partagent un bord, en utilisant délibérément un contact à 4 voisins plutôt qu'à 8 — un contact en diagonale n'est pas visuellement confondu avec un seul bloc, ce n'est donc pas une contrainte de coloration. L'algorithme traite ensuite les régions par nombre de voisins, et choisit pour chacune la case de palette libre la plus éloignée, sur l'anneau de couleurs de la palette, de chaque voisine déjà colorée, en départageant les égalités vers ce qui étale le plus les douze teintes dans l'ensemble.
C'est de la coloration de graphe, de nom comme de fonction : les régions sont des sommets, les bords partagés sont des contraintes, les cases de la palette tiennent lieu de couleurs. Le seul assouplissement par rapport à la formulation classique est l'anneau lui-même — des cases proches (rouge et orange) comptent comme plus semblables que des cases opposées (rouge et bleu-vert), ce qui correspond à l'apparence réelle de ces teintes côte à côte.
Combien de marge la palette a vraiment
La palette compte douze cases. Un plateau ne les utilise jamais toutes : le nombre de régions est égal à la taille du plateau, qui plafonne à dix.
| Plateau | Régions (= taille du plateau) | Cases de palette restantes |
|---|---|---|
| Facile 5×5 | 5 | 7 |
| Normal 7×7 | 7 | 5 |
| Difficile 9×9 | 9 | 3 |
| Extrême 10×10 | 10 | 2 |
Même en Extrême, deux cases restent inutilisées. Le repli de l'algorithme pour manquer de couleurs ne se déclenche jamais sur un plateau réel — il existe pour un cas que l'échelle de difficulté actuelle n'atteint jamais.
Ce que l'algorithme apporte vraiment, en vision ordinaire
En mesurant la séparation des couleurs par le ΔE de Lab CIE (une mesure perceptuelle standard de distance de couleur — grosso modo, un écart sous 10 se lit comme semblable au premier coup d'œil, au-dessus de 30 comme clairement distinct), voici l'écart le plus faible entre deux régions voisines sur un plateau, moyenné sur trois cents plateaux générés par difficulté :
| Plateau | assignRegionColors | Sans adjacence (id de région → case de palette) |
|---|---|---|
| Facile 5×5 | 36.0 | 28.0 |
| Normal 7×7 | 34.3 | 28.6 |
| Difficile 9×9 | 33.5 | 28.1 |
| Extrême 10×10 | 32.5 | 27.5 |
L'algorithme ajoute environ un cinquième de séparation en plus, de façon constante, à chaque difficulté. Il faut être précis sur ce que cela n'est pas : avec seulement cinq à dix teintes tirées de douze bien réparties, une attribution sans adjacence n'a produit non plus aucune collision franche (ΔE sous 20) sur les douze cents plateaux échantillonnés ici — la palette a déjà assez de marge à ces effectifs de régions pour que la malchance pure reste rare. Ce que l'algorithme supprime, c'est la chance, pas un désastre courant. Il transforme un « probablement correct » en garantie conçue — la garantie que la suite de cet article met à l'épreuve d'une déficience de la vision des couleurs.
Ce que change une déficience de la vision rouge-vert
La protanopie et la deutéranopie, les deux formes courantes de daltonisme rouge-vert, touchent ensemble environ 1 homme sur 12. Toutes deux compressent une partie de l'espace colorimétrique que la vision trichromate ordinaire garde séparée — l'axe qui traverse le rouge, l'orange, le vert-jaune et le vert — si bien que des couleurs opposées sur cet axe peuvent finir par se ressembler presque exactement.
Pour mesurer cet effet sur cette palette plutôt que de le décrire dans l'abstrait, cet article fait passer chaque couleur par une simulation standard de dichromatie (une transformation matricielle en RVB linéaire, de la même famille que celle utilisée par les outils d'accessibilité des navigateurs et des systèmes d'exploitation) et remesure le ΔE sur le résultat. C'est une simulation à sévérité maximale, une borne de pire cas, pas une affirmation que chaque joueur daltonien voit exactement ces chiffres — la plupart des déficiences rouge-vert sont une question de degré, pas un effondrement tout ou rien.
Le résultat mesuré : un effondrement sur presque tous les plateaux
En relançant les mêmes trois cents plateaux par difficulté, et en reprenant la paire de régions voisines la plus proche — cette fois telle qu'elle apparaît sous la déficience simulée :
| Plateau | Vision ordinaire | Protanopie | Deutéranopie | Plateaux avec une paire sous ΔE 12 |
|---|---|---|---|---|
| Facile 5×5 | 36.0 | 10.1 | 18.5 | 97% |
| Normal 7×7 | 34.3 | 9.0 | 16.5 | 97% |
| Difficile 9×9 | 33.5 | 8.4 | 15.3 | 99% |
| Extrême 10×10 | 32.5 | 8.1 | 13.5 | 95% |
ΔE 12 est un seuil choisi, pas une limite psychophysique absolue — il marque la zone où deux grands aplats voisins se liraient plausiblement comme une seule couleur plutôt que deux, bien en deçà de la séparation que cette palette était conçue pour atteindre. Sous protanopie, la paire la plus proche tombe en moyenne à un chiffre à chaque difficulté ; sous deutéranopie elle résiste un peu mieux mais chute quand même de plus de moitié. Dans les deux cas, sur les douze cents plateaux échantillonnés, 95 à 99 % ont au moins une paire de régions voisines sous ce seuil.
C'est presque toujours la même paire
Cet effondrement n'est pas réparti uniformément. En isolant quelle paire de couleurs cause les dégâts sur chaque plateau touché, une paire domine à chaque difficulté : le rouge contre le vert-jaune, présente dans 97 à 99 % des plateaux où un effondrement survient. Isolée, cette paire mesure un ΔE de 54,0 en vision ordinaire — vraiment distincte — pour tomber à 9,5 sous protanopie, soit une chute de 82 %.
La raison remonte à l'ordre même de l'anneau de la palette. Le rouge et le vert-jaune se trouvent à trois cases d'écart sur l'anneau de douze couleurs, un écart qu'`assignRegionColors` considère comme confortable et non adjacent. Mais cette mesure suppose une roue chromatique calibrée pour la vision ordinaire, et la protanopie/deutéranopie compressent justement le segment de la roue où ces deux teintes se trouvent aux extrémités opposées — si bien qu'un écart jugé sûr par l'algorithme s'effondre quand même.
Les commentaires du code source de la palette signalent aussi un motif de luminosité clair/moyen/foncé qui se répète tous les trois emplacements — un écart de trois emplacements place donc toujours deux couleurs dans la même bande de luminosité (le violet et le bleu-vert, un coupable secondaire moins important, partagent aussi ce trait : ΔE de 74,0 tombant à 8,2 sous protanopie, la chute la plus nette mesurée, bien qu'elle revienne moins souvent). À cette distance sur l'anneau, la teinte est le seul élément qui distingue deux couleurs, et la teinte est précisément ce qu'érode une déficience rouge-vert.
Ce qui aide réellement aujourd'hui
Il n'existe aujourd'hui aucun mode daltonien dans le jeu, et aucune bordure entre les régions à laquelle se raccrocher — c'est bien pour cela que ce problème n'a nulle part où se cacher. La solution qui fonctionne vraiment est extérieure au jeu : macOS, Windows, iOS et Android proposent tous un filtre de déficience de la vision des couleurs au niveau du système (Réglages → Accessibilité → Filtres de couleur), et comme le problème ici est une compression de teinte, un filtre réglé sur la déficience du joueur resépare exactement les teintes que cette mesure montre en train de s'effondrer. Zoomer n'aide pas — c'est un problème de couleur, pas de taille.
Si une refonte de la palette voit un jour le jour, cette mesure indique par où commencer : la relation à distance 3 sur l'anneau, pas celle à distance 1. Les paires manifestement proches sont déjà écartées par l'algorithme actuel et survivent en général intactes à la simulation. Ce sont les paires que l'algorithme considère aujourd'hui comme sûrement séparées qui ne le sont pas.
Comment cela a été mesuré
Tous les chiffres proviennent du propre code du jeu : `generatePuzzleSync` pour les plateaux, `assignRegionColors` et `regionAdjacency` de src/engine/palette.ts pour la coloration, exécutés exactement comme le jeu réel les exécute. La distance de couleur est le ΔE CIE76 dans l'espace Lab ; la simulation de déficience de la vision des couleurs applique une matrice standard de dichromatie en RVB linéaire (famille Viénot/Brettel) avant de reconvertir et remesurer. La comparaison sans adjacence associe directement l'identifiant numérique de chaque région à une case de palette, en court-circuitant entièrement `assignRegionColors`.
Ce sont des propriétés de la palette et du générateur que ce jeu utilise actuellement. La suite de tests de cet article redérive chaque tableau à partir des modules réels à chaque exécution, si bien qu'un futur changement de palette ou de générateur fait échouer la build au lieu de laisser un chiffre obsolète en ligne.
Regardez le prochain plateau ainsi
Ouvrez un plateau, trouvez les deux régions voisines dont les couleurs vous semblent les plus proches — la plupart des plateaux ont au moins une paire qui mérite un second regard. C'est la marge de sécurité de la palette, fonctionnant comme prévu. C'est aussi une bonne page pour tester un filtre système pour la vision rouge-vert, si vous en avez un à disposition.
Les grilles sont générées dans votre navigateur. Rien de ce que vous jouez n'est envoyé où que ce soit.