Affichage des articles dont le libellé est YphiPuzzle. Afficher tous les articles
Affichage des articles dont le libellé est YphiPuzzle. Afficher tous les articles

vendredi 28 février 2014

[Dart] Code complet d'YphiPuzzle v1

Petite note pour vous informer que le code complet de la première version (Command Line) du jeu YphiPuzzle est disponible dans une page dédiée du blog.


Je ne sais pas où j'irais trouver le temps et l'énergie pour coder la version web, on verra bien. Bon week-end à tous. 

samedi 8 février 2014

[Dart #006] Un peu de contrôle

Résumé des épisodes précédents: J'ai créé un puzzle sous forme d'objet, une fonction pour mélanger ses cases, quatre fonctions pour déplacer ses cases et une dernière pour me dire si oui ou non le puzzle est ordonné.


Il ne me reste plus qu'à écrire ma boucle principale permettant au joueur d'interagir sur le puzzle.

J'initialise 2 puzzles
Le plus simple semble être la lecture de l'entrée standard en utilisant la bibliothèque dart:io.

Je mélange et affiche l'yphi_puzzle
La fonction stdin.readSync() met le programme en écoute et ne reprend la main que lorsque le joueur a validé avec [Entrer].

La boucle principale
Mon programme principal consiste donc à vérifier à chaque tour si le puzzle est ordonné, donner la main au joueur, interpréter sa commande et boucler.

J'ajoute pour le fun un compteur de mouvement et voilà! La première version de YphiPuzzle est terminée. 

Tout ça pour ça -_- ...
Le remplacement de la fonction print par stdout.writeln provoque des comportements étranges. Peut-être qu'il n'est pas possible d'invoquer cette fonction en dehors du programme principal. A creuser...

La semaine prochaine, on commence la version web d'YphiPuzzle.

samedi 1 février 2014

[Dart #005] Un peu d'ordre

Résumé de l'épisode précédent: Mon puzzle est moche et désordonné, mais j'ai codé les 4 mouvements permettant de ranger les cases dans le bon ordre. 


Pour que le jeu ne soit pas sans fin, il me faut une fonction qui m'indique si mon puzzle est ordonné. 

Cette fonction sera invoquée après chaque mouvement pour décider de la fin de la session, alors elle a intérêt à être efficace.

puzzle_in_2 est un puzzle de référence ordonné

La fonction compare_puzzle prend deux Puzzle en entrée, compare une à une les cases du premier puzzle à celles du deuxième puzzle (étant la référence). Dès qu'une différence est notée, la fonction renvoie false. Si toutes les cases sont identiques, alors la fonction répond true.

Bon! On va bientôt pouvoir jouer!

samedi 25 janvier 2014

[Dart #004] Un peu de mouvements

Résumé de l'épisode précédent: Mon puzzle est toujours aussi moche et en plus il est désormais désordonné.


Nous allons maintenant coder les fonctions permettant au joueur de déplacer les cases. 

Haut, Bas, Gauche et Droite. Telles sont les mouvements possibles dans YphiPuzzle.

empty_position est initialisé à la position 15.

La caractéristique empty_position de mon puzzle permet de savoir à tout moment à quelle position se situe l'espace vide. Ainsi, je peux facilement déterminer quelle est l'action à réaliser à chaque mouvement. 


La fonction move_up par exemple vérifie que l'espace vide n'est pas sur la ligne basse du puzzle, auquel cas il est impossible de déplacer une case vers le haut. Autrement, il suffit d'échanger les positions de deux cases, ce qui se fait classiquement grâce à l'utilisation d'une variable temporaire, ici nommée box_to_move.

Un code similaire régie les fonctions move_down, move_left et move_right


Et voilà pour les mouvements! Les maths et les modulos, ça donne mal au crâne :D. La semaine prochaine, je coderais une dernière fonction permettant de dire si mon puzzle est ordonné.

samedi 18 janvier 2014

[Dart #003] Un peu de hasard

Résumé de l'épisode précédent: Mon puzzle ressemble à un truc tout moche en Command Line, mais au moins il est programmé comme un objet.


Passons au 2e besoin: La fonction de mélange aléatoire.

En gros, il s'agit de mélanger les cases du puzzle, i.e. de sortir une suite de 0 à 15 dans le désordre.

Le BASIC proposait déjà à l'époque une fonction random et il en est de même pour Dart.

Ma fonction de mélange va invoquer la Factory Random qui produira un nombre aléatoire entre 0 et 15 (fonction nextInt). J'utilise une List random_list pour les stocker et une autre List check_list pour gérer les doublons. Tant que ma List random_list n'est pas remplie, je boucle.

puzzle_in_1 est le puzzle à mélanger, puzzle_in_2 est un puzzle ordonné témoin
Il s'agit ensuite de repositionner les String [01], ... [EV] dans l'ordre (ou plutôt le désordre) indiqué par la List random_list.

Je prends les cases du puzzle témoin et les positionne suivant random_list
Finalement, c'était moins compliqué que je ne le pensais d'écrire cette partie. Dans mes souvenirs, cela m'avait pris un mois de recherche et coûté l'appel à un ami pour réussir à mélanger le puzzle.

C'est moche et en désordre maintenant...
La semaine prochaine, on se donnera les moyens de le remettre dans l'ordre.


samedi 11 janvier 2014

[Dart #002] Un peu de programmation objet

Résumé de l'épisode précédent: Mon premier programme Dart sera le jeu YphiPuzzle, en version Command Line pour commencer.


List et print m'ont permis d'afficher rapidement une grille de 16 cases vides. 

Je vais maintenant définir une grille en écrivant la class Puzzle, ce qui me permettra d'agir dessus comme un objet.

On reviendra plus tard sur la caractéristique "empty_position"

La class Puzzle contient une List de 16 cases. Pour l'instant, je vais y injecter 16 String: [01],[02],... [15] et [EV] (espace vide). 

La position 0 est le premier élément de la List
Initialement, le puzzle est ordonné, i.e. que la position numéro 0 correspond à [01], le numéro 1 à [02], etc... La position 15 est occupée par [EV].


Afficher le puzzle consiste à faire 4 print.

Bon, ce n'est qu'un début
Voilà! C'est plus propre comme ça. On va pouvoir passer aux choses intéressantes la semaine prochaine.