Ca bouge sur l’échiquier d’Excel

vendredi 12 août 2011
par  Matt
popularité : 5%

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

[bleu marine]2 moves have been annotated[/bleu marine]


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

[bleu marine]2 : e3=0, e4=0[/bleu marine]

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

[bleu marine]e2-e4[/bleu marine]

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)

[bleu marine]False[/bleu marine]

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

[bleu marine]1[/bleu marine]

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


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