Excel VBA joue son premier coup de pion : DoMove, MakeAMove_Internal
Le générateur de coup du pion e2 du Roi génère une liste de deux coups.
On va demander de jouer le coup d’avance de deux cases 1. e2-e4 et l’afficher sur l’échiquier.
Le générateur de coups de pion
Ouvrir le classeur Chess.xls comprenant l’échiquier graphique dans Excel et ses modules importés de ChessVba04.zip.
Ouvrir le VBE : Visual Basic Editeur (Alt+F11)
Dans la fenêtre d’Exécution immédiate (Ctrl+G) du VBE, copier-coller et valider par ENTER l’initialisation du jeu d’Echecs :
DynamicContext
Appelons le générateur de coup pour le pion du Roi en e2 avec comme paramètre listOfMoves :
boardMain.GetPiece(e2).GenerateLazyMoves listOfMoves
Calculons leurs descriptions San.
DbgMovesNotation listOfMoves
2 moves have been annotated
Afficher la liste des coups
Voici la solution à l’exercice de la session précédente :
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
If indMove > 1 Then
strLine = strLine + ", "
If nbrMoveInLine >= nbrMaxMoveInLine Then
strLine = strLine + vbCrLf
nbrMoveInLine = 0
End If
End If
strLine = strLine & moveThis.Description & "=" & moveThis.Score
nbrMoveInLine = nbrMoveInLine + 1
End If
Next
Debug.Print strLine
End If
End Sub
S’il y a plus d’un coup dans la liste listMove, indMove > 1 est True, alors on concatène en fin de chaîne strLine le séparateur virgule ’’,’’.
Si on a atteint la limite des 10 coups par ligne en testant nbrMoveInLine >= nbrMaxMoveInLine, alors on ajoute en plus un retour-chariot vbCrLf et on remet à zéro le compteur nbrMoveInLine de coups dans une ligne.
On sort des deux If imbriqués.
On concatène en fin de chaîne strLine la description du coup moveThis.Description.
Dans la fenêtre d’Exécution immédiate :
DgbMovesPrint listOfMoves
2 : e3=0, e4=0
On a ajouté également l’affichage du score de chaque coup qui pour l’instant n’est pas calculé.
Jouer le premier coup
Accédons au second coup dans la collection de coups du pion e2.
Set movePlayer = listOfMoves(2)
Affichons sa description complète :
? movePlayer.DescrFull
e2-e4
Jouons ce coup.
movePlayer.DoMove
Arranger la fenêtre du VBE au-dessus de la feuille Excel de façon à ne pas cacher l’échiquier graphique sur la feuille Excel. Affichons le coup de pion sur l’échiquier graphique :
GuiDisplayBoardAt True, rowBoardMain, colBoardMain, boardMain
Sur la feuille Excel, le pion du Roi a bougé pour la première fois !
Annulons le coup :
movePlayer.UndoMove
GuiDisplayBoardAt True, rowBoardMain, colBoardMain, boardMain
L’échiquier est redevenu à sa position initiale.
La procédure suivante appelle DoMove() et en plus gère le status du jeu (normal, en échec, nulle, mat) :
? boardMain.MakeAMove_Internal(movePlayer)
False
Le jeu n’est pas terminé.
Vous pouvez cliquer avec le bouton droit de la souris sur MakeAMove_Internal
menu contextuel "Définition" pour comparer avec DoMove().
? movePlayer.EnemyStatus
1
Les Noirs ont leur Roi dans un état statusNormal, c-a-d qu’il n’est pas en échec et qu’il existe au moins un coup légal.
On trouvera ligne 69 dans le module ModChess les définitions de constante du status du jeu :
Public Const statusNormal As Byte = 1
Public Const statusInCheck As Byte = statusNormal + 1
Public Const statusDrawStaleMate As Byte = statusInCheck + 1
Public Const statusInCheckMate As Byte = statusDrawStaleMate + 1
Optionnellement, on peut annuler le coup :
boardMain.UndoMove_Internal
Précédent : Affichage des coups des Blancs en VBA
Suivant : Fonction d’évaluation échiquéenne en VBA