CSA標準棋譜ファイル形式

第7版 V3.0 2024年 5月14日

1.はじめに

異なる将棋プログラムの間で、棋譜や詰将棋・局面のデータ交換を可能とするために、棋譜ファイルの標準形式を定める。したがってこの形式は、人にとってわかりやすい、ファイルサイズが小さくなる、等を主な目的としていない。

各プログラムの棋譜ファイル形式を本仕様にする必要はない。各プログラムの棋譜を本形式に変換するプログラムを用意すれば、相互にデータの交換が可能となる。

本仕様は、既に定められている以下の規則を基本としている。

2.棋譜ファイルの形式

2.1 概要

棋譜ファイルは処理を容易とするため、テキストファイルとする。
コメントと棋譜情報(対局者名等)に日本語を使用してもよい。

棋譜ファイルは、次のデータから成る。

  1. (1) 文字コード
  2. (2) バージョン
  3. (3) 棋譜情報
  4. (4) 開始局面(持駒、手番を含む)
  5. (5) 指し手と消費時間、プログラムが読むコメント
  6. (6) プログラムが読み飛ばすコメント

(6)以外は、この順番でデータがなければならない。
(3) (5) (6) は、省略できる。

セパレータ("/"だけの行)をはさんで、(3)~(6) のデータを繰り返し、複数の棋譜や局面を記述することができる。

2.2 文字コード (V3.0 で追加)

先頭行で、次のように、CSA形式であることを示し、文字コードを記述する。

'CSA encoding=UTF-8

文字コードは、"UTF-8" と "SHIFT_JIS" を指定できる。
この行がない場合、過去の棋譜との互換性のため、文字コードは SHIFT_JIS とし、改行コードは CR LF とする。

2.3 バージョン

"V"で始まり、バージョンの数字を記述する。
現バージョンは、

V3.0

とする。
バージョンがない場合、1997年8月25日の仕様と判断する。

2.4 棋譜情報

(1) 対局者名

"N+"に続き +側(先手、下手)の対局者名を記述する。
"N-"に続き -側(後手、上手)の対局者名を記述する。
それぞれ1行とする。
省略可能とする。

例:

N+先手
N-後手

(2) 各種棋譜情報

"$"で始め(キーワード)+":"(データ)の形式とする。
これらの棋譜情報は、省略可能とする。

(2-1) 棋戦名
$EVENT:(文字列)
(2-2) 対局場所
$SITE:(文字列)
(2-3) 対局開始日時(時刻は省略可)
$START_TIME:YYYY/MM/DD HH:MM:SS

"YYYY"は、西暦の年4桁の数字とする。
次の"MM"は、月2桁の数字とする。
"DD"は、日2桁の数字とする。
"HH:MM:SS"は、24時間表現の時間(2桁)、分(2桁)、秒(2桁)とする。
"HH:MM:SS"は、省略可能とする。
日付と時刻の間のスペースは1桁とする。

例:

$START_TIME:2002/01/01 19:00:00
$START_TIME:2002/01/01
(2-4) 対局終了日時(時刻は省略可)
$END_TIME:YYYY/MM/DD HH:MM:SS

開始日時と同様に、対局終了日時を記述する。

(2-5) 持ち時間(持ち時間と秒読み) (V3.0 で改定)
$TIME:(初期持ち時間)+(秒読み)+(フイッシャー方式加算)

時間の単位は秒。
小数点で、ミリ秒単位で記述できるようにする。小数点以下は、最大3桁とする。
切れ負けの場合、秒読みを"0"とする。
フイッシャー方式加算が"0"でない場合、フィッシャー方式となる。

先手(下手)と後手(上手)の持ち時間が違う場合、先手(下手)の持ち時間を "$TIMET+:"、後手(上手)の持ち時間を "$TIMET-:"で記述する。

例:

$TIME:1500+0+0  持ち時間:1500秒(25分)、切れ負け
$TIME:1800+30+0 持ち時間:1800秒(30分)、秒読み:30秒
$TIME:0+30+0   初手から30秒の秒読み
$TIME:900+0+5  フイッシャー方式、初期持ち時間:900秒、加算:5秒
$TIME:10.5+0+5.5 フイッシャー方式、初期持ち時間:10.5秒、加算:5.5秒

先手と後手が違う場合の例:

$TIME+:450+0+5  先手:フイッシャー方式、初期持ち時間:450秒、加算:5秒
$TIME-:900+0+5  後手:フイッシャー方式、初期持ち時間:900秒、加算:5秒
・V2.2 までの持ち時間(参考)
$TIME_LIMIT:HH:MM+SS

持ち時間+秒読みとする。
持ち時間"HH:MM"は、時間(2桁以上の数字)、分(2桁の数字)とする。
秒読み"SS"は、秒単位の数字(2桁以上)とする。
切れ負けの場合、秒読みを"00"とする。

例:

$TIME_LIMIT:00:25+00 持ち時間:25分、切れ負け
$TIME_LIMIT:00:30+30 持ち時間:30分、秒読み:30秒
$TIME_LIMIT:00:00+30 初手から30秒
(2-6) 戦型
$OPENING:(文字列)
(2-7) 最大手数 (V3.0 で追加)
$MAX_MOVES:(手数)

対局のルールで決められた最大手数。

例:

$MAX_MOVES:320
(2-8) 持将棋ルール (V3.0 で追加)
$JISHOGI:(文字列)

24: 24点法
27: 27点法

※27点法は、先手が28点以上、後手が27点以上で、入玉宣言法で勝ちを宣言できる。

例:

$JISHOGI:27
(2-9) 備考 (V3.0 で追加)
$NOTE:(文字列)

"\n" を挟み、複数行を記録できる。"\\" は "\" に変換される。

例:

$NOTE:備考1行目\n2行目\\
(2-10) 補足

"$"で始まる各種棋譜情報の表記順は任意でいい。

2.5 駒と位置

駒名:歩から玉まで:FU,KY,KE,GI,KI,KA,HI,OU
      上の成駒:TO,NY,NK,NG, UM,RY
位置:1一を"11"、5一を"51"、9九を"99"というふうに、2桁の数字で表す。
   駒台は"00"とする。
先手(下手)は"+"、後手(上手)は"-"を付ける。

2.6 開始局面

"P"で始まる文字列。

(1) 平手初期配置と駒落ち

平手初期配置は、"PI"とする。駒落ちは、"PI"に続き、落とす駒の位置と種類を必要なだけ記述する。

二枚落ちの例:

PI82HI22KA

(2) 一括表現

1行の駒を以下のように示す。行番号に続き、先後の区別と駒の種類を記述する。
先後の区別が"+""-"以外のとき、駒がないとする。
1枡3文字で9枡分記述しないといけない。

例:

P1-KY-KE-GI-KI-OU-KI-GI-KE-KY
P2 * -HI * * * * * -KA *

(3) 駒別単独表現

一つ一つの駒を示すときは、先後の区別に続き、位置と駒の種類を記述する。持駒に限り、駒の種類として"AL"が使用でき、残りの駒すべてを表す。駒台は"00"である。
玉は、駒台へはいかない。

例:

P-22KA
P+99KY89KE
P+00KIOOFU
P-00AL

(4) 手番

"+"で+側(先手、下手)を、"-"で-側(後手、上手)の手番を示す。1行とする。
手番の指定は必要である。

(5) 捕足

初期状態はすべての駒が駒箱にあり、上記(2)(3)の指定は、駒を駒箱から盤上に移動する動作を表現する。したがって、以上の(1)から(3)の指定で位置が決まらないものは、駒箱にあるとする。また、盤面の指定が無いときは、盤上に何も無いとする。
上記(1)と(2)は同時に指定しない。
"P+00AL"、"P-00AL"は、最後に指定しなければならない。
手番は、盤面データの後に指定する。

2.7 指し手と消費時間

1手の指し手を1行とし、次の行にその指し手で消費した時間を示す。

(1) 通常の指し手

先後("+"、または"-")の後、移動前、移動後の位置、移動後の駒名、で表す。

例:

+3324NG ☗2四銀成

(2) 終局状況、特殊な指し手

%で始まる。

%TORYO 投了。消費時間を記録できる。
%CHUDAN 中断
%SENNICHITE 千日手
%TIME_UP 手番側が時間切れで負け
%ILLEGAL_MOVE 手番側の反則負け、反則の内容はコメントや備考で記録する。
%+ILLEGAL_ACTION 先手(下手)の反則行為により、後手(上手)の勝ち
%-ILLEGAL_ACTION 後手(上手)の反則行為により、先手(下手)の勝ち
%JISHOGI 持将棋
%KACHI (入玉宣言法で)勝ちの宣言
%HIKIWAKE (入玉宣言法で)引き分けの宣言
%MAX_MOVES 最大手数に達した。 (V3.0 で追加)
%MATTA 待った V3.0 で削除
%TSUMI 詰み
%FUZUMI 不詰
%ERROR エラー

※文字列は、空白を含まない。
※%KACHI,%HIKIWAKE は、コンピュータ将棋選手権のルールに対応し、第3版で追加。
※%+ILLEGAL_ACTION,%-ILLEGAL_ACTIONは、手番側の勝ちを表現できる。

(3) 消費時間

"T"に続き、直前の指し手で消費した時間を秒単位で記述する。
消費時間は、小数点を使い、ミリ秒単位を記述できる。小数点以下は、最大3桁。
※小数点を使うと、過去のプログラムが正しく読めなくなるので、必要な場合だけにする。
※ミリ秒単位の表現は、V3.0 で追加。

消費時間は省略可能とする。

例:

T15.123

2.8 プログラムが読むコメントと評価値、読み筋、ノード数 (V3.0 で追加)

(1) プログラムが読むコメント

"'*"に続き、プログラムが読むコメントを記述する。
指し手、または、開始局面の後に記述する。
コメントが複数行ある場合、"'*"を複数行記述する。

例:

'*コメント1行目
'*コメント2行目

(2) 評価値、読み筋、ノード数

"'** "に続き、評価値、読み筋、ノード数を記述可能とする。
評価値、読み筋、ノード数は、半角空白を挟み、記述する。
評価値は整数とし、先手有利をプラス、後手有利をマイナスとする。
※先手勝ちの評価値は 30000、後手勝ちの評価値は -30000 を推奨する。
"#"の後にノード数を記述する。

例:

'** 30 +7776FU -9394FU +7968GI #1234

(3) 読み筋の表記

読み筋の指し手の表記は、前述の「2.7 指し手と消費時間」に従う。
読み筋は、指し手を半角空白を挟んで続ける。
読み筋は、直前の指し手の後の手順を記録する。例えば、☗2六歩の指し手の後の読み筋には、☗2六歩を含めず、次の後手の指し手から始める。

例:

+2726FU,T15
'** 99 -8384FU +7776FU

読み筋の終局状況・特殊な指し手として、以下を記述可能とする。

(4)可能な形式

  1. (A) 評価値だけ
  2. (B) 評価値、読み筋
  3. (C) 評価値、読み筋、ノード数

2.9 プログラムが読み飛ばすコメント

"'"(アポストロフィー)で始まる行は、プログラムが読み飛ばすコメントとする。
文の途中からのコメントは、記述できない。

2.10 マルチステートメント

","(カンマ)を用いて、複数の行を1行にまとめることができる。

2.11 ファイル名の拡張子("."の後の名前)

"csa"とする。unix のように大文字小文字の区別がある場合は小文字とする。

3.棋譜ファイルの例

'CSA encoding=UTF-8
'----------棋譜ファイルの例 "example.csa"---------------
'バージョン
V3.0
'対局者名
N+先手
N-後手
'棋譜情報
'棋戦名
$EVENT:34th World Computer Shogi Championship
'対局場所
$SITE:INTERNET
'開始日時
$START_TIME:2024/05/05 15:05:40
'終了日時
$END_TIME:2024/05/05 15:31:22
'持ち時間:フイッシャー方式、初期持ち時間:900秒、加算:5秒
$TIME:900+0+5
'戦型:矢倉
$OPENING:YAGURA
'最大手数:320
$MAX_MOVES:320
'持将棋ルールは、27点法
$JISHOGI:27
'備考
$NOTE:備考1行目\n2行目
'平手の初期局面
P1-KY-KE-GI-KI-OU-KI-GI-KE-KY
P2 * -HI * * * * * -KA *
P3-FU-FU-FU-FU-FU-FU-FU-FU-FU
P4 * * * * * * * * *
P5 * * * * * * * * *
P6 * * * * * * * * *
P7+FU+FU+FU+FU+FU+FU+FU+FU+FU
P8 * +KA * * * * * +HI *
P9+KY+KE+GI+KI+OU+KI+GI+KE+KY
'先手番
+
'指し手と消費時間
+2726FU,T0
'評価値、読み筋、ノード数
'** 30 -8384FU +2625FU -8485FU +6978KI -4132KI +3938GI -7172GI #1234
-3334FU
'ミリ秒単位の消費時間
T6.123
'*プログラムが読むコメント1行目
'*プログラムが読むコメント2行目
%CHUDAN
'-------------------------------------------------

4.改定履歴