Tout l’échiquier dans une chaîne

samedi 9 juillet 2011
par  Matt
popularité : 11%

Création d’un échiquier en trois de lignes de code VBA.


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.

Les constantes

Une constante a une valeur qui ne change pas. On ne peut pas la modifier.

Dans la fenêtre d’édition du module ModChess, on place la déclaration des constantes généralement après Option Explicit et avant la première fonction.

Option Explicit

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 strGameStartPosition = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1"

En VBA, on déclare une constante par le mot-clé Const suivi du nom de la constante, optionnellement son type, puis "=" et enfin sa valeur. C’est donc une affection de la constante qui ressemble à une affection de variable sauf qu’elle commence par Const et que cette affection est unique au moment de la déclaration et non dans une instruction du corps d’une fonction. C’est l’unique moment où vous verrez une constante en partie gauche du symbole d’affectation "=".

Pour le nombre maximum de rangées ou de colonnes de l’échiquier, on a voulu préciser un type plus restreint qu’un Integer en indiquant explicitement le type As Byte. Cela signifie que l’on ne peut initialiser la constante qu’avec un entier entre 0 et 255 alors qu’un Integer peut être négatif et/ou beaucoup plus grand. Si à cause d’un bug l’indice de colonne dépasse 255 ou devient négatif, on aura automatiquement une erreur qui ne serait pas détectée avec un Integer.

Le mot-clé Public avant Const définit l’étendue de visibilité ([bleu marine]scope[/bleu marine]) de la constante pour tous les modules, c-a-d que la constante est connue dans tous les modules et doit être unique.
Définir une constante Public est aussi utile dans la fenêtre d’Exécution sinon la constante n’est pas reconnue.

? ascFileA

97

On reconnaît cette valeur que l’on a vue dans Coordonnées sur l’échiquier (2eme partie).

? Asc("a")

97

Cette valeur ASCII est fixe. Plutôt que de l’évaluer à chaque fois par l’appel de la fonction Asc(), on décide de déclarer la constante correspondante avec la dite valeur fixe. Cela prend un tout petit peu plus de place, mais c’est beaucoup plus rapide que d’appeler la fonction Asc() en terme de temps d’exécution.

En VBA, on ne peut pas utiliser d’appel de fonction pour initialiser la valeur d’une constante. Const ascFileA = Asc(’’a’’) n’est pas accepté. Seule une constante numérique ou de chaîne littérale est valable dans une déclaration de constante.

Représentation d’une pièce par une lettre unique

Choisissons une nouvelle représentation de l’échiquier avec une lettre minuscule par pièce selon le type de la pièce et sa couleur.

Pièce par couleurBlancsNoirs
Roi ’’k’’ ’’l’’
Dame ’’q’’ ’’w’’
Tour ’’r’’ ’’t’’
Fou ’’b’’ ’’v’’
Cavalier ’’n’’ ’’m’’
Pion ’’p’’ ’’o’’

Pour les Blancs, c’est l’initiale internationale (en anglais) du nom de la pièce : king, queen, rook, bishop, knight (et non ’’k’’ déjà utilisé pour king), pawn. Pour les Noirs, on a choisi d’autres lettres uniques.

Tout l’échiquier dans une String

Notre but est de représenter la position initiale des pièces sur l’échiquier au début d’une partie par une seule String. La fonction BoardBuild() sans paramètre retourne l’échiquier initial.

Comme il s’agit d’une déclaration de fonction, insérez dans la fenêtre d’édition (ou de code) du module ModChess après la déclaration des constantes ou après la déclaration de FileRankToString() :

Function BoardBuild() As String
Dim strPieceWhite As String, strPieceBlack As String

   strPieceWhite = "rnbqkbnr" + String(countFile, "p")
   strPieceBlack = String(countFile, "o") + "tmvwlvmt"
   BoardBuild = strPieceWhite + String(4 * countFile, " ") + strPieceBlack
End Function

On utilise une nouvelle fonction String(nombre de répétition, caractère) qui retourne n fois le caractère fourni en paramètre. String(8, ’’p’’) génère les huit pions Blancs. String(8, ’’ ’’) est une rangée entièrement vide. Il y a quatre rangées vides entre les pions Blancs et les pions Noirs.

Dans la fenêtre d’Exécution :

? BoardBuild()

rnbqkbnrpppppppp                                ooooooootmvwlvmt

Le début de la chaîne ressemble fortement avec la notation FEN (Forsyth-Edwards Notation) de la position de départ :

? strGameStartPosition

rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1

Calculons la longueur ([bleu marine]Length[/bleu marine]) de la chaîne représentant l’échiquier complet :

? Len(BoardBuild())

64

Il y a bien 64 cases sur l’échiquier.

Tout l’échiquier est représenté dans une seule String ! On peut difficilement faire plus court (trois lignes de code VBA hors déclaration) pour construire un échiquier complet puis l’afficher.

Prochainement on n’améliorera progressivement la présentation de ce premier échiquier d’abord dans la fenêtre d’Exécution pour le développeur puis dans la feuille de calcul pour l’utilisateur final.


Précédent : Mise au point avec le débogueur VBA

Suivant : Alphabet des colonnes


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