Liste
Solution

Visual Basic - Exercice 5:

(Exercice proposé par Ruben VERA)

La taupe

Le principe:

On se propose d'écrire un programme permettant à un pointeur aveugle (la taupe) de trouver son chemin à travers une grille de 10x10 cases. A l'aide de la souris, vous choisirez une case de départ en cliquant sur celle-ci. A partir de cette case, il devra essayer aléatoirement de se déplacer sur une case libre touchant un de ses côtés immédiats (gauche, droite haut ou bas, mais jamais en diagonale), jusqu'à atteindre la case d'arrivée (10, 10). Il marquera son passage en coloriant chaque case en bleu et en la marquant du numéro de son pas. Une case sur laquelle il est déjà passé n'est pas considérée comme libre – sinon il pourrait tourner en rond… Si aucune case n'est libre autour de lui, elle sera coloriée en rouge, car c'est une impasse. Il devra alors reculer d'un pas et chercher un autre passage.

Programme demandé :

  1. Interface (voir exemple ci-dessous):
  • Le dessin se fera sur la feuille même – le fond utilisé sera celui par défaut
  • Au lancement, le programme devra dessiner une grille de 10 x 10 occupant tout l'espace imprimable de la feuille. Il faudra choisir une échelle appropriée.
  • Aucun menu, aucun bouton. Seul le click de la souris sur la feuille sera intercepté. Pour des raisons pratiques, nous n'utiliserons d'ailleurs pas l'événement Click mais l'événement MouseDown.
  1. Vous devrez déclarer deux tableaux T et P et une variable C , utilisables par toutes les procédures:
  • Un tableau T ( 10 , 10 ) de type long qui contiendra la couleur pour chaque case.
  • Un tableau P ( 100 ) de type XY - à définir dans un module séparé. Ce type se composera de deux entiers nommés X et Y. On stockera ainsi en P les coordonnées de chaque point du parcours de la "taupe" depuis le point de départ jusqu'en (10,10).
  • Un entier C contiendra en permanence l'indice de la position de notre "taupe" dans P. Ainsi, dans l'exemple illustré ci-dessous, pour C = 5 on aurait P(C).X = 3 et P(C).Y = 3 . En principe, C devrait toujours augmenter de 1 à chaque progression de notre taupe, sauf quand celle-ci s'est engagée dans une impasse et doit par conséquent reculer successivement jusqu'à la dernière position offrant au moins une liberté de mouvement non-exploitée.
  1. Vous devrez écrire une fonction Impasse de type Boolean définie comme suit :
  • Elle doit renvoyer True (vrai) par défaut. On déclare ainsi que l'on est dans une impasse, à moins de découvrir qu'une des 4 cases limitrophes de la position courante P(C) est libre. Pour savoir si une case est "libre", il suffit de s'assurer que sa couleur est à 0, valeur attribuée par défaut à tout élément du tableau T lors de sa création. Bien sûr, on ne teste que les cases limitrophes qui se situent à l'intérieur des limites physiques du tableau (X ou Y entre 0 et 10) !
  • Si l'une de ces cases légitimes est libre, elle renvoie alors False (faux)
  1. Vous devrez écrire une procédure marquer recevant l'argument couleur de type long comme suit :
  • Elle aura pour but de "marquer" la case courante P(C) avec la couleur passée en argument en utilisant la méthode line …, couleur, BF
  • Elle imprimera la valeur de C sur cette même case.

Rappel: vous pouvez ajuster la position du curseur graphique avec Form1.CurrentX et Form1.CurrentY, puis imprimer avec Form1.Print

  1. Comme expliqué plus haut, l'essentiel du programme sera écrit dans Form_MouseDown :
  • On initialise C à 1 et P(C) avec les valeurs choisies par la souris. Cette case sera marquée avec VbGreen
  • On effectue une boucle qui ne s'arrêtera que lorsque l'on sera arrivé en (10,10) :

Après avoir traité le cas d'une impasse (case à marquer avec VbRed), on propose aléatoirement une nouvelle case limitrophe (voir l'astuce ci-dessous). Si celle-ci est acceptable et libre, alors on s'y déplace et elle est marquée avec VbBlue.

Astuce: Pour chercher une nouvelle case où aller, vous pouvez vous inspirer de l'exemple ci dessous :

r = Int(Rnd * 4) * 1.57

Xnew = p(c).X + CInt(Cos(r))

Ynew = p(c).Y + CInt(Sin(r))

 

En cliquant sur (3,1), on peut obtenir :

 

    ( SOLUTION DE L'EXERCICE 5 )