Page 1 of 2

Un Sokoban pour la NumWorks

Unread postPosted: 28 Jun 2020, 21:12
by Arthur Jacquin

Présentation



Une partie des informations suivantes sont extraites de la page Wikipédia Sokoban. Si vous souhaitez creuser le sujet, n'hésitez pas à la consulter.


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.

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 !

Avantages et inconvénients


Le jeu est particulièrement adapté à un portage sur NumWorks :
  • Sa simplicité graphique lui évite de se confronter à la faiblesse du module graphique kandinsky.
  • Contrairement à des jeux en temps réel (tetris, snake), le jeu n'attend que les actions de l'utilisateur, ce qui facilite le traitement (tant algorithmiquement que matériellement).
  • Le jeu développe les compétences logiquo-mathématiques, donc légitime pour un jeu sur calculatrice.

Le portage n'est pas non plus sans contraintes :
  • Impossibilité d'enregistrer des informations, notamment les records.
  • Stockage très limité, ne permettant qu'un nombre limité de niveaux téléchargés en même temps.
  • Interface visuelle très restreinte.

Objectifs et cahier des charges


  • Très simple d'utilisation, pour démocratiser le jeu et ne pas le restreindre aux curieux qui l'auront téléchargé.
  • Séparation claire du moteur de jeu et du contenu (niveaux), pour pouvoir changer le contenu facilement.
  • Utilisation d'un format officiel de stockage de niveaux, permettant ainsi d'utiliser ceux créés par la communauté.
  • Utilisation de la version compressée du format officiel de stockage de niveaux, pour des raisons évidentes de stockage.
  • Pas d'optimisations entraînant une détérioration du code trop importante.

Fonctionnalités


  • Affichage de l'aide lors du lancement (règles, touches, signification des couleurs).
  • Interface de jeu minimale, pour laisser de la place au niveau.
  • Commandes accessibles à tout moment.
  • Ajustement de l'affichage à la taille de la grille.
  • Annulation des mouvements précédents (jusqu'à 20 mouvements, pour ne pas prendre trop de place).

Commandes


  • Flèches pour se déplacer.
  • CLEAR pour annuler un mouvement.
  • Ans pour voir l'aide (réinitialise la progression dans le niveau).
  • EXE pour réinitialiser la progression dans un niveau.
  • + et - pour changer de niveau.

Changer les niveaux


Les niveaux sont stockés dans la liste LEVELS. Pour en changer, il suffit donc de les remplacer par ceux de votre choix.

Les niveaux par défaut sont les 15 premiers niveaux officiels. L'ensemble des niveaux officiels (50 originels et 41 rajoutés a posteriori) sont disponibles sous le format directement exploitables dans ce fichier : Niveaux officiels. Ce fichier contiendra également des niveaux non officiels que j'ai trouvé intéressants.

Des milliers de niveaux supplémentaires sont également disponible ici. Après avoir téléchargé les fichiers, vous pouvez extraire les niveaux dans le format exploitable pour la NumWorks de la façon suivante :
  1. Télécharger le script d'extraction et le placer dans le même dossier que les fichiers .slc ;
  2. Exécuter le script ;
  3. Utiliser les outils.

Exemple d'utilisation pour l'extraction des 3 premiers niveaux du fichier Original.slc :

Code: Select all
>>> listing(extract('Original.slc')[:3])
4-5#10-|4-#3-#10-|4-#$--#10-|--3#--$##9-|--#--$-$-#9-|3#-#-##-#3-6#|#3-#-##-5#--..#|#-$--$10-..#|5#-3#-#@##--..#|4-#5-9#|4-7#8-
12#--|#..--#5-3#|#..--#-$--$--#|#..--#$4#--#|#..4-@-##--#|#..--#-#--$-##|6#-##$-$-#|--#-$--$-$-$-#|--#4-#5-#|--12#
8-8#-|8-#5-@#-|8-#-$#$-##-|8-#-$--$#--|8-##$-$-#--|9#-$-#-3#|#4.--##-$--$--#|##3.4-$--$3-#|#4.--10#|8#9-

Utilité des différentes fonctions :
  • extract(file_path) : extraie les niveaux du fichier .slc, retourne la liste des niveaux.
  • generate(level) : affiche, sous aspect décompressé, le niveau communiqué (sous format compressé).
  • affichage(LEVELS) : affiche, sous aspect décompressé, les niveaux (sous format compressé) de la liste LEVELS communiquée.
  • listing(LEVELS, beautify = False): affiche, sous format compressé, les niveaux (sous format compressé) de la liste LEVELS communiquée. Permet également d'automatiser la mise en forme préparatoire pour le copier-coller dans une liste (avec beautify = True).

Conclusion


Le jeu est disponible au téléchargement dans le Workshop NumWorks. Si vous souhaitez modifier le jeu, j'ai gardé des versions de développement (pas encore nettoyées et publiées, demandez moi).

J'ai pris beaucoup de plaisir à développer le jeu ! Vos retours sont bienvenus.

A l'instar des niveaux, les couleurs des différents éléments et de l'arrière plan sont facilement modifiables. N'hésitez pas à partager vos propositions graphiques, je ne suis pas encore convaincu par l'actuelle.

Re: Un Sokoban pour la NumWorks

Unread postPosted: 29 Jun 2020, 11:35
by critor
Merci, belle réalisation. :)

Petites suggestions :
  • permettre de laisser les touches directionnelles enfoncées pour les déplacements, d'autant plus que la croix directionnelle n'est pas des plus agréables pour les jeux sur NumWorks
  • passer automatiquement au niveau suivant (ou afficher quelque chose) quand on gagne à un niveau

Re: Un Sokoban pour la NumWorks

Unread postPosted: 29 Jun 2020, 11:53
by cent20
Quelques modifications que moi je verrais bien :

- Proposer une couleur hors des murs différentes de celle dans les murs (et ainsi, on peut afficher les murs et le fond de carte de la même couleur, ça sera plus immersif. Ceci dit vu comment c'est généré il va falloir un script de recherche du fond de carte et ça s'annonce chaud...
- Ne sauvegarder que 10 anciennes positions (pour gagner en mémoire) mais ne les sauvegarder que 1 fois sur 5. On peut donc rembobiner sur 50 coups avec 2x moins de mémoire.
- Proposer les niveaux dans un fichier externe. N'inclure que 3 niveau et proposer des fichiers que l'ont peut inclure ou pas au lancement du jeu, des packs de 10 niveau par ex. Plus facile que de proposer au joueur de décompresser lui même ces niveaux
(Permet aussi de gagner en mémoire ou pas ... A voir)
- Ecrire l'article sur nsi.xyz, une promesse est une promesse ! ;)

Re: Un Sokoban pour la NumWorks

Unread postPosted: 29 Jun 2020, 13:27
by Arthur Jacquin
Merci de vos retours. Par rapport à vos suggestions, voici ce que je propose de faire pour la prochaine version :

critor wrote:permettre de laisser les touches directionnelles enfoncées pour les déplacements, d'autant plus que la croix directionnelle n'est pas des plus agréables pour les jeux sur NumWorks


Enlever la nécessité de relâcher les touches si la touche OK est enfoncée. Comme ça pas besoin de mettre un délai sur chaque mouvement, mais uniquement lors du déplacement multiple (c'est nécessaire pour pas aller trop vite).

critor wrote:passer automatiquement au niveau suivant (ou afficher quelque chose) quand on gagne à un niveau


Afficher le score en vert lorsque de la victoire ? Passer automatiquement au niveau supérieur est embêtant car on perd la progression.

cent20 wrote:Proposer une couleur hors des murs différentes de celle dans les murs (et ainsi, on peut afficher les murs et le fond de carte de la même couleur, ça sera plus immersif. Ceci dit vu comment c'est généré il va falloir un script de recherche du fond de carte et ça s'annonce chaud...


Je pense que modifier les niveaux avec un nouveau caractère "transparent" est préférable à un script de recherche. Je suis pas trop pour. A voir.

cent20 wrote:Ne sauvegarder que 10 anciennes positions (pour gagner en mémoire) mais ne les sauvegarder que 1 fois sur 5. On peut donc rembobiner sur 50 coups avec 2x moins de mémoire.


Avec de la magie ? Je me demande comment vous compter rembobiner un coup non enregistré. La mémoire n'est pas non plus un gros problème pour l'historique, sur ma calculatrice j'ai défini la profondeur de mémoire sur 100 pour faciliter les parties et il n'y a eu aucun problème.

cent20 wrote:Proposer les niveaux dans un fichier externe. N'inclure que 3 niveau et proposer des fichiers que l'ont peut inclure ou pas au lancement du jeu, des packs de 10 niveau par ex. Plus facile que de proposer au joueur de décompresser lui même ces niveaux


La décompression n'est pas nécessaire, il y a déjà près de 100 niveaux prêts à l'emploi ici et je compte en rajouter.

En revanche les mettre dans un fichier externe est une bonne idée. En important en mémoire vive un seul niveau à la fois, on pourrait probablement augmenter le nombre de niveaux stockés sur la calculatrice. Il faut donc faire un menu de choix de cartouche à importer. Peut-on récupérer le nom des scripts présents ?

Re: Un Sokoban pour la NumWorks

Unread postPosted: 29 Jun 2020, 22:55
by Arthur Jacquin
Nouvelle version :

  • Déplacement rapide avec la touche OK enfoncée.
  • Détection de la victoire.
  • Séparation des niveaux dans un autre script. Demande au lancement la cartouche à utiliser et le niveau où commencer.

Présentation sur nsi.xyz (lien pas encore actif, attente de validation de l'article).


Des cartouches supplémentaires devraient être générées prochainement.

Re: Un Sokoban pour la NumWorks

Unread postPosted: 29 Jun 2020, 23:50
by critor
Merci pour les améliorations. :)

Arthur Jacquin wrote:Déplacement rapide avec la touche OK enfoncée.

Déjà que la croix directionnelle n'est pas très confortable pour une utilisation intensive, je ne suis pas très fan d'avoir en prime la touche
OK
à maintenir enfoncée en quasi-permanence.

Pourquoi ne pas coder un simple délai d'une fraction de seconde avant répétition de l'action ?

Re: Un Sokoban pour la NumWorks

Unread postPosted: 30 Jun 2020, 08:48
by cent20
critor wrote:Merci pour les améliorations. :)

Arthur Jacquin wrote:Déplacement rapide avec la touche OK enfoncée.

Déjà que la croix directionnelle n'est pas très confortable pour une utilisation intensive, je ne suis pas très fan d'avoir en prime la touche
OK
à maintenir enfoncée en quasi-permanence.

Pourquoi ne pas coder un simple délai d'une fraction de seconde avant répétition de l'action ?


Vu qu’on peut revenir en arrière, je suis d’accord avec critor.
Et pour le tour de magie, au lieu de sauvegarder à chaque mouvement il suffit de ne sauvegarder que les coups %5 == 0

Re: Un Sokoban pour la NumWorks

Unread postPosted: 30 Jun 2020, 09:09
by Arthur Jacquin
Plus besoin d'appuyer sur OK sur la version en ligne.

Je suis pas sûr que ce soit la bonne solution. Le délai empêche de détecter de nouveaux clics, donc complique l'utilisation au clic par clic (car rajoute un délai humain pour voir si le clic a été pris en compte). Après pas mal de test, je n'ai pas trouvé de durée de délai qui ne gène pas la jouabilité au clic par clic et propose une vitesse de déplacement satisfaisante. Je garderai la version avec OK.

cent20 wrote:Et pour le tour de magie, au lieu de sauvegarder à chaque mouvement il suffit de ne sauvegarder que les coups %5 == 0


Mais comment annuler un coup non enregistré ?

Re: Un Sokoban pour la NumWorks

Unread postPosted: 30 Jun 2020, 09:53
by critor
C'est pourtant une architecture de jeu standard.
Une boucle principale d'entrées-sorties, avec un délai, éventuellement variable en fonction du contexte.

Très étrange que tu ne trouves pas.

Re: Un Sokoban pour la NumWorks

Unread postPosted: 30 Jun 2020, 12:39
by cent20
critor wrote:éventuellement variable en fonction du contexte.


Ah oui, ça c'est génial :
déplacement simple : délai réduit = on peut aller vite
On pousse un objet = c'est lourd = On ralenti !