Téléchargé 10 fois
Vote des utilisateurs
1
0
Détails
Licence : Non renseignée
Mise en ligne le 12 novembre 2021
Plate-formes :
Linux, Windows
Langue : Français / Anglais
Référencé dans
Navigation
MATER - Recherche de mat à partir d'une position donnée d'une partie d'échecs
MATER - Recherche de mat à partir d'une position donnée d'une partie d'échecs
MATER - Un programme simple de recherche de mat. Valentin Albillo, 1998.
MATER est un programme simple de recherche de mat, implémenté comme une commande MS-DOS. Etant donné 1° une position légale notée au format FEN, 2° la couleur qui a le trait et 3° un nombre de coups, le programme cherche un coup qui aboutit à un mat en un nombre de coups inférieur ou égal à la limite prescrite.
J'avais téléchargé il y a quelques mois le code source de ce programme, ainsi que la page de présentation au format HTM. Or je viens de constater que la page en question est devenue indisponible.
C'est pourquoi je me suis permis d'ajouter le code source et la page de présentation originale dans les sources de developpez.com.
Roland Chastain
MATER est un programme simple de recherche de mat, implémenté comme une commande MS-DOS. Etant donné 1° une position légale notée au format FEN, 2° la couleur qui a le trait et 3° un nombre de coups, le programme cherche un coup qui aboutit à un mat en un nombre de coups inférieur ou égal à la limite prescrite.
J'avais téléchargé il y a quelques mois le code source de ce programme, ainsi que la page de présentation au format HTM. Or je viens de constater que la page en question est devenue indisponible.
C'est pourquoi je me suis permis d'ajouter le code source et la page de présentation originale dans les sources de developpez.com.
Roland Chastain
J'ai réécrit la fonction FEN2Posit, puisqu'apparemment le problème venait de là. (A noter que pour alléger le code, j'ai supprimé le contrôle de la validité de la chaîne.) A présent le programme fonctionne correctement quel que soit le compilateur.
Reste une chose bizarre que j'observe : ce qui est affiché dans la console varie d'une fois sur l'autre, avec le même exécutable et le même fichier de commande ! Tantôt tous les caractères sont bien en place, tantôt ils sont mal rangés (mais apparemment les valeurs internes du programme ne sont pas affectées).
Je n'ai observé ce phénomène que lorsque j'ai compilé avec Virtual Pascal. Avez-vous la moindre idée de ce qui pourrait expliquer cela ?
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | (* converts a string representing a FEN position to an internal representation. *) FUNCTION FEN2Posit(fen: strg80): boolean; var x, y, i, j: integer; c: char; begin x := 1; y := 8; i := 1; with Posit do begin while i <= Length(fen) do begin c := fen[i]; case Upcase(c) of 'P', 'N', 'B', 'R', 'Q', 'K': begin case c of 'p': Board[10 * (10 - y) + x + 1] := BlackPawn; 'n': Board[10 * (10 - y) + x + 1] := BlackKnight; 'b': Board[10 * (10 - y) + x + 1] := BlackBishop; 'r': Board[10 * (10 - y) + x + 1] := BlackRook; 'q': Board[10 * (10 - y) + x + 1] := BlackQueen; 'k': Board[10 * (10 - y) + x + 1] := BlackKing; 'P': Board[10 * (10 - y) + x + 1] := WhitePawn; 'N': Board[10 * (10 - y) + x + 1] := WhiteKnight; 'B': Board[10 * (10 - y) + x + 1] := WhiteBishop; 'R': Board[10 * (10 - y) + x + 1] := WhiteRook; 'Q': Board[10 * (10 - y) + x + 1] := WhiteQueen; 'K': Board[10 * (10 - y) + x + 1] := WhiteKing; end; Inc(x); end; '1'..'8': begin j := Ord(c) - Ord('0'); while j > 0 do begin Board[10 * (10 - y) + x + 1] := Blank; Inc(x); Dec(j); end; end; '/': begin x := 1; Dec(y); end; end; Inc(i); end; if Board[26] = BlackKing then KingCastle[Black] := true else KingCastle[Black] := false; if Board[Top] = BlackRook then QueenRookCastle[Black] := true else QueenRookCastle[Black] := false; if Board[29] = BlackRook then KingRookCastle[Black] := true else KingRookCastle[Black] := false; if Board[96] = WhiteKing then KingCastle[White] := true else KingCastle[White] := false; if Board[92] = WhiteRook then QueenRookCastle[White] := true else QueenRookCastle[White] := false; if Board[Bot] = WhiteRook then KingRookCastle[White] := true else KingRookCastle[White] := false; EnPassantSquare := None; end; result := true; end; |
Je n'ai observé ce phénomène que lorsque j'ai compilé avec Virtual Pascal. Avez-vous la moindre idée de ce qui pourrait expliquer cela ?
Merci, Alcatîz, pour ta réponse. Ce programme méritait d'être mis en lieu sûr.
D'accord, c'est gentil d'avoir regardé. Cela restera un mystère mais heureusement ça n'a pas vraiment d'importance.
Je vais essayer de modifier le programme, de façon à en faire une unité, sans affichage, avec seulement une fonction qui renvoie le résultat trouvé. Avec une profondeur de trois coups, la recherche ne prend qu'une fraction de seconde. Voilà de quoi relever sensiblement le niveau d'un programme.
En attendant, j'apprends pas mal de choses en lisant ce code. Rien que dans la déclaration des types, on trouve déjà des idées intéressantes, je pense par exemple à l'usage qui est fait du type set of :
Je suis seulement ennuyé pour trouver un nom français à mon unité (conformément à ce que j'ai fait pour les autres parties de mon projet). Mateur fait malheureusement penser à tout autre chose.
Tueur ne me plaît pas non plus, quoique ce soit le sens étymologique du mot "mat" (du moins d'après ce que je crois savoir). Peut-être Matador, qui est reçu en français, et qui est moins désagréable à entendre ?
D'accord, c'est gentil d'avoir regardé. Cela restera un mystère mais heureusement ça n'a pas vraiment d'importance.
Je vais essayer de modifier le programme, de façon à en faire une unité, sans affichage, avec seulement une fonction qui renvoie le résultat trouvé. Avec une profondeur de trois coups, la recherche ne prend qu'une fraction de seconde. Voilà de quoi relever sensiblement le niveau d'un programme.
En attendant, j'apprends pas mal de choses en lisant ce code. Rien que dans la déclaration des types, on trouve déjà des idées intéressantes, je pense par exemple à l'usage qui est fait du type set of :
Code : | Sélectionner tout |
1 2 3 | type squares = set of 1..120; tArraySquares = array[black..white] of squares; |
Tueur ne me plaît pas non plus, quoique ce soit le sens étymologique du mot "mat" (du moins d'après ce que je crois savoir). Peut-être Matador, qui est reçu en français, et qui est moins désagréable à entendre ?
Voici la première version de l'unité Matador.pas.
L'interface de l'unité consiste en une seule fonction, dont les arguments correspondent aux paramètres de la ligne de commande acceptée par le programme original.
La fonction renvoie le coup trouvé sous la forme "b6b8", ou une chaîne vide.
L'interface de l'unité consiste en une seule fonction, dont les arguments correspondent aux paramètres de la ligne de commande acceptée par le programme original.
Code : | Sélectionner tout |
1 2 3 4 5 6 | function SolveMate( const aPiecePlacement: string; const aActiveColor: char; const aMoveNumber: integer; const aComputeAllMoves: boolean ): string; |
Bonjour !
J'ai donné un grand coup de chiffon dans l'unité Matador (raccourci le code d'une centaine de lignes, remplacé une grande partie des noms par des noms plus explicites). Le code est devenu plus lisible et compréhensible, même s'il reste encore un peu de travail à faire à l'intérieur des procédures.
J'ai complété le programme de test, en incluant tous les exemples de la documentation. Tout fonctionne !
C'est un bien joli programme je trouve, et j'espère encore y retravailler. Une prochaine étape pourrait être de supprimer les goto mais j'ai besoin de réfléchir à deux fois avant de m'y attaquer. Si quelqu'un d'autre veut y mettre la main ou simplement faire une suggestion, n'hésitez pas !
J'ai donné un grand coup de chiffon dans l'unité Matador (raccourci le code d'une centaine de lignes, remplacé une grande partie des noms par des noms plus explicites). Le code est devenu plus lisible et compréhensible, même s'il reste encore un peu de travail à faire à l'intérieur des procédures.
J'ai complété le programme de test, en incluant tous les exemples de la documentation. Tout fonctionne !
C'est un bien joli programme je trouve, et j'espère encore y retravailler. Une prochaine étape pourrait être de supprimer les goto mais j'ai besoin de réfléchir à deux fois avant de m'y attaquer. Si quelqu'un d'autre veut y mettre la main ou simplement faire une suggestion, n'hésitez pas !
J'ai fini le renommage des variables et complété la fonction qui lit la chaîne FEN. Du coup l'en-tête de la fonction principale a changé :
Code : | Sélectionner tout |
WriteLn('b7a8' = SolveMate('b7/PP6/8/8/7K/6B1/6N1/4R1bk w KQkq -', 3, SEARCH_ALL_MOVES)); // TRUE
Bonjour !
J'ai retravaillé mon adaptation du programme de V. Albillo. Le programme peut désormais être utilisé soit comme unité, soit comme bibliothèque dynamique.
J'ai retravaillé mon adaptation du programme de V. Albillo. Le programme peut désormais être utilisé soit comme unité, soit comme bibliothèque dynamique.
Bonjour ! Je vous propose une nouvelle version de Mater, sous la forme d'une librarie dynamique. L'archive inclut des exemples d'utilisation en Basic, en C et en Pascal.
Sur la technique utilisée pour le passage des chaînes de caractères à la DLL, voir cette discussion avec la solution proposée par Paul TOTH (et qui est celle que j'ai adoptée).
Il est à noter qu'il reste possible d'utiliser directement l'unité matercore.
Sur la technique utilisée pour le passage des chaînes de caractères à la DLL, voir cette discussion avec la solution proposée par Paul TOTH (et qui est celle que j'ai adoptée).
Il est à noter qu'il reste possible d'utiliser directement l'unité matercore.
Developpez.com décline toute responsabilité quant à l'utilisation des différents éléments téléchargés.