Ca bouge sur l’échiquier d’Excel

Excel VBA joue son premier coup de pion : DoMove, MakeAMove_Internal

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

Posté le 12 août 2011 par Matt