Aller au contenu

Un jeu idle tient par ses murs, pas par sa courbe

10 min de lecture

J'en ai écrit un pour un lab, et j'ai raté l'équilibrage trois fois de suite. Chaque correctif est sorti d'une simulation, jamais d'une intuition. La dernière a démoli l'idée à laquelle je tenais le plus.

Diagramme à barres : le plus gros saut de gain sur vingt-deux prestiges vaut 2,0 fois avec le durcissement actuel de 120, 2,0 à 160, 2,9 à 200 et 11,4 à 400, la dernière barre franchissant seule la ligne du garde-fou posée à 10.

Un jeu idle, c’est un compteur qui monte. On achète de quoi le faire monter plus vite, ça coûte de plus en plus cher, et de temps en temps on remet tout à zéro contre un bonus définitif. Le programmer prend une soirée. Le rendre intéressant plus de six minutes, c’est autre chose.

J’en ai écrit un, à manipuler ici. Les maths ont été le plus simple : une cascade de huit paliers, l’exponentielle de sa matrice, des nombres qui ne tiennent plus dans un double. La progression m’a demandé bien davantage, et je l’ai ratée trois fois avant qu’elle tienne. Ce sont ces trois ratés que je raconte, parce que chacun s’est réglé en mesurant, jamais en réfléchissant. La dernière mesure, faite cette semaine, a démoli l’idée à laquelle je tenais le plus ; elle est à la fin.

La courbe compte moins que le rapport

Dans un jeu idle, la production est exponentielle et les prix aussi. C’est la première chose qu’on écrit et elle est juste. Seulement le joueur ne ressent ni l’une ni l’autre, il ressent leur rapport.

Si la production croît comme r^n, les prix comme c^n, et que r et c ne bougent pas, le joueur vit la même chose à 1e6 et à 1e200. Même attente entre deux achats, même geste, même écran au nombre de chiffres près. Un jeu dont la seule variable est un exposant n’a pas de forme. On croit le contraire pendant les trois minutes où on découvre l’écran, et puis non.

Ma cascade produit en t⁸/8! une fois ses huit paliers ouverts, ce qui monte bien plus vite qu’une exponentielle sur la durée d’une partie. Le problème reste entier : monter vite ne donne pas une forme.

La forme vient de ce qui casse ce rapport. Un prix qui durcit, un palier qui s’ouvre, un mur qu’on ne passe pas sans tout remettre à zéro.

Les trente premières secondes sont un autre jeu

Mon jeu a été injouable pendant une version entière, pour une raison idiote.

On démarre avec 10 gouttes. Le premier palier coûte 10 gouttes. Le sélecteur de lot était par défaut sur ×10, donc le seul bouton de la partie réclamait dix paliers d’un coup, très au-dessus des moyens du joueur. Aucun achat n’était donc possible, à aucun moment. Il a fallu un banc automatisé qui clique deux cents fois sans rien acheter pour que je le voie.

Rien à voir avec l’équilibrage : le début d’une partie est un problème à part. Le joueur arrive sans contexte, sans monnaie et sans raison de rester. Tout ce qui doit marcher à cet instant, c’est que son premier geste produise un effet visible. Faites-le vérifier par une machine plutôt que par vous, qui savez déjà où cliquer.

Simulez, votre intuition ment

Un jeu idle se joue sur des heures, donc on ne peut pas l’équilibrer en y jouant. Le tableur n’aide pas davantage : il donne la courbe, alors que la question porte sur ce qu’un joueur en fait.

Ce qui marche, c’est de séparer le moteur de l’affichage et de le faire jouer par un programme. Le mien est un module sans DOM. Je l’importe depuis node, j’en engendre des copies avec d’autres constantes, et un robot joue chacune : il achète ce qu’il peut, ouvre un palier dès que c’est possible, et prestige dès qu’il touche le mur. Trente prestiges en quelques secondes, et autant de variantes à la fois.

La première chose qu’il m’a apprise, je ne l’aurais jamais vue en jouant. Passé une quinzaine de prestiges, les parties tombaient à une seconde et le gain se figeait. Le jeu ne devenait pas trop facile : il s’arrêtait. La boucle tournait encore, en rapportant chaque fois exactement la même chose. En y jouant, j’aurais mis une heure à arriver là, et j’aurais conclu que je jouais mal.

Le débit remplaçait la profondeur, et c’était optimal

Mon jeu a deux axes. La profondeur : ouvrir un palier de plus, ce qui ajoute un degré au polynôme. Le débit : acheter de la vitesse sur les paliers déjà ouverts. La profondeur devait être le chemin, et le débit l’accompagner.

La mesure a dit l’inverse. Le robot touchait le mur à coups de débit, sans jamais ouvrir les derniers paliers, et il avait raison de le faire : la profondeur demande d’attendre, le débit s’achète tout de suite.

Un axe qu’un autre remplace est décoratif. Le correctif tient dans une constante : j’ai durci le prix du débit en , pour qu’il sature avant d’avoir pu remplacer la profondeur. Nouvelle mesure : avec trois paliers ouverts sur huit, le mur devient inatteignable quel que soit le débit acheté ; avec quatre, il tombe en trente-trois secondes.

Depuis, je pose la même question à chaque axe. Que devient un joueur qui l’ignore complètement ? S’il gagne quand même, l’axe n’existe pas.

Écrivez l’équilibrage comme des tests

Les constantes d’un jeu idle forment une vingtaine de nombres qui se tiennent les uns les autres. En bouger un déplace le reste, et ça ne se voit qu’en rejouant. J’ai fini par écrire mes intentions d’équilibrage sous forme de tests, avec leurs noms en français :

  • « la première partie tient en quelques minutes »
  • « la boucle longue ne s’effondre pas »
  • « l’échelle est le chemin, pas un raccourci »

Chacun fait jouer le robot et vérifie une propriété. Le code n’a jamais eu de défaut à cet endroit, ce ne sont donc pas des tests de code : ce sont des décisions de conception, écrites de la seule façon qui leur fasse survivre à la retouche suivante. Le jour où vous relâchez une constante parce que la fin de partie vous ennuie, « l’échelle est le chemin » vous dit ce que vous venez de casser.

Ça m’est arrivé. C’est la section suivante.

Ce qu’une couche de prestige fait vraiment

Le mur de mon jeu est 1,7976931348623157e308, la plus grande valeur qu’un double sait représenter. C’est aussi celui d’Antimatter Dimensions, qui en a fait sa première couche de prestige : on bute dessus, on remet tout à zéro, on en tire une monnaie neuve. Une amélioration « brise l’infini » lève ensuite le plafond, et le jeu continue au-delà.

Chez moi, après le brisement, la partie plafonnait en deux minutes. Le remède semblait évident : relâcher le durcissement du débit, celui-là même que j’avais ajouté pour rendre la profondeur obligatoire. Une constante, une heure de travail, et la fin de partie passait de 1e376 à 1e10731.

Sauf que ça ne marche pas, et c’est ce que j’ai appris de plus utile dans toute l’affaire. Voici le plus gros saut de gain d’un prestige au suivant, sur une boucle de vingt-deux prestiges :

Durcissement après le brisement Plus gros saut de gain Garde-fou (< ×10)
120 (l’existant) ×2,0 passe
160 ×2,0 passe
200 ×2,9 passe
400 ×11,4 échoue

Le saut ne tombe pas au moment où le joueur achète le brisement : là, il ne vaut que ×2,6. Il tombe deux ou trois prestiges plus loin, quand le débit relâché a composé. Et les réglages qui tiennent ne rapportent rien de visible : 1e309 aujourd’hui, 1e327 au plus permissif qui passe. Dix-huit décades, que personne ne remarquera.

La cause est structurelle. Le gain de prestige se lit sur la profondeur atteinte, donc profondeur et économie sont la même variable. Multiplier la profondeur par 1e10000 multiplie l’économie d’autant, et démolit la courbe qu’on vient de passer quatre sections à construire. Il n’y a pas de version courte.

Une couche de prestige n’est donc pas un plus gros nombre. Elle introduit une deuxième variable, qui lit la première sur sa propre échelle. Antimatter Dimensions ne se contente pas de repousser le plafond : il ouvre l’Éternité, dont la monnaie se compte en unités quand celle d’en dessous se comptait en centaines de décades, puis la Réalité, qui recompte encore autrement. Revolution Idle empile ses monnaies sur le même principe. Chaque couche change l’unité de mesure.

On peut jouer très longtemps à ces jeux sans que le nombre affiché ait le moindre sens concret, et il n’a pas besoin d’en avoir : ce qui tient le joueur, c’est de savoir qu’un cran plus loin, ce qu’il vient de faire se relira autrement.

Ce que la couche a appris une fois construite

J’ai fini par l’ajouter au lab. Elle a coûté ce qui était annoncé : une monnaie, un catalogue, une remise à plat, une version 2 du format de sauvegarde. Et elle a appris trois choses que la théorie ne donnait pas.

Le second mur se choisit, le premier était donné. Reprendre 1,80e308, sur les points d’infini cette fois, paraissait la plus belle idée du lab. Mesuré, c’est inatteignable : le gain d’un infini vaut 10^((L−200)/54)L est l’exposant des gouttes, donc 1e308 points demanderait une profondeur de 1e16832, quand deux heures de jeu et cent vingt infinis mènent à 1e5,2 point. Le premier mur venait du matériel et ne se négociait pas ; le second est une décision de conception, et il faut donc le justifier.

La cadence tient dans une seule inégalité. L’achat qui referme la boucle multiplie par dix ce que la couche du dessous rapporte, ce qui vaut ×10^(1/2) sur la monnaie du dessus, soit ×3,16. Son prix montait de ×3 par niveau. Ces 0,16 d’écart ont suffi : la sixième éternité en achetait onze d’un coup et la couche était finie en deux heures. À ×4, la cadence descend doucement, une heure puis dix-huit minutes, quinze, treize, douze. Ce réglage-là n’est pas un curseur qu’on pousse au jugé, c’est le logarithme de l’effet comparé à celui du prix.

Le même défaut revient à chaque couche. Les trois remises à plat du jeu repartent d’un état neuf et recopient ensuite ce qui survit. Les automates avaient déjà disparu à chaque infini, une première fois ; les achats d’éternité ont disparu à chaque poussée, sans rien casser et sans rien afficher, et il a fallu tracer une partie de deux heures pour le voir. C’est maintenant une liste unique, et un test qui s’appelle « aucune remise à plat n’efface ce qui doit survivre ».

Ce que je ferais en premier, la prochaine fois

Écrire le moteur sans affichage, et le robot qui y joue, avant le moindre bouton. Tout ce qu’il y a dans cet article en est sorti, et rien ne m’était venu en jouant.

Ensuite, poser les murs avant les courbes. Une courbe se règle, un mur se conçoit : c’est lui qui décide de la durée d’une partie, du moment où on remet tout à zéro, et de ce qu’on a envie de faire juste après.

Clément Levasseur

© 2026 Clément Levasseur. Tous droits réservés.

LinkedInGitHubEmailFlux RSS