Mini échiquier 2D des pièces

Les fonctions d’extractions de chaînes de caractères Left(), Mid(), Right().

Les fonctions d’extractions de chaînes de caractères Left(), Mid(), Right().


Ouvrir votre classeur Chess.xls puis le VBE (Alt+F11), la fenêtre Exécution (Ctrl+G), et la fenêtre d’édition sur le module ModChess. On réutilise les constantes et la fonction BoardBuild() définies dans Tout l’échiquier dans une chaîne et la fonction Alphabet() définie dans Alphabet des colonnes.

On se propose d’améliorer la présentation de la chaîne de l’échiquier dans la fenêtre d’Exécution.

Extractions avec Left(nbrChar), Mid(indChar, nbrChar), Right(nbrChar)

Vision linéaire sur une dimension de la chaîne de l'échiquier

On cherche à extraire une rangée complète de l’échiquier avec la fonction Mid()

signifiant au milieu de la chaîne en complément des fonctions Left() [gauche] et Right() [droite].

Le premier caractère d’une String a pour index 1.

Dans la fenêtre d’Exécution :

? Mid(BoardBuild(), 1, 1)

r

C’est l’initiale anglaise de la tour blanche Ta1.

? Mid(BoardBuild(), 1, countFile)

rnbqkbnr

Voilà les pièces blanches de la 1ere rangée. C’est équivalent à :

? Left(BoardBuild(), countFile)

rnbqkbnr

? Mid(BoardBuild(), 1 + countFile, countFile)

pppppppp

Et maintenant les huit pions des Blancs.

? 1 + countFile * (countRank - 1)

57

C’est l’index de la dernière rangée équivalent à :

? Len(BoardBuild()) - countFile + 1

57

? Mid(BoardBuild(), 1 + countFile * (countRank - 1), countFile)

tmvwlvmt

Voilà les pièces noires de la dernière rangée. C’est équivalent à :

? Right(BoardBuild(), countFile)

tmvwlvmt

Calcul de l’échiquier 2D des initiales des pièces

Dans la fenêtre d’édition :

Function BoardDisplay(ByVal strBoard As String) As String
Dim indRank As Byte, strBoardByRank As String

    strBoardByRank = ""
    For indRank = 0 To countRank - 1
        strBoardByRank = CStr(indRank + 1) + ": " + _
            Mid(strBoard, indRank * countRank + 1, countFile) + vbCrLf + strBoardByRank
    Next
    BoardDisplay = strBoardByRank + "   " + Alphabet()
End Function

Affichage du mini échiquier en 2D

Notez l’imbrication des fonctions : BoardBuild() est lui-même paramètre de BoardDisplay().

? BoardDisplay(BoardBuild())

affiche dans la fenêtre d’Exécution :

8: tmvwlvmt
7: oooooooo
6:         
5:         
4:         
3:         
2: pppppppp
1: rnbqkbnr
    abcdefgh

La chaîne de l’échiquier BoardBuild(), qui est une structure linéaire en une seule dimension, est présentée selon une structure en deux dimensions où les Noirs sont en haut et les Blancs en bas.

Pour cela on a inséré un retour-chariot (retour à la ligne) en fin de chaque rangée.

L’échiquier en 2D suivi par le nom de ses colonnes

Le résultat de la fonction BoardDisplay()

BoardDisplay = strBoardByRank + "   " + Alphabet()

est calculé en concaténant trois chaînes :

  • StrBoardByRank est une chaîne locale calculée dans une boucle For Next par rangée. Nous y reviendrons plus en détail.
  • Les trois espaces permettent d’aligner le nom des colonnes.
  • Alphabet() que l’on a vu dans Alphabet des colonnes sont les huit premières lettres de l’alphabet.

On pourrait simplifier cette expression avec une constante littérale de ces huit premières lettres de l’alphabet :

BoardDisplay = strBoardByRank + "   abcdefgh"

Ce serait effectivement beaucoup plus court et rapide !

Cependant si on a introduit la fonction Alphabet(), c’est pour présenter la boucle For Next dans un contexte simple où on connaît intuitivement le résultat attendu. On peut alors se focaliser sur le mécanisme d’insertion en fin de chaîne de la nouvelle lettre de colonne.

Dans la majorité des cas, la concaténation cumulative de deux chaînes se fera en fin de la chaîne résultat comme dans Alphabet(). Cependant StrBoardByRank est une exception et on ne voulait pas présenter la première boucle For Next dans le contexte suivant plus étoffé.

N° de rangée + rangée + retour-chariot et opérateur " _"

Maintenant que l’on a déjà vu le mécanisme de boucle For Next, analysons la construction de strBoardByRank qui est la présentation de l’échiquier rangée par rangée :

        strBoardByRank = CStr(indRank + 1) + ": " + _
            Mid(strBoard, indRank * countRank + 1, countFile) + vbCrLf + strBoardByRank

L’instruction strBoardByRank = CStr(indRank + 1) + ’’ : ’’ + Mid(strBoard, indRank * countRank + 1, countFile) + vbCrLf + strBoardByRank étant assez longue, on l’a coupée en deux en utilisant l’opérateur de continuation de ligne " _" blanc souligné (touche "8" sans Shift) [underscore] qui signifie que la ligne qui suit appartient à la même longue instruction précédente. Notez que l’opérateur de continuation de ligne est toujours préfixé par un espace blanc séparateur. On ne peut pas le coller à l’expression qui est immédiatement à sa gauche.

  • vbCrLf est la constante de type String du saut de ligne (Carriage-Line Feed). Le préfixe "vb" signifie qu’elle est automatiquement définie par VBA.

Pourquoi la concaténation se termine par "+ strBoardByRank" ?

Contrairement à l’addition numérique où 2 + 3 = 3 + 2, la concaténation de chaîne n’est pas commutative.

’’a’’ + ’’b’’ = ’’ab’’ est fortement différent de ’’b’’ + ’’a’’ = ’’ba’’.

Contrairement à la fonction Alphabet() où on ajoutait la lettre de l’alphabet d’indice indFile en fin de la première chaîne, la rangée de pièces est concaténée en début de strBoardByRank.

  • Dans Alphabet() : Alphabet = Alphabet + lettre ’ Concaténation en fin
  • Dans BoardDisplay() : strBoardByRank = rangée + strBoardByRank ’ Concaténation en début

BoardBuild() génère les pièces des Blancs puis en fin de chaîne les pièces des Noirs.

BoardDisplay() commence par afficher les pièces des Noirs et finit par les pièces des Blancs parce qu’usuellement on présente l’échiquier avec les pièces des Noirs en haut et les pièces des Blancs en bas quand c’est aux Blancs de commencer la partie d’Echecs.

Cette inversion visuelle en 2D par rapport à la vision linéaire en une seule dimension de la chaîne représentant l’échiquier complet se traduit par une concaténation en début de chaîne.


Précédent : Alphabet des colonnes

Suivant : Echiquier graphique dans Excel

Posté le 11 juillet 2011 par Matt