fichier pgn des échecs mise en forme et génération - Perl - Programmation
Marsh Posté le 31-08-2015 à 13:29:54
Le truc bien avec Perl c'est qu'il y a des modules tout prêts pour à peu près n'importe quoi.
https://metacpan.org/search?q=Chess%3A%3APGN
J'ai pas regardé en détail mais ceci https://metacpan.org/pod/Chess::PGN::Parse a l'air adapté. Sinon on peut certainement faire qu'avec du Regex aussi.
Marsh Posté le 01-09-2015 à 22:21:10
Il y a un module qui fait ça tout seul, Chess::pgn
Code :
|
C'est sans doute améliorable, mais ça donne de bonnes indications pour démarrer, ça remplace les coups par une étoile et remplit le champ Round.
A+,
Marsh Posté le 02-09-2015 à 11:53:06
Merci pour cette info, c'est déjà un excellent moyen quand on se sent pas bien opé au début pour affronter un nouveau sujet.
Marsh Posté le 02-09-2015 à 12:29:16
Tiens, une version un peu plus clean (pas d'effet de bord) avec un contrôle plus fin sur ce que l'on imprime:
$pos est une variable propre au fichier, donc auto incrémentée et passée par référence, mais on pourrait avoir une valeur extérieure, avec passage par valeur.
Code :
|
et une variante avec une closure:
Code :
|
A+,
Marsh Posté le 03-09-2015 à 13:20:06
C'était trop beau, Chess::Pgn est trop simpliste et ne supporte pas les champs FEN ou commentaires, etc.
Chess::PGN::Parse devrait lui marcher.
Je regarde ça et je poste une soluce.
Bon déjà, une utilisation 'vanilla' du module, non customisée pour ta sortie:
Code :
|
Et la customisation se fait en 5 mn:
Code :
|
A+,
Marsh Posté le 31-08-2015 à 12:28:58
Bonjour.
Dans le monde des échecs, il existe un format de fichier très répandu, le fichier pgn.
Il est une base de donnée de parties, ou d'exercices. La base peut contenir de 1 partie à plusieurs millions de parties.
Le fichier d'entrée est constitué de parties
Chaque partie est un bloc de texte avec l'entête, suivi des coups de la partie.
Le format et la taille des entêtes peut varier.
Les entêtes sont constitués de []
Je souhaiterais pouvoir générer un fichier qui ne contient pas les coups de la partie.
Pour cela, je dois remplacer l'ensemble des coups d'une partie par une étoile.
Avant :
[Event "?"]
[Site "?"]
[Date "1976.??.??"]
[Round "?"]
[White ""]
[Black ""]
[Result "0-1"]
[FEN "6k1/p4p1p/1p2p1p1/1Q6/3r3q/5B1b/PP3P1P/R4RK1 b - - 0 1"]
[SetUp "1"]
[PlyCount "7"]
{[%tqu "","","",Qg4+,"",3]} 1... Qg4+ 2. Bxg4 Rxg4+ 3. Kh1 Bg2+ 4. Kg1 Bf3# 0-1
après
[Event "?"]
[Site "?"]
[Date "1976.??.??"]
[Round "?"]
[White "Farago"]
[Black "Rigo"]
[Result "*"]
[FEN "6k1/p4p1p/1p2p1p1/1Q6/3r3q/5B1b/PP3P1P/R4RK1 b - - 0 1"]
[SetUp "1"]
[PlyCount "7"]
*
Le seul risque est que les coups de la partie peuvent prendre plusieurs lignes.
A terme, le fichier source ressemblerait à ceci,
[Event "?"]
[Site "?"]
[Date " "]
[Round "? "]
[White " "]
[Black " "]
[Result "1-0"]
[FEN " "]
[SetUp "1"]
1... Qa8 2. Ce3#
[Event "?"]
[Site "?"]
[Date ""]
[Round " "]
[White " "]
[Black " "]
[Result "*"]
[FEN " "]
[SetUp "1"]
2. f3 Qxf3 3. Qd1 *
....
Je souhaiterais aussi remplacer le champ Round "".
Remplacer le champ vide ou ? par "position i", i étant un numéro croissant dans la base
si le champ est non vide, insérer au début du champ "position i"
A terme ce champ me servira un autre fichier avec uniquement les coups de la parties et le "position i"
Please, help
D'avance merci
Message édité par yozyoz21 le 31-08-2015 à 12:30:08