Le Sokoban est un jeu de puzzle et de réflexion japonais du début des années 80. L’expérience acquise dans le l’organisation des caisses d’un entrepôts te permettra, on l’espère, d’être plus efficace lorsque tu devras ranger ta chambre !
Nous vous proposons 2 liens distincts, le premier est le lien vers la source du créateur de l’application, le deuxième est un lien alternatif en cas de problème. Seul le premier lien garanti de disposer de la dernière version de l’application ainsi que la documentation écrite directement dans le workshop.
Pour avoir plus que 5 niveaux, il vous faut lire attentivement la documentation : Un Sokoban pour la NumWorks car il va falloir ajouter plusieurs scripts à votre calculatrice.
Le jeu signature des Nokia 3210 et 3310 au début des années 2000. Il s’agit d’un jeu d’adresse et d’anticipation, il faut aussi résister au stress procuré par l’accélération du serpent !
Nous vous proposons 2 liens distincts, le premier est le lien vers la source du créateur de l’application, le deuxième est un lien alternatif en cas de problème. Seul le premier lien garanti de disposer de la dernière version de l’application.
Le LaTeX est un langage de balisage léger très utilisé dans les domaines scientifiques. Ses commandes permettent de structurer les documents (rapports, thèses, livres, articles, publications, lettres…) et d’écrire des formules mathématiques.
Le document proposé vous permet de découvrir ce langage de balisage et de commencer à produire de superbes documents, dans lequel les formules mathématiques seront sublimées.
Le Sokoban est un jeu de puzzle inventé au Japon en 1982. Le principe est simple : vous êtes un gardien d’entrepôt et vous devez amener les caisses aux bons emplacement. Pour cela, vous pouvez uniquement pousser les caisses, et une seule à la fois.*
Une partie des informations de cette page sont extraites de la page Wikipédia Sokoban. Si vous souhaitez creuser le sujet, n’hésitez pas à la consulter.
L’objectif du jeu est de résoudre les niveaux en un nombre minimum de déplacements. Par ailleurs, il existe des milliers de niveaux, pour la majorité créés par la communauté. En fonction de la taille et de la complexité de la grille, ainsi que de l’exigence de l’utilisateur pour réduire son nombre de coups, tous les niveaux de difficultés sont imaginables. Ces éléments donnent une grande durabilité au jeu.
En raison de son apparition rapide dans le monde du jeu vidéo, de sa simplicité apparente et de son intérêt toujours renouvelé, le jeu a connu un grand succès et a été développé sous de nombreuses versions et plateformes. A mon tour de le porter sur la calculatrice NumWorks !
Fonctionnalités
Aide (règles, touches, signification des couleurs) affichée au lancement et accessible à tout moment.
Ajustement de l’affichage à la taille de la grille.
Possibilité d’annuler les mouvements précédents.
Déplacement rapide.
Détection de la victoire.
Ajout et choix de niveaux facile (voir la section correspondante).
Lancer le jeu
Le moteur de jeu et le contenu (les niveaux) sont stockés dans des scripts séparés :
Pour jouer, il faut télécharger ces scripts et exécuter sokoban.py. Il vous est demandé de préciser la cartouche (liste de niveaux) à utiliser ainsi que le niveau auquel vous souhaitez commencer. Il n’est pas nécessaire de remplir ces champs, le jeu commencera par défaut au niveau 1 de la cartouche soko.
Ajouter des niveaux
Si vous venez à bout des 50 niveaux inclus dans la cartouche de base, vous pouvez en télécharger une autre sur le Workshop. Ils sont nommés soko1, soko2, … Pour les utiliser, il suffit de rentrer le nom de la cartouche au lancement du jeu.
Une présentation détaillée de ce projet à été publiée sur tiplanet.org
Un jeu commence souvent par un écran de paramétrage. Celui-ci doit être ergonomique, intuitif, et permettre à l’utilisateur final de personnaliser son expérience ludique. Cette article présente l’un des tout premier menu adaptable conçu en python pour la calculatrice NumWorks, ainsi que 3 exemples d’utrilisation.
Le contexte
Avec la sortie de la version 13.2.0 d’Epsilon, l’OS qui anime la calculatrice NumWorks, les capacités de la calculatrice à exécuter des scripts python a été doublée.
Le tas python « heap » est ainsi passé de 16ko à un peu plus de 31ko. Et on peut donc désormais se lancer dans des projets un peu plus ambitieux.
Après avoir développé chacun un démineur en python pour la NumWorks, nous avons décidé de mettre au point un système de menu commun, paramétrable, utilisable dans ces deux démineurs et dans le snake que Arthur Jacquin a développé.
Ce menu a été codé pour permettre un maximum de souplesse, donc n’hésitez pas à l’utiliser comme tel ou à l’adapter.
D’un écran statique à un menu dynamique
Le « menu » originel de l’un des deux démineurs n’est en fait que du texte, affiché quelques secondes, uniquement lors du premier lancement du jeu. On ne peut pas interagir, et il va falloir intuiter le fonctionner des différentes touches.
Sur une application de calcul mental, nous avions conçu un vrai menu en mode texte :
Avec un système de navigation interne au menu primitif mais fonctionnel.
L’idée était donc de créer un menu ergonomique, sur la couche graphique de la NumWorks.
Les quelques croquis conceptuels ci-dessous illustrent parfaitement le cheminement fait d’essais/erreurs pour concevoir un menu simple, intuitif, ergonomique. La démarche est évidemment ponctuée de tests de positionnement.
Croquis
Test
Vertical ou horizontal ? Hybride ? Finalement, c’est l’affichage vertical qui est retenu, avec une coloration de l’objet actif pour une navigation claire, simple, en flat design.
Menu final – action
Menu final – paramètre
Fonctionnalités
S’accorde avec la couleur de l’OS (Epsilon est orange, Omega rouge),
Permet le paramétrage de 1 à 5 paramètres, comportant autant d’options que souhaité,
Permet une option par défaut pour les paramètres,
Design épuré, minimaliste,
Possibilité d’afficher des informations sur plusieurs lignes.
Brancher le menu sur votre programme
Il suffit ensuite d’appeler la fonction menu() avec votre application. Elle retourne une liste des paramètres validés.
Il est souhaitable de faire cet appel proprement, et de prévoir le cas ou le menu n’est pas disponible, ainsi si le menu n’est pas présent sur la calculatrice, alors le jeu fonctionnera quand même avec des paramètres par défaut.
Pour les utilisateurs avancés de ce menu, il est également possible de modifier les paramètres d’affichage avec une version souple (les versions du menu seront déclinées en fin d’article), permettant ainsi d’afficher plus de 5 paramètres, des chaînes de caractères plus longues, ou d’ajuster selon vos goûts.
Un branchement plus détaillé est présenté à la fin de cet article.
Paramètres de la fonction()
Le deuxième paramètre est le nom de l’action correspondant à la validation des paramètres, ici « Lancer la partie ».
Les paramètres suivants sont stockés dans des listes, il peut y en avoir jusqu’à 4 ou 5 et le dernier gère l’affichage sur deux lignes de manière optionnelle. Chaque paramètre comporte, dans l’ordre :
1 nom (chaîne de caractère)
1 ou plusieurs options
Affichage d’information
Les paramètres, comme leur nom l’indique, sont destinés à paramétrer l’expérience qui suivra ce menu. Cependant, vous pouvez également les utiliser pour afficher des informations, telles que les crédits ou les commandes. C’est notamment pour cela qu’est prévu l’affichage sur plusieurs lignes (qui est optionnel).
L’affichage multiligne n’est utilisable uniquement sur le dernier paramètre, et réduit évidemment le nombre de paramètres possibles. Pour l’activer, il suffit de séparer le contenu de la première ligne et celui de la deuxième par un dollar ($), par exemple :
« Auteur$Vincent Robert »
« Site web$nsi.xyz/snake »
« Navigation$Flèches »
Le dollar ($) est un caractère ACSII standard mais il faudra le saisir depuis le workshop, il n’est pas disponible de le saisir directement sur la calculatrice.
Epsilon ou Omega ?
L’essai d’une fonction exclusive à Omega suffit, et permet un accord visuel de l’objet actif avec la barre de titre de l’écran :
Les différents projets, et notamment les jeux, nécessitent très souvent un système de détection des touches pressées. La fonction wait() est destinée à cet usage, et s’importe en même temps que le menu. Pratique !
def wait(buttons = range(53)): # Attends qu'une des touches précisées soit pressée
while True:
for i in buttons:
if keydown(i):
while keydown(i): True # Fonction anti-rebond
return i
La fonction, par défaut, attendra qu’une des 46 touches soit pressée. Cependant, pour plus d’efficacité et pour n’avoir à traiter uniquement les signaux qui vous intéressent, vous pouvez passer en paramètre la liste des touches à interroger.
La table des codes clavier de la NumWorks est accessible sur cet article de Ti-Planet.
Table des codes clavier
Tester le menu
Le menu est disponible ici :
Menu
Version A
Version B
Variations
Le titre est en noir, quelques variations dans le code mais le rendu final est identique
Le titre est en bleue, quelques variations dans le code mais le rendu final est identique
app.py est l’application qui intègre une copie du code du menu, app_se.py désigne une édition spéciale, allégée de menu qui est appelé depuis un autre script. Ainsi, le code du menu est mutualisé, ce code occupe donc moins de place car l’espace de stockage des scripts sur la calculatrice est limité.
Les applications app_se.py peuvent se lancer à priori sans le menu, mais dans ce cas là, il n’est pas possible de paramétrer l’application. On a encore quelques bug à résoudre, un try import semble ne pas fonctionner … On travaille sur ce sujet. Les applications sans _se sont par contre fonctionnelles.
Si l’équipe de Numworks nous lit, on aimerait bien
profiter un peu des 8 Mo de la ROM de la N0110, et donc avoir plus de 32ko pour stocker nos scripts
Que les touches les touches manquantes soient mappés sur le workshop, c’est à dire qu’il faut mapper toutes les touches en fait et non pas seulement 7…
Brancher proprement le menu sur une application
Un branchement propre est un branchement qui se comporte ainsi :
Si au lancement du script, la fonction menu() n’est pas détectée alors le jeux ou l’application se lance avec les paramètres par défaut, c’est un fonctionnement dégradé mais l’application marche. (On a encore quelques bug à résoudre)
Si au lancement du script, la fonction menu() est détectée, le menu se lance.
Exemple de branchement qui intègre le mode de fonctionnement dégradé :
Pour que tout ceci marche, il faut que la calculatrice importe le script menu.py et le script qui utilise le menu lors de la bascule vers la console d’éxécution. Ce fonctionnement ne peut malheureusement pas être simulé sur le workshop, mais sur calculatrice cela fonctionne.
Depuis le gestionnaire de script python, il suffit d’activer les options : « Importation auto dans la console » des deux scripts.
Enseignant de mathématiques et de spécialité NSI, Lycée Louis Pasteur d’Avignon.
Aime compter jusqu’à 666 mais s’arrête souvent à 42.
Auteur du livre Découvrir la calculatrice NumWorks.
Le snake est un jeu très ancien, apparu en 1976 dans Blockade. Le principe est simple : le joueur dirige un serpent qui grandit, et doit éviter le plus longtemps possible de se mordre la queue ou les bordures. Il existe cependant de très nombreuses variantes. Nous vous proposons ici un snake codé en python pour la NumWorks.
Un classique des portables Nokia sous Symbian OS
Sa simplicité apparente et son caractère addictif l’ont mené à être porté sur de très nombreuses plateformes, provoquant un succès planétaire. Nokia y a grandement participé en l’intégrant sur ses téléphones dès 1998, y compris l’iconique 3310.
Cet article présente donc une énième version de ce jeu, cette fois pour la calculatrice NumWorks.
Evolution et défis
La première version ne propose pas d’option et stocke le corps du serpent dans une liste constituée des coordonnées, en divisant l’écran en une grille de 32 par 20 carreaux :
snake = [[3, 3], [4, 3], [5, 3], [6, 3]] # Corps du serpent, de la queue à la tête
Fonctionnel, très pratique pour le faire avancer, par les méthodes pop()et append(), et pour savoir comment dessiner les bordures. Cependant un problème apparaît rapidement : l’occupation de la mémoire. En effet, les listes, et tout particulièrement les listes de listes, sont très coûteuses.
La première évolution a donc consisté à changer le système de stockage du serpent : désormais, seules les coordonnées de la queue et la tête sont enregistrées, diminuant considérablement la place occupée en mémoire, et ce quelle que soit la longueur du serpent.
snake = [3, 3, 6, 3] # Coordonnées de la queue et de la tête
Cela demande en revanche de modifier l’ensemble des procédures graphiques, et d’utiliser une méthode de détection de couleur de pixel, kandinsky.get_pixel(). Les fonctions get_pixel() et set_pixel()n’étant pas bijectives, il a fallu s’assurer de la bijectivité des couleurs utilisées. (Ceci fera l’objet prochainement d’un article dédié)
Pour éviter des conversions fréquentes entre les coordonnées de la grille et celles des pixels, l’ensemble des coordonnées est ensuite modifié pour ne présenter uniquement des coordonnées en pixels.
snake = [30, 52, 60, 52] # Coordonnées de la queue et de la tête
La gestion de la direction a également suscité réflexion, car il faut pouvoir saisir à tout moment les instructions de changement de direction, et il faut également éviter au joueur de mourir lors des demi-tours. Après quelques améliorations, on arrive à ce code :
# Gestion du temps et de la direction
direction = di
while monotonic() < time + speed: # Attente du prochain rafraîchissement du serpent
for k in range(4): # Changement de direction
if keydown(k) and direction+k != 3: di = k
if keydown(6): start() # Retour au menu
time = monotonic()
A la demande de Robert Vincent, j’adapte le code pour pouvoir implémenter un mode où la téléportation d’un bord à l’autre de l’écran est possible, par un jeu de modulos. Le script perd en optimisation, mais gagne en polyvalence.
Les étapes suivantes sont moins lourdes de conséquences :
ajout de différents niveaux de difficulté, modifiant la vitesse du serpent et l’intensité de son agrandissement à chaque pomme mangée.
ajout du mode « Dingue », où le serpent grandi et accélère tout seul, progressivement, au lieu de manger des pommes.
Les dernières étapes ont été de brancher le jeu sur un menu polyvalent graphique en python codé en parallèle, et de finaliser les options d’accessibilité :