Echiquier graphique dans Excel

Quand le graphisme des pièces apparaît sur la feuille de calcul !

Quand le graphisme des pièces apparaît sur la feuille de calcul !


Comme d’habitude on ouvre le classeur Chess.xls puis le VBE (Alt+F11), la fenêtre Exécution (Ctrl+G), et la fenêtre d’édition du module ModChess.

Tout ce que l’on a fait jusqu’à maintenant dans la fenêtre d’Exécution d’Excel, on aurait très bien pu le faire dans celle de Word ou PowerPoint. La particularité d’Excel est de fournir une feuille de calcul c-a-d, du point de vue VBA, un tableau Cells(colonne, rangée) de cellules organisées en colonnes et rangées dans lesquelles on affichera l’échiquier.

L’utilisateur final n’aura jamais à voir le mini échiquier que le développeur peut afficher en interne dans la fenêtre d’Exécution avec BoardDisplay() parce que l’utilisateur final n’a pas accès à la fenêtre d’Exécution. Il demande à voir un échiquier dans la feuille de calcul Excel.

Le graphisme des pièces grâce à Arena

Arena est l’interface graphique (GUI) freeware pour les moteurs d’Echecs UCI ou Winboard (voir protocole entre moteur et interface graphique). Installez Arena pour organiser des duels entre moteurs d’Echecs au format .pgn avec commentaires d’analyse. La feuille Excel Chess.xls bénéficiera de la police de caractère d’Arena dédiée au jeu d’Echecs.

Echiquier textuel dans la fenêtre d'Exécution vs. dans la feuille de calcul

Avec la police standard Arial, l’échiquier ressemble à l’échiquier textuel des initiales des pièces que l’on avait affiché dans la fenêtre d’Exécution grâce à BoardDisplay().

Avec la police Chess Merida Arena, on obtiendra un rendu graphique des pièces d’où le choix particulier des initiales des pièces Blanches et Noires. Vous pouvez ultérieurement expérimenter d’autres polices échiquéennes (Chess Leipzig, Chess Kingdom, etc.) fournies avec vos logiciels d’Echecs préférés.

Mise en forme de la feuille de calcul

La première question à se poser est de choisir où, dans la feuille de calcul, on va afficher l’échiquier. On décide d’avoir la case a1 de l’échiquier principal en R9C14 et h8 en R2C21 afin de ménager une ligne vide au-dessus et une marge conséquente à sa gauche. On pourra temporairement réduire à zéro la largeur des premières colonnes de la marge si on veut rapprocher l’échiquier du bord gauche comme dans la capture d’écran suivante :

On a sélectionné visuellement la colonne "a" et l’extérieur de la 1ere rangée de façon à mettre en exergue la Tour sur la case a1.

La difficulté avec une police échiquéenne donnée est de régler dans des unités différentes :

  • Les dimensions des cellules pour avoir un échiquier carré donc des cases aussi carrées que possible.
  • La taille des caractères de la police représentant les pièces pour occuper tout l’espace d’une cellule individuelle de l’échiquier sans déborder.

Comme la mise en forme n’est à faire qu’une fois, on ne va pas la coder en VBA mais en langage pseudo-naturel dans le GUI.

Cliquez sur l’Excel menu "Outils" > "Options" > Onglet "General" > [x] R1C1 reference style.

Sélectionner les colonnes 14 à 21 avec Shift + Clic

Bouton droit de la souris > menu contextuel "Largeur de colonne" = 5,86

Sélectionner les rangées 2 à 9

Bouton droit > menu contextuel "Hauteur de rangée" = 35

La cellule R9C14 prend la forme d’un carré.

Sélectionner l’échiquier R2C14 à R9C21.

Changer la police de caractère Arial par Chess Merida Arena taille 32 disponible après avoir installé Arena.

Choisir un cadre (Outline Border) autour de l’échiquier selon vos goûts : double ligne ou trait plus épais.

A l’intérieur de l’échiquier on peut faire apparaître le quadrillage des cases avec un trait fin.

L’échiquier étant toujours sélectionné :

Bouton droit > menu contextuel "Format des cellules" (Format Cells) > Onglet "Bord" (Border) > Extérieur (Outline) du cadre seul

puis plus tard Intérieur (Inside) pour le quadrillage.

Sélectionner l’échiquier et le bord immédiat R2C13 à R10C21.

Bouton droit > Menu "Format des cellules" > Onglet "Alignement" > "Alignement du texte"

Horizontal : Centre

Vertical : Centre

Vous pouvez tester manuellement le graphisme d’une pièce en entrant comme valeur de la cellule R9C14 son initiale anglaise en minuscule telle que "r" pour la rook Ta1.

La case vide est un espace blanc ’’ ’’.

Les constantes

On déclare un couple de constantes rangée et colonne correspondant à la case a1 de l’échiquier principal avec les Blancs en bas.

Dans la fenêtre d’édition du module ModChess, remplacer l’ensemble des constantes déjà définies après Option Explicit par :

Option Explicit

Public Const colBoardMain = 14
Public Const rowBoardMain = 9

Public Const countRank As Byte = 8
Public Const countFile As Byte = 8

Public Const ascFileA As Byte = 97
Public Const ascFileH As Byte = 104

Public Const colorFillBeige = 40

Public Const strGameStartPosition = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1"

La cellule R9C14 correspond au coin inférieur gauche de l’échiquier.

Dans la fenêtre d’Exécution, utilisons les deux nouvelles constantes en affichant le tableau des cellules Cells(row, column). Le premier index est la rangée puis on a la colonne comme pour dans le style de référence de la cellule R9C14 dans la feuille de calcul.

? "Cells(" + CStr(rowBoardMain) + "," + Str(colBoardMain) + ")"

Cells(9, 14)

La différence entre CStr(nombre) et Str(nombre), c’est que Str() affiche d’abord un blanc séparateur si le nombre est positif. Donc on n’a pas besoin d’en ajouter dans ’’,’’.

On n’a pas indiqué de type pour la constante colBoardMain. En tête de module Option Explicit force la déclaration des types pour les variables et non pour les constantes. VBA a choisi automatiquement le type le plus approprié pour la constante selon sa valeur initiale.

? TypeName(colBoardMain)

Integer

Code de l’affichage de l’échiquier dans la feuille de calcul

Dans la fenêtre d’édition du module ModChess, ajouter la procédure suivante.

Une procédure est déclarée entre Sub signifiant subroutine et End Sub.

La déclaration d’une procédure suit le modèle de la Function sauf qu’une procédure n’a pas de type et ne retourne donc pas de résultat.

Lorsqu’on enregistre une macro, c’est toujours une Sub qui est créée.

Quand on code manuellement une Sub, on peut en plus lui définir des paramètres d’entrée (ByVal), de sorties ou d’entrée-sortie (ByRef) exactement comme une Function.

Pour indiquer que la procédure a un effet sur l’interface graphique, c-a-d la feuille de calcul, on adopte la convention du préfixe "Gui" (Graphic User Interface). Qui dit GUI dit augmentation de la complexité, car il faut que cela soit simple pour l’utilisateur final, traduire par plus ou moins complexe pour le développeur.

Ce n’est pas pour rien que les moteurs d’Echecs non pas à développer de GUI (à l’exception d’un mode texte minimal pour le protocole UCI). Ils délèguent à Arena toute la gestion de l’interface graphique et ses interactions avec l’utilisateur.

Sub GuiDisplayBoardAt(ByVal isSideWhite As Boolean, ByVal indRow As Integer, _
    ByVal indCol As Integer, ByVal strBoard As String)
Dim indRank As Byte, indFile As Byte, cellSqr As Range, isSqrWhite As Boolean

    For indRank = 0 To countRank - 1
        If isSideWhite Then
            Cells(indRow + 1, indRank + indCol) = Chr(ascFileA + indRank)
            Cells(indRow - indRank, indCol - 1) = indRank + 1
        Else
            Cells(indRow + 1, indRank + indCol) = Chr(ascFileH - indRank)
            Cells(indRow + indRank - 7, indCol - 1) = indRank + 1
        End If
        For indFile = 0 To countFile - 1
            If isSideWhite Then
                Set cellSqr = Cells(indRow - indRank, indCol + indFile)
            Else
                Set cellSqr = Cells(indRow + indRank - 7, indCol - indFile + 7)
            End If
            cellSqr.Select
            isSqrWhite = (indFile And 1) Xor (indRank And 1)
            Selection.Interior.ColorIndex = IIf(isSqrWhite, xlNone, colorFillBeige)
            cellSqr.Value = Mid(strBoard, indRank * countRank + indFile + 1, 1)
        Next
    Next
End Sub

La structure de la procédure est organisée en un For Next par rangée d’indice indRank.

Le corps du For Next principal comprend un second For Next imbriqué qui permet un balayage de la rangée par colonne d’indice indFile. Notez l’indentation imbriquée par rapport à la marge gauche pour bien identifier à quel For appartient tel Next lui-même aligné avec le mot-clé correspondant.

Du fait du nombre des éléments nouveaux présentés dans cet algorithme, un prochain article sera nécessaire pour aborder chaque explication.

Affichage de l’échiquier dans la feuille de calcul

Dans la fenêtre d’Exécution, on appelle la procédure d’affichage de l’échiquier.

Comme il s’agit d’une Subroutine et non pas d’une Function, on n’a pas à afficher de résultat, donc pas d’opérateur " ?" et pas de parenthèses autour des paramètres.

GuiDisplayBoardAt True, rowBoardMain, colBoardMain, BoardBuild()

Rien ne s’affiche dans la fenêtre d’Exécution mais l’échiquier apparaît enfin dans la feuille de calcul.

Il faut donc basculer entre la fenêtre du VBE et celle d’Excel si elles se chevauchent.

L’échiquier est orienté pour les Blancs en bas. Les Noirs sont donc en haut. Trait aux Blancs !


Précédent : Mini échiquier 2D des pièces

Suivant : VBA affiche l’échiquier

Posté le 12 juillet 2011 par Matt