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