SGF (Smart Game Format) это формат файлов используемый для сохранения записей настольных игр для двух игроков. Это текстовый древовидный формат, т.е. он не содержит двоичных данных и поэтому может быть легко послан в электронном письме, размещен на форуме или новостной конференции. «Древовидный» означает, что, начиная с корня, можно следовать по основному пути или переключиться на варианты (или варианты вариантов).
SGF представляет много возможностей, таких как метки на доске, комментарии, информация об игре, начальные позиции и т.д. Для того, чтобы создавать правильные SGF-файлы необходимо иметь некоторые знания об внутренней структуре SGF.
Версии
SGF был придуман Андерсом Кирульфом (Anders Kierulf) в 1987 году и становился все более и более популярным. С тех пор SGF претерпел две больших ревизии.
FF[1] это первоначальная спецификация Андерса Кирульфа. Она является ядром всех более поздних версий. Некоторые приложения до сих пор используют эту устаревшую версию SGF например, MGT (версия для MS-DOS), которая стала достаточно популярной до того, как Windows вошла в моду.
FF[3] был написан Мартином Мюллером (Martin Müller) в 1993 году и стал первым шагом в направлении очистки спецификации формата SGF. Затем SGF стал признанным стандартом для игры Го в Интернете. FF[3] определил много новых свойств, например, свойства для сохранения информации об игре и некоторые новые пометки.
FF[4] была написана Арно Холлоси (Arno Hollosi) в 1997 году при содействии многих программистов SGF-приложений. FF[4] продолжила тенденцию FF[3] и предлагает ясное и недвусмысленное определение SGF. Были представлены новые возможности, такие как стрелки, линии, доски любого размера и прямоугольные доски. Однако так как этот стандарт очень молод, то он не получил еще широкого распространения. В будущем эта ситуация изменится (надеюсь).
Как же выглядит SGF-файл?
Короткий пример:
(;FF[4]GM[1]SZ[19]AP[SGFC:1.13b]
PB[troy]BR[12k*]
PW[john]WR[11k*]
KM[0.5]RE[W+12.5]
DT[1998-06-15]
TM[600]
;B[pd];W[dp];B[pq];W[dd];B[qk];W[jd];B[fq];W[dj];B[jp];W[jj]
;B[cn]LB[dn:A][po:B]C[dada: other ideas are 'A' (d6) or 'B' (q5)]
;W[eo](;B[dl]C[dada: hm - looks troublesome.
Usually B plays the 3,3 invasion - see variation];W[qo];B[qp]
...
;W[sr];B[sk];W[sg];B[pa];W[gc];B[pi];W[ph];B[de];W[ed];B[kn]
;W[dh];B[eh];W[se];B[sd];W[af];B[ie];W[id];B[hf];W[hd];B[if]
;W[fp];B[gq];W[qj];B[sj];W[rh];B[sn];W[so];B[sm];W[ep];B[mn])
...
(;W[dq]N[wrong direction];B[qo];W[qp]))
SGF-приложения
SGF-приложения доступны для любых платформ. Большинство из них бесплатны, некоторые условно-бесплатны.
Так как нет идеальных программ и SGF не исключение, то настоятельно рекомендуется обновлять Ваше любимое SGF-приложение, по крайней мере, раз в год. Из-за того, что многое люди продолжают использовать приложения более чем пятилетнего возраста, возникаем много проблем.
Регулярно обновляйте Ваши приложения!
Общие концепции
SGF состоит из узлов (nodes), которые объединены в дерево, т.е. узел имеет одного предшественника, называемого предком, но может иметь одного или больше потомков. Так SGF может сохранять записи игры (список ходов) и варианты текущего течения игры.
Узел наименьший элемент видимый пользователю, т.е. пользователь перемещается по дереву по узлам (вперед [вниз дерева], назад [вверх дерева] и т.д..).
Узел состоит из свойств. Эти свойства содержат определенный разновидности информации, например, свойство B[] описывает сделанный ход черных, свойство C[] содержит текст комментария (не беспокойтесь, Вы не должны запоминать имена свойств :-).
Например, если Вы двигаетесь вперед и видите новый ход на доске, комментарий в окне комментариев, а также некоторую метку, то вся эта информация представлена различными свойствами, которые являются частями одного и того же узла.
Таким образом, редактирование производится на двух уровнях: добавление/удаление узлов и добавление/удаление свойств. Проясним: ход часть узла, а не узел часть хода. Ход представлен одним свойством, а узел может содержать более одного свойства.
"Сделать ход" vs. "Поставить камень"
SGF представляет два способа добавления камней на доску:
сделать ход
поставить камень
«Сделать ход» подобно ходу в реальной игре, т.е. Вы можете лишь делать ходы на пустое пересечение, Вы можете делать лишь один ход за раз (в один узел) и Вы можете захватить несколько пленников в процессе хода. В большинстве приложений текущий ход подсвечивается.
«Поставить камень» на доску подобно установке позиции, например, камней гандикапа, установка задачи или анализ позиций ("это сработает, если позиция вокруг будет такой..."). Так можно поставить более одного камня, камни разных цветов, убрать камни, заменить камень противоположным цветом, и все это в рамках одного узла. Но: нельзя захватить пленников, т.к. это не обычные ходы!
Ограничения
Хорошим стилем (требованием, начиная с FF[4]) является разграничение между ходами и позицией достигнутой к данному ходу.
Поэтому недопустимо смешивать свойства установки и свойства хода внутри одного и того же узла.
Свойства хода это такие свойства, как ход черных или белых, замечание по ходу (плохой ход, интересный ход и т.д.) или сколько времени осталось игроку после того, как был сделан текущий ход.
Свойства установки это свойства используемые для установки или описания позиции, такие как установка черных/белых камней на доску или указание чей ход.
К сожалению много приложений допускают смешивание свойств хода и установки, поэтому это задача пользователя создать хороший SGF-файл.
Стиль
Первая ветвь (вариант «А» или «1») является главной ветвью.
Вариант «А» всегда должен соответсвовать реальной игре.
Не имитируйте варианты в стиле братьев. Используйте вместо этого приложения со стилем братьев. Обратите внимание на определение и причины этого.
Опускайте дополнительные пропуски хода и пустые узлы в конце игры.
Последний узел игры должен содержать последний ход на доске. Не размещайте информацию об игре, такую как «Черные выигрывают и закрывают Ко», в поле комментария, лучше добавьте дополнительный ход, который закрывает Ко.
Никогда не заменяйте ходы размещением камней.
Никогда не заменяйте обычный ход размещением (установкой) камня. Некоторым приложениям для реализации некоторых сложных функций необходимы обычные ходы.
Длина меток.
Начиная с FF[4] допустимо использовать метки любой длины. Но некоторые (старые) приложения имеют проблемы с отображением меток длиннее двух символов. Используйте длинные метки с осторожностью!
Не сохраняйте информацию об игре, такую как кто играет черными/белыми и т.д., в первом комментарии используйте вместо этого свойства игровой информации. Здесь Вы можете найти причины этого.
Используйте замечания для стандартных ситуаций (например, плохой ход).
Замечания представлены дополнительными SGF-свойствами и соответственно могут трактоваться специальным образом.
Варианты
SGF позволяет Вам сохранять варианты основного развития игры, которые полезны для анализа различных направлений. Рисунок иллюстрирует эту концепцию. Вариантам обычно присваиваются буквы, начиная с «А», где «А» является продолжением текущего направления игры. Вот почему некоторые приложения ссылаются на следующий ход как «А».
Приложения показывают варианты как братьев (сестер :-) или как детей. Отображение вариантов как детей означает, что если приложение на данный момент находится на ходе №3 (как на рисунке), то оно предлагает Вам выбор от «А» до «С», которые являются ходом №4. Здесь, выбирая вариант, Вы двигаетесь вперед по дереву.
Отображение вариантов как братьев означает, что приложение предлагает выбор варианта на ходе №4. В данном случае, отбор варианта выбирает между ходами на одном и том же уровне дерева (здесь: ход №4). Этот метод воспринимается как альтернативы текущему ходу и, например, выбирая вариант «В», ход №4 «А» удаляется с доски, а ход №4 «В» отображается.
Различие между этими двумя стилями может вызвать замешательство, когда варианты сопровождаются комментариями. Например, представим комментарий, говорящий: «Это плохо. Смотри вариант «В» вместо этого." Если автор использует приложение со стилем отображения как детей, то этот комментарий сохраняется вместе с ходом №3. Если читатели использует приложение со стилем отображения как братьев, то они увидят комментарий на ходе №3, но никаких вариантов нет они появятся вместе со следующим ходом. Другой случай (автор: стиль братьев, читатель: стиль детей) вызывает похожее замешательство. Пользователи, которые читают комментарий к ходу №4 должны вернуться назад и выбрать там вариант.
Многие люди предпочитают стиль братьев как выглядящий более естественным. Они даже имитируют этот стиль в приложениях со стилем детей. Это делается удалением предыдущего хода и осуществлением нового хода в том же (первом) узле варианта. Это плохой стиль. Начиная с FF[4] это также недопустимо синтаксически. Если Вы взгляните на рисунок Вы увидите, что все альтернативные ходы находятся на одном и том же уровне (все ходы №4 в одной колонке, все ходы №7 в другой колонке). Имитированием стиля братьев в приложениях со стилем детей это положение дел нарушается, так ходы №4 вариантов «В» и «С» возникнут под ходом №5 варианта «А».
К тому же такие файлы не могут быть просто преобразованы в другие файловые форматы. Если Вам нравятся варианты в стиле братьев, то используйте приложение со стилем братьев!
Метки доски
SGF предлагает широкий выбор меток на доске. Почти каждая метка, которую Вы видите в журналах или книгах, доступна также и в SGF. Однако некоторые приложения не способны оперировать определенными типами меток. Здесь представлен короткий список доступных типов меток:
Метка
Свойство
Примечания
MA[]
очень распространенное (введено в FF[3])
TR[]
очень распространенное (введено в FF[3])
простые метки
M[]
устаревшее (FF[1]), очень распространенное Эта метка была заменена на MA[] и TR[], однако очень старые приложения продолжают использовать M[] и не понимают MA[] и TR[].
CR[]
распространенное (введено в FF[3])
SQ[]
распространенное (введено в FF[4])
LB[]
распространенное (введено в FF[3]) Старые приложения не могут отображать их (например, MS-DOS MGT). Заметим, что допускаются длинные метки, состоящие из нескольких символов. Однако многие приложения отображают лишь первые 2-3 символа, поэтому используйте длинные метки с осторожностью.
буквы
L[]
устаревшее (FF[1]), очень распространенное
Эта метка была заменена на LB[], однако очень старые приложения (например, MS-DOS MGT) продолжают использовать L[] и не понимают LB[].
SL[]
устаревшее, редкое
DD[]
новое (FF[4]), очень редкое (может стать более распространенным в будущем)
AR[]
новое (FF[4]), очень редкое (может стать более распространенным в будущем)
LN[]
новое (FF[4]), очень редкое (может стать более распространенным в будущем)
Комментарии и замечания
Для комментирования хода или позиции SGF позволяет сохранять в каждом узле текст, которые обычно отображается в окне комментария в Вашем SGF-приложении. Текст прост для редактирования, но при этом также имеет некоторые недостатки:
язык если Вы не понимаете язык, то Вы не сможете понять комментарий
приложения не могут использовать текст для обеспечения более сложных функций (таких как поиск плохих ходов или тэсудзи)
компьютерные игроки не в состоянии использовать текстовую информацию
Однако SGF предлагает набор так называемых свойств-замечаний. Эти свойства кодируются в файле по-другому. Они не сохраняются не как читаемый текст, а как маркеры, которые имеют специальное значение. Так SGF-приложение, читая файл, знает их значение и может осуществить следующее:
многоязычная поддержка приложение отображает сообщение на выбранном языке.
поиск и другие функции баз данных
компьютерные игроки могут использовать замечания в своих библиотеках фусэки и дзёсэки для определения лучшего хода или хороших альтернатив.
Существует три типа свойств-замечаний: общие замечания, замечания по ходу и замечания по позициям. Взгляните на следующую таблицу:
К сожалению, лишь немногие приложения поддерживают эти свойства. Это, будем надеяться, изменится в будущем. Рассматривается использование свойств-замечаний везде, где это возможно. Они дают много преимуществ, несмотря на свою простоту.
Игровая информация
SGF предлагает широкий диапазон свойств для сохранения так называемой игровой информации. Обычно приложения предлагают окно диалога или дополнительное окно дл заполнения информации об игре.
Заметьте, что некоторые записи имеют обязательный формат. Зачем?
Потому, что записи следующие стандарту могут быть легко разобраны приложениями и поэтому могут быть найдены в коллекциях игр или отображены по Вашей (модифицированной) схеме. К сожалению, многие приложения позволяют пользователю вводить недопустимую информацию от Вас зависит создание правильных записей будьте внимательны!
К примеру представим, что Вы получили коллекцию из более чем 5000 профессиональных игр и хотите найти игры Тё Тикуна, сыгранные в марте 1996 года. Теперь если даты сохранены, например, как DT[5th March 1996], DT[11/3/96], DT[1996/3/7], DT[1996 6 8] сможете ли Вы определить какие из этих игр были сыграны в марте?
Почему Вы должны заполнять игровую информацию?
Иногда вы можете увидеть SGF-файл, в котором вся игровая информация сохранена в первом комментарии.
Это плохой стиль!
Если информация сохранена внутри комментария, то практически невозможно компьютерным программам найти соответствующие данные поиск становится невозможным. Поэтому сохранение информации об игре в соответствующем месте сохранит Вам время в будущем и сделает Вашу базу данных более удобной. Это также позволяет сделать преобразование и обмен играми значительно более простыми.
Список свойств с информацией об игре
Здесь представлен полный список с коротким описанием каждого пункта. Если этот список не отвечает на все Ваши вопросы, то обратитесь к оффициальной, подробной спецификации.
Замечание: «рекомендованный» не означает «обязательный»! Но Вам следует использовать рекомендованный формат всякий раз, когда это возможно.
Название
Свойство
Примечания
Имя Черных/Белых
PB[]/PW[]
Имя игрока, который играет черными/белыми
Будьте последовательны в использовании имен для профессиональных игроков предлагается использовать такие же имена как в базе данных Яна ван дер Стина (Jan van der Steen)
Ранг Черных/Белых
BR[]/WR[]
Сила игрока, который играет черными/белыми
Рекомендованный формат:
"10k" или "10 kyu" для игроков уровня кю
"3d" или "3 dan" для игроков уровня данов
Го серверы обычно добавляют "*" (определенный рейтинг)
или `?' (неопределенный рейтинг), например --"10k*"
Команда Черных/Белых
BT[]/WT[]
Название команды (для игр, играемых в командных мероприятиях)
Результат
RE[]
Окончательный результат игры
Обязательный формат:
"0" (нуль) для ничьей (дзиго)
"B+счет" для выигрыша черных и
"W+счет" для выигрыша белых, например, "B+2.5", "W+64" или "B+0.5"
"B+R"/"B+Resign" and "W+R"/"W+Resign" для выигрыша по сдаче.
Вы НЕ ДОЛЖНЫ писать Black resigns ("Черные сдались")
См. подробное описание.
Коми
KO[]
Сдвиг по очкам (очки, добавленные к счету Белых)
Обязательный формат:
Используйте действительные значения, например, "5.5", "0", "0.5" или "-10" и т.д.
Не используйте: "5 points", "half a point", "5 1/2", и т.д.
Гандикап
HA[]
Число камней гандикапа
Обязательный формат:
Используйте целые числа большие нуля, например, "1", "5" или "9"
Не используйте: "2 stones", "three"
Время
TM[]
Основное время игры для каждой стороны
Обязательный формат:
Время задается в секундах как действительное значение, например, "4600", "300"
Не используйте: "1 hour"
Несколько неудобно, если Ваше приложение не преобразует действительное значение в какую-нибудь читабельную форму. Но, тем не менее, пожалуйста, используйте действительные значения!
Дата
DT[]
Дата, когда была сыграна игра
Обязательный формат:
Используйте формат, соответствующий стандарту ISO, "ГГГГ-ММ-ДД"
Не используйте другие разделители, такие как "/", " " или ".".
Пример: игра сыгранная 5-го марта 1997 году
будет закодирована как: 1997-03-05