Mini échiquier 2D des pièces

lundi 11 juillet 2011
par  Matt
popularité : 12%

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) [1] 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 ([bleu marine]Carriage-Line Feed[/bleu marine]). 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 [vert]’ Concaténation en début
    [/vert]

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


[1bleu marine]underscore[/bleu marine


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