Mini-Projet
Travail effectué
J’ai choisi les types suivants :
ball : {id : int; pos : Position.t}
{.ocaml} - la donnée d’une balle correspond à un identifiant (id) unique, et à la position où se trouve la balle dans le plan.move : {ball : ball; dir : direction}
{.ocaml} - un “move” est le mouvement d’une balle dans une direction donnéegame : ball list
{.ocaml} - à un instant donné, l’état du jeu est donné par les balles présentes sur le terrain, et leurs positions respectives
et complété le fichier rule.ml
, la fonction loop
(en donnant la possibilité de rejouer la partie précédente) dans game.ml
, avant d’implémenter le solver par la méthode de backtracking préconisée (questions 0,1, et 2).
Améliorations mineures :
- dans
game.ml > create_game ()
:- j’ai rendu impossible la superposition de boules, en remplaçant à la condition
if 0 <= x' && x' < max_x && 0 <= y' && y' < max_y then
par :if 0 <= x' && x' < max_x && 0 <= y' && y' < max_y then && not (Rules.is_ball (Rules.new_game l) p) then
NB : Par évaluation paresseuse, la fonction “coûteuse” (linéaire en le nombre de boules)
Rules.is_ball
ne sera pas évaluée si la position de la boule placée est trivialement invalide (i.e : en dehors de la grille). - j’ai rendu impossible la superposition de boules, en remplaçant à la condition
- j’ai complété la documentation du fichier
position.mli
Bévues
- dans
game.ml > create_game ()
:- j’ai essayé de remplacer
let p = D.position_of_coord x y in let (x',y') = Position.proj_x p, Position.proj_y p in (* balls can not be outside the grid *) if 0 <= x' && x' < max_x && 0 <= y' && y' < max_y then
(ce qui semblait redondant) par
let p = D.position_of_coord x y in (* balls can not be outside the grid *) if 0 <= x && x < max_x && 0 <= y && y < max_y then
Mal m’en a pris ! Il m’a fallu un temps fou avant de comprendre qu’il s’agissait de cette modification en apparence anodine (et pas d’autres plus délicates), qui était à l’origine du fait que les boules ne s’affichaient plus, ultérieurement (bien que que le code compilait) ! Eussé-je pris la peine de lire l’implémentation de
draw.ml > position_of_coord x y
, ça ne serait pas arrivé ! - j’ai essayé de remplacer
Leave a comment