Affichage des coups des Blancs en VBA

Notation et affichage amélioré des coups : DbgMovesNotation, DgbMovesPrint

Notation et affichage amélioré des coups : DbgMovesNotation, DgbMovesPrint


Le générateur de coup du pion e2 du Roi génère une liste de deux coups.

Automatisons la notation de chaque coup et améliorons l’affichage de tous les coups des Blancs.


Notation d’une liste de coups

Comme on a vu dans la session précédente le système de notation d’un coup, on veut le généraliser à une liste de coups.

Ouvrir le classeur Chess.xls contenant les modules importés de ChessVba04.zip.

Ouvrir le VBE : Visual Basic Editeur (Alt+F11)

Dans la fenêtre projet du VBE, cliquez sur le module ModChess.

Dans la liste des procédures du VBE, sélectionner DgbMovesPrint.

Au-dessus de DgbMovesPrint(), copier-coller la procédure DbgMovesNotation()

Sub DbgMovesNotation(ByVal listMove As Collection)
Dim indMove As Integer, moveThis As Move
    
    If Not listMove Is Nothing Then
        For indMove = 1 To listMove.Count
            Set moveThis = listMove(indMove)
            If moveThis.TypeOfMove <> moveTypeNull Then
                moveThis.PgnSanFormat True
            End If
        Next
        Debug.Print listMove.Count & " moves have been annotated"
    End If
End Sub

Le générateur de coups de pion

Dans la fenêtre d’Exécution immédiate (Ctrl+G) du VBE, copier-coller et valider par ENTER :

DynamicContext

C’est l’initialisation à faire systématiquement à chaque début de session.

Appelons le générateur de coup pour le pion du Roi en e2 avec comme paramètre listOfMoves :

boardMain.GetPiece(e2).GenerateLazyMoves listOfMoves

Générons la notation de chaque coup grâce à la nouvelle procédure que l’on a ajoutée.

DbgMovesNotation listOfMoves

2 moves have been annotated


Affichez la liste des coups

La liste des coups, que le pion e2 peut jouer, est :

DgbMovesPrint listOfMoves

Move 1 : e3

Move 2 : e4

Analysons la procédure DgbMovesPrint() :

Sub DgbMovesPrint(ByVal listMove As Collection)
Dim indMove As Integer, moveThis As Move

    For indMove = 1 To listMove.Count
        Set moveThis = listMove(indMove)
        If moveThis.TypeOfMove <> moveTypeNull Then
            Debug.Print "Move" + Str(indMove) + ": " + moveThis.Description
        End If
    Next
End Sub

On reconnaît la boucle For Next avec la variable indMove incrémenté de l’indice 1 jusqu’au nombre de coups dans la Collection listMove.

L’instruction Set moveThis = listMove(indMove) accède à l’élément indMove dans la liste.

Si le coup n’est pas de type moveTypeNull, alors dans la partie Then, on affiche dans la fenêtre d’Exécution immédiate "Move" suivi de son n° suivi de " : " suivi de la description du coup.


Améliorer l’affichage de la liste des coups

Si on a détaillé cette procédure, c’est pour proposer un premier exercice.

Quand le nombre de coups de la liste sera important, on aimerait que l’on affiche le nombre de coups de la liste suivi de " : ". Ensuite on ne veut plus afficher un coup par ligne mais dix coups par ligne, chaque coup étant séparé par une virgule.

Pour vous aider, on donne le début de la procédure avec les déclarations et la fin de la procédure.

L’objet de l’exercice est de compléter le corps de la boucle For Next en remplaçant le commentaire par ce qu’il convient. Notez que l’on propose de passer par la variable strLine qui contiendra une ligne de nbrMoveInLine coups, au maximum nbrMaxMoveInLine.

Sub DgbMovesPrint(ByVal listMove As Collection)
Const nbrMaxMoveInLine = 10
Dim indMove As Integer, moveThis As Move, strLine As String, nbrMoveInLine As Integer

    If Not listMove Is Nothing Then
        nbrMoveInLine = 0
        strLine = CStr(listMove.Count) + " : "
        For indMove = 1 To listMove.Count
            Set moveThis = listMove(indMove)
            If moveThis.TypeOfMove <> moveTypeNull Then
                ' ... à compléter en remplissant la String strLine
            End If
        Next
        Debug.Print strLine
    End If
End Sub

La concaténation dans la chaîne strLine de la description de chaque coup obéit au même principe que la concaténation des lettres dans la fonction Alphabet(). Il faut générer entre chaque description de coup le séparateur virgule ’’,’’ et tous les dix coups, le retour-chariot VbCrLf.

Le résultat attendu dans la fenêtre d’Exécution immédiate est :

DgbMovesPrint listOfMoves

2 : e3, e4


Générer, annoter et afficher tous les premiers coups des Blancs

Démarrons une nouvelle session dans la fenêtre d’Exécution immédiate :

DynamicContext

Générons tous les coups que les Blancs peuvent jouer au début de la partie.

boardMain.playerWhite.GenAllLazyMoves listOfMoves

Annotons tous les coups de la liste.

DbgMovesNotation listOfMoves

20 moves have been annotated

C’est là tout l’intérêt de votre nouvelle version d’affichage de la liste.

Au lieu d’afficher 20 lignes, seules deux lignes seront affichées contenant dix coups par ligne.

DgbMovesPrint listOfMoves

20 : h3, h4, g3, g4, f3, f4, e3, e4, d3, d4,

c3, c4, b3, b4, a3, a4, Nf3, Nh3, Na3, Nc3

La solution de la nouvelle version de DgbMovesPrint() sera proposée dans le prochain article.


Précédent : Un générateur de coups d’Echecs en VBA

Suivant : Ca bouge sur l’échiquier d’Excel

Posté le 6 août 2011 par Matt