БлогNot. Конвертер длинной нотации PGN в короткую

Конвертер длинной нотации PGN в короткую

Ссылки, поясняющие разницу, были в этой заметке. Мне лично удобней и понятней длинная нотация, читать и "видеть" которую без доски я могу хотя бы несколько ходов (а короткую уже "ниасиливаю" и сбиваюсь, как многие другие любители).

Но на многих ресурсах допустима только короткая запись, а единственный конвертер длинной нотации в короткую, который я нашёл, не работает.

Как Вы понимаете, главная проблема такого преобразования - неоднозначные ходы, например, при ладьях на a1 и a3, если между ними свободная клетка, бессмысленно писать ход Ra2 - непонятно, какая из ладей сходила. Правильно R1a2 или R3a2.

С учётом всего этого, попробую написать свой скрипт, если он кому-то ещё понадобится или обнаружатся баги - пишите, проверим... а сегодня больше времени на chess нет.

Сервис непосредственно в работе доступен по этой ссылке:

 Конвертер длинной нотации PGN в короткую

Исходник можно увидеть, открыв код страницы. Она в кодировке Windows-1251.

Всё, что "не узнаёт", скрипт просто переписывает в выходной файл. Пока не думал, как это может сказаться на вложенных в тег комментария { } вариантах и т.п. особенностях формата PGN. Мне для моих простейших файлов, сгенерированных несложными программами, хватает. Что будет делать скрипт при "очень неправильных" входных данных - тоже пока не озадачивался :)

Если в файле PGN несколько партий в длинной нотации - это не должно создать проблем, а вот если там уже короткая нотация вместо длинной - проблемы могут быть любыми.

Тестировал вот на этом PGN:

[FEN "r3k2r/1N1b2P1/8/1b1pPpB1/2PpP3/1NP1B3/1p1Q1Q2/R3K2R w KQkq - 0 1"]
[Event "Название турнира"]
[Site "Город, страна"]
[Date "2015.04.22"]
[Round "1"]
[White "Player1"]
[Black "Player2"]
[Result "*"]

1. O-O Bd7-c6 2. Nb7-c5 b2-b1=Q 3. Bg5-h6 O-O-O 4. c3xd4 f5-f4 5. Qd2-b2 Qb1-d3 {коммент1}
6. Rf1-d1 Rh8-e8 7. g7-g8=R Re8xg8+ 8. Kg1-h2 Rg8-g2+ 9. Qf2xg2 Kc8-c7 10. Qb2-c1 d5xc4 {коммент2}
11. Qc1xc4 Bc6-d5 12. Nc5-e6++ Kc7-b7

Возможно, ещё надо обдумать и доработать в листинге:

1. В отличие от чисел и строк, объекты в Javascript копируются по ссылке, а не по значению, так что если сделать

var a = b;

где a, b - объекты, а потом поменять a, то изменится и b!

Правильно так:

var a = clone(b);

где clone - функция, копирующая объект (в том числе, содержащий другие объекты) - см. исходник страницы конвертера.

2. Регулярное выражение для сущности "шахматный ход":

/^([NBRQK])?([a-h])([1-8])(x|\-)?([a-h])([1-8])(\=)?([NBRQK])?(\#|\+|\+\+)?(\!|\!\!|\?|\?\?)?$/

После выполнения этой регулярки методом string.exec, получим массив со следующими "частями" хода" (приведены индексы элементов):
1. фигура (N, B, R, Q, K) или пусто
2-3. столбец и строка, откуда ходим, в обычной нотации (e2)
4. знак "бьёт" (x) или дефис (-) или пусто
5-6. столбец и строка, куда ходим, в обычной нотации (e4)
7. знак =, если было превращение пешки, или пусто
8. фигура, в которую превратилась пешка (N, B, R, Q, K) или пусто
9. знак мат (#), шах (+) или двойной шах (++) или пусто
10. знак сильный - слабый ход (от 1 до двух вопросительных или восклицательных знаков) или пусто.

22.04.2015, 15:58 [8755 просмотров]


теги: javascript шахматы форматы сервис

показать комментарии (1)