vendredi 3 juin 2011

Robozzle

Attention, jeu chronophage ! Robozzle est le jeu de programmation sur lequel j'ai passé le plus de temps et de loin (même si SpaceChem risque à terme de le détrôner). Dans Robozzle, vous dirigez un petit vaisseau chargé de ramasser des étoiles disséminées sur une grille colorée. Mais pour cela, pas de contrôles interactifs : vous devez programmer votre vaisseau.

Un niveau en cours d'exécution

Vous disposez pour cela de trois instructions principales : avancer d'une case, faire un quart de tour vers la gauche et faire un quart de tour vers la droite. Vous disposez également d'instructions permettant d'appeler les fonctions qui composent votre programme. Dans certains puzzles, vous avez la possibilité de peindre la case sur laquelle vous êtes. Et enfin chaque instruction peut être associée à une couleur : si c'est le cas, alors au moment d'exécuter l'instruction votre vaisseau vérifiera au préalable que la couleur correspond à celle de la case sur laquelle il est.

Au final, on a là un vrai langage de programmation : instructions élémentaires, tests et instructions conditionnelles, découpage en fonctions, récursivité, pile des appels, lecture et écriture sur la grille... Et développer une solution à un puzzle demande le même genre de gymnastique intellectuelle que certains exercices de programmation. Alors, j'avance tout droit, si j'arrive sur une case verte je tourne à droite, si par contre elle est rouge j'appelle ma sous-fonction F2, puis j'appelle récursivement la fonction de départ F1... ah zut j'ai pas prévu le retour, alors il faudrait peindre en rouge toutes les cases vertes lors du premier passage...

Instructions et fonctions

Le jeu est fait en Silverlight, mais une version JavaScript du site existe (ce qui permet de jouer gratuitement sur un téléphone sans passer par les versions moches et chères vendues pour ces supports). Je recommande de passer par la version Silverlight dans la mesure du possible ; elle contient un tutoriel et un mode campagne que la version JavaScript ne contient pas ou présente mal (respectivement).

Qui plus est, le jeu est enrichi en permanence par les puzzles créés et soumis par la communauté ; il est possible de voter pour les puzzles et de proposer un niveau de difficulté une fois ceux-ci réussis. À moins d'avoir un programme de résolution automatique des puzzles, il est à peu près humainement impossible d'en voir le bout...

...ce serait intéressant d'avoir un programme qui trouve le programme, non ? Avec un ami (Goulagman pour ceux qui le connaissent (connu aussi sous le surnom de "mon voisin du dessus") (son blog (classé 'M' par l'ESRB ^^))) nous avions commencé à plancher sur un programme de résolution automatique des puzzles sobrement intitulé Zolver, avec pour but à terme de le brancher à un petit script qui se serait occupé de récupérer automatiquement les puzzles puis de soumettre la solution. Qu'importe que ce soit probablement un problème NP-complet ? Où serait la difficulté sinon ? :)

Nous avons depuis un peu abandonné le projet ; j'ai toujours une tarball et un SVN à disposition, il compile toujours ; Alexandre doit toujours avoir le port pour Windows du projet. C'est du C++ avec Boost, rien de bien méchant. Dans son état actuel, le programme est capable de lire un puzzle, de faire tourner un programme pour en vérifier la validité, d'essayer de trouver la solution avec deux algos différents et d'afficher le résultat. L'algo de résolution brute-force marche mais est très lent (sans surprise), et l'algo de résolution un poil plus intelligent (qui se contente pour l'instant d'éliminer tous les cas absurdes ou redondants) est bien plus rapide mais pas encore totalement au point. Bref, si ça vous intéresse de faire vivre le projet, manifestez-vous !

Bref, Robozzle c'est bon, mangez-en ! Mais faites attention, c'est très addictif. Si vous reconnaissez avoir lu les messages d'avertissement ci-dessus et souhaitez malgré tout continuer vers Robozzle, cliquez ici.

Aucun commentaire:

Enregistrer un commentaire

(Les messages sont modérés a priori.)