Echiquier graphique dans Excel

mardi 12 juillet 2011
par  Matt
popularité : 10%

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 ([bleu marine]Outline Border[/bleu marine]) 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" ([bleu marine]Format Cells[/bleu marine]) > Onglet "Bord" ([bleu marine]Border[/bleu marine]) > Extérieur ([bleu marine]Outline[/bleu marine]) du cadre seul

puis plus tard Intérieur ([bleu marine]Inside[/bleu marine]) 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 [bleu marine]rook[/bleu marine] 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([bleu marine]row[/bleu marine],[bleu marine] column[/bleu marine]). 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


Brèves

Championnat jeunes 2018

dimanche 25 février 2018

A St Sernin sur Rance, Vadim Breton se qualifie pour le championnat de France jeunes. Il termine à la 4ème place des benjamins. http://echecs-occitanie.com/spip.php?article382&mode=AF

Les Jeunes qualifiés en NIII !

mercredi 14 décembre 2016

Dimanche 11 décembre 2016, aux interclubs jeunes à Leguevin, notre équipe a gagné un match et fait match nul aux deux autres.

L’équipe composée de Xavier, Vadim, Aurélie et Titouan termine 8ème et se qualifie pour la N3. A noter que Xavier et Vadim ont gagné toutes leurs parties.

Sur le Web : Site de la LMPE

Championnat jeunes

lundi 5 décembre 2016

Xavier, Vadim et Martin trois champions du Tarn et Garonne
Lire l’article

Coupe Loubatière

lundi 5 décembre 2016

Le club qualifié pour la phase régionale de la coupe Loubatière
Lire l’article

Sur le Web : Coupe Loubatière

Tournoi interne 2016-2017

lundi 5 décembre 2016

C’est reparti pour le tournoi interne : 1 partie par mois de novembre à mai
Lire l’article

Live Playchess.com

mercredi 7 septembre 2016