Coordonnées échiquéennes en Excel VBA (1ere partie)

Calcul de la rangée de la case du Cavalier en g8 à partir du numéro 62 de cette case

Calcul de la rangée de la case du Cavalier en g8 à partir du numéro 62 de cette case


Coordonnées échiquéennes en Excel VBA (1ere partie)

Excel est ouvert sur une feuille vide et l’éditeur VBE à été lancé (Alt+F11).

Continuons l’expérimentation dans la fenêtre Exécution du Visual Basic Editeur (VBE).

Voir Initiation à Excel VBA : la fenêtre Exécution pour ouvrir cette fenêtre (Ctrl+G).

Représentation basique de l’échiquier

Supposons que chaque case de l’échiquier est représentée par un index de 0 à 63.

La première case numérotée 0 est la case de la Tour blanche ’’a1’’.

La dernière case d’index 63 est donc ’’h8’’, la case de la Tour noire sur la grande diagonale a1 h8 au début du jeu.

Expression du problème en paramètre d’entrée et résultat attendu

Il ne faut pas juger si le problème est facile ou non mais appréhender comment il est résolu, en quels termes, avec quelles notions informatiques du langage VBA.

  • Le paramètre d’entrée indexSquare à convertir est l’index numérique de la case. Il varie de 0 à 63 (Integer).
  • Le résultat attendu ’’g8’’ est sa conversion en chaîne de caractères, exemple : ’’a1’’, ’’g2’’, ..., ’’h8’’.

Par convention en VBA, on note une chaîne de caractères (String) entre guillemets américains (double quotes sur la touche "3" du clavier AZERTY sans Shift).

Attention quand Debug.Print affiche une String dans la fenêtre Exécution, il ne mettra pas de guillemets. Les guillemets sont obligatoires quand on programme une constante de type String comme ’’g8’’ dans un code VBA. ’’8’’ est une String. 8 est un Integer.

Résolution du problème en terme d’équation

Depuis l’index dénommé indexSquare de la case, il faut isoler la colonne (file) et la rangée (rank) selon l’équation :

indexSquare = rank * 8 + file

On en déduit que :

rank = indexSquare / 8

et

file = indexSquare - rank * 8

Notez qu’on ne calcule pas file par modulo 8 pour éviter une seconde division plus coûteuse qu’une multiplication suivie d’une soustraction.

file = indexSquare mod 8

C’est plus court à écrire mais plus long à exécuter donc on évite mais si on peut expérimenter l’opérateur mod dans la fenêtre Exécution à titre d’exercice.

Cas pratique : la case g8 a pour indexSquare = 62

Prenons l’index de la case g8 soit 62. C’est le paramètre d’entrée du problème.

indexSquare = 62

VBA n’affiche rien.

? indexSquare

62

Quand le nom de variable (ici indexSquare) est à gauche du signe "=",

cela signifie que le contenu de la variable va être modifié (on dit affecté) par le résultat de l’expression se situant à droite du signe d’affectation "=".

L’expression à droite est ici la constante 62.

Notez que l’inverse 62 = indexSquare

provoquerait une erreur. Compile error : Expected : label or statement or end of statement.

La constante numérique 62 ne peut pas être modifiée bien qu’étant à gauche du "=",

parce que par définition une constante a une valeur constante, immuable.

C’est la principale différence entre une constante et une variable.

Cas pratique : la case 62 a pour rank = 7

La figure suivante montre la rangée 8 avec à l’intérieur de la flèche vers ’’g8’’ la variable rank.

On verra ci-dessous pourquoi il y a une différence entre rangée = 8 et rank = 7.

Quel est le rank de la case 62 ?

?62/8

7,75

Oops, on veut un rank entier (Integer).

Utilisons la division entière exprimée en VBA par un backslash "\" (touche Alt+8)

rank = indexSquare \ 8

VBA n’affiche rien tant on ne lui demande pas avec l’opérateur " ?".

? rank

7

En regardant attentivement l’icône de l’article on constate un décalage entre le zoom sur le rank aligné face au chiffre 7 dans la marge gauche et la rangée 8 (en plus petit au-dessus) correspondant à la case g8. C’est pour montrer qu’il peut y avoir une différence entre la représentation interne du rank par rapport à la représentation externe visible par l’utilisateur, c-a-d la rangée 8 sur l’interface graphique (GUI) de l’échiquier. Le rank évolue en interne de 0 à 7 tandis la rangée est usuellement mentionnée de 1 à 8 sur tous les échiquiers physiques.

Un des objectifs de la résolution du problème (simplifié pour se concentrer sur le langage VBA et non sur l’algorithme) est d’assurer la transition entre la représentation interne optimisée pour le calcul échiquéen et la représentation externe que l’utilisateur a l’habitude de rencontrer.

En conclusion on a décrit le problème en terme de paramètre d’entrée (indexSquare est le n° de la case) et de résultat attendu. Nous avons obtenu un premier résultat partiel rank = 7 qui nous servira prochainement pour afficher le résultat ’’g8’’.


Précédent : Initiation à Excel VBA : la fenêtre Exécution

Suivant : Coordonnées sur l’échiquier (2ème partie)

Posté le 4 juillet 2011 par Matt