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ée
  • game : 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 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é !

Updated:

Leave a comment