Aller au contenu principal
sports_esports Lab Canvas 2D Niveaux en données Undo Zéro dépendance

Sokoban — la logique de poussée, des niveaux en données et l'annulation

Le casse-tête d'entrepôt de 1981, réécrit from scratch en Canvas 2D : une règle de poussée où un pas n'est permis que si la case visée est libre (ou occupée par une caisse dont la case suivante est libre), des niveaux décrits en grilles de caractères et un historique d'états pour annuler chaque coup. Zéro dépendance.

Flèches ← ↑ → ↓, W A S D ou balayage : pousser U : annuler le dernier coup R : recommencer le niveau

Un casse-tête d'entrepôt en quelques kilo-octets

Sokoban (« gardien d'entrepôt » en japonais, 1981) tient en une règle : pousser des caisses sur leurs emplacements, dans une grille de murs et de sol. On ne peut que pousser, jamais tirer, et jamais deux caisses à la fois. Cette contrainte minuscule suffit à produire des situations irréversibles — je m'en sers ici pour montrer, à ciel ouvert, comment on modélise une règle de jeu, comment on décrit un niveau en données, et comment on rend une action annulable.

La logique de poussée, au cœur du jeu

Toute la mécanique tient dans une seule fonction. Quand le joueur avance d'un pas, je regarde la case visée : si c'est un mur, rien ne bouge ; si elle est libre, le joueur s'y déplace ; si elle contient une caisse, je regarde la case juste derrière — le déplacement n'est autorisé que si cette case-là est elle-même libre (ni mur, ni autre caisse). C'est cette double vérification qui interdit de pousser deux caisses d'un coup et qui rend certaines erreurs définitives. Une règle claire, exprimée en quelques lignes, plutôt qu'un empilement de cas particuliers.

Des niveaux décrits en données, pas en code

Chaque niveau n'est pas dessiné dans le code : c'est un simple tableau de chaînes de caractères, où # est un mur, . une cible, $ une caisse et @ le joueur. Un court analyseur transforme cette grille lisible en structures de jeu (murs, cibles, caisses, position de départ). Résultat : ajouter, corriger ou réordonner un niveau se fait en éditant du texte, sans toucher à la logique. Séparer les données du moteur, c'est exactement ce qui rend un logiciel facile à faire évoluer.

Annuler, grâce à un historique d'états

Comme un mauvais coup peut bloquer une caisse, l'annulation n'est pas un confort mais une nécessité. Avant chaque déplacement, j'empile un instantané de l'état (position du joueur, position de chaque caisse, nombre de pas) dans une pile. La touche U dépile le dernier instantané et le restaure : on remonte le temps, pas à pas. C'est le même principe qui, à plus grande échelle, sous-tend le « annuler » d'un éditeur ou l'historique d'une application métier — un état immuable qu'on archive avant chaque changement.

Ce que ça dit de ma façon de travailler

Un jeu jouable en quelques kilo-octets, sans dépendance, illustre une conviction que j'applique à vos projets : la valeur naît d'un modèle juste et d'un code lisible, pas d'un empilement d'outils. Une règle bien posée, des données séparées du moteur et des actions réversibles donnent un logiciel qu'on comprend, qu'on teste et qu'on fait durer — dont vous gardez la pleine maîtrise.

Photo d'Emmanuel BALLERY, fondateur de x10

À propos de l'auteur

Emmanuel BALLERY est le fondateur de x10 solutions. Ces petits jeux sont surtout un plaisir de développeur, codés le week-end — pas une vitrine de mes missions, qui sont bien plus exigeantes. J'y soigne quand même la performance et la lisibilité, par habitude.

Voir plus arrow_forward
rocket_launch

Un vrai projet en tête ?

Ce petit jeu m'amuse, mais il ne dit pas grand-chose de mon métier : mes missions sont bien plus complexes. Si vous avez une application à concevoir ou à fiabiliser, c'est là que je suis vraiment utile.

Discuter de mon projet arrow_forward