第10回コンピュータ将棋選手権 実施要領



前回からの主な変更点

前回に対して、主に次の点が変更になっていますので、御注意下さい。

運営の都合上、今後、若干の変更がある可能性があります。


実施要領

(1) 日時

2000年3月8日(水)〜10日(金)
1日目 1次予選
2日目 2次予選
3日目 決勝

(2) 場所

〒279-0031 千葉県浦安市舞浜1-9
シェラトン・グランデ・トーキョーベイ・ホテル
TEL: 047-355-5555 FAX: 047-355-5566

(3) 主催

コンピュータ将棋協会 (略称:CSA)

(4) 協力

社団法人 日本将棋連盟

(5) 協賛

富士通 株式会社
株式会社 アスキー
株式会社 毎日コミュニケーションズ
株式会社 アイフォー

(6) 賞品

3位まで : 盾
8位まで : 賞状
賞品 : ノートパソコン (優勝者)

(7) 参加費

1チーム1万円 (事前に振り込み、参加を中止しても返却しない)

(8) 参加資格(必須の機能)

(注)

(9) プログラムにあることが望ましい機能

(10) 通信機能について

(11) 試合の方法(予選・決勝共通)

(12) 持ち時間

(13) 入玉について

次の条件が成立する場合、勝ちを宣言できる(以下「入玉宣言勝ち」と云う)。
条件:
(a) 宣言側の手番である。
(b) 宣言側の玉が敵陣三段目以内に入っている。
(c) 宣言側が(大駒5点小駒1点の計算で)
  • 先手の場合28点以上の持点がある。
  • 後手の場合27点以上の持点がある。
  • 点数の対象となるのは、宣言側の持駒と敵陣三段目以内に存在する玉を除く宣言側の駒のみである。
(d) 宣言側の敵陣三段目以内の駒は、玉を除いて10枚以上存在する。
(e) 宣言側の玉に王手がかかっていない。
(詰めろや必死であることは関係ない)
(f) 宣言側の持ち時間が残っている。(切れ負けの場合)
以上1つでも条件を満たしていない場合、宣言した方が負けとなる。
(注) このルールは、日本将棋連盟がアマチュアの公式戦で使用しているものである。
以上の宣言は、コンピュータが行い、画面上に明示する。通信対局の場合は、
「%KACHI」のコマンドを送信する。

(14) 勝敗の決定

勝敗は以下の順で決定される
1) 時間切れは負け
2) 通常の将棋のルール(持将棋を除く)による勝ち、負け
千日手となった場合はそこで終了
(連続王手でない千日手は引き分けとして扱う)
3) 入玉宣言勝ち(宣言はコンピュータが行う)

(15) 予選と決勝の方式

(i) シード順
参加者のシード順(開始時の順位)は以下の通り(前回、発表)。
上位より
(A) 前回の決勝の1〜8位
(B) 前回の2次予選の順位
(C) 前回の1次予選の順位
(D) 上の(A)〜(C)に該当しないものは前々回順位
(E) 上の(A)〜(D)に該当しないものは前々々回順位。以下同様
(F) 初参加者(抽選順)
(ii) 決勝の対戦方式
シード数3、参加者数8、7回戦の総当たりとする。
持ち時間各30分
(iii) 2次予選シード数、参加者数、試合数、対戦方式、決勝進出数
シード数16、参加者数24、試合数9、変形スイス式
決勝進出数5(上位5)
持ち時間各25分
(iv) 1次予選参加者数、試合数、対戦方式、2次予選進出数
1次予選は残り(全参加者数-3-16)のソフト。
1次予選参加者数が奇数の場合は招待ソフトを加える。
試合数7、変形スイス式
2次予選進出数8(上位8、但し招待ソフトは2次へは進めない)
持ち時間各20分
(v) 参加者数が大幅に増減した場合
上の(ii)〜(iv)の方式は全参加者数が28〜54の場合適用する。
予定参加者数が27以下の場合は1次予選は行わない。
実参加者数が55以上の場合、50を越える5チーム毎に、2次予選シードを1、1次から2次への進出数を1、それぞれ増やす。
(vi) 遅刻等の取り扱いについて
決勝については定時に開始したものとみなし、時間切れとならない範囲で通常の対局を行う。時間切れとなれば、負け。
なお、(事前に連絡があり)シード者が棄権する場合、次の順位のものがシード者となる。事前連絡は前日の最終試合終了時まで有効。
事前に連絡がなく、不参加の場合は、何らかのペナルティを与える。
(注) 事故による不参加の場合はペナルティの対象にはならない。
不参加の試合については負けとして扱う。
2次予選についても同様。1次予選と日が異なるので、事前に連絡がない場合は、参加するものとみなす。
事前連絡は前日の最終試合終了時まで有効。
事前に連絡がなく、不参加の場合は、何らかのペナルティを与える。
(注) 事故による不参加の場合はペナルティの対象にはならない。
不参加の試合については負けとして扱う。
1試合も参加できないソフトが出て、2次予選参加者数が奇数となった場合は、招待ソフトを加える。但し、そのソフトは決勝へは進めない。
1次予選については、「初参加者」の抽選時までに連絡なく到着していないものは、棄権したものとみなす。
(注) ペナルティの内容は、状況によって、CSAで決定する。
予選、決勝共、試合に参加後、途中で棄権した場合、以降の試合は不戦敗とする。
(vii) 大会の進行状況によって、運営側の判断により持ち時間を短縮する場合がある。また、1次、2次予選においては総試合数を減ずる場合がある。

(16) 次回のシード順

次回の決勝シード数を3、2次予選シード数を16とし、それ以外を無シードと
する。(*1)
シード順は上位より
(A) 決勝の順位
(B) 2次予選の順位
(C) 1次予選の順位
(D) 過去の参加者 (最近の参加者を優先)
(E) 新参加者
とする。
*1 試合の方式が変更になった場合、シード数は変更される場合がある。

(17) 予選の組合せ

予選は、以下のような変形スイス式で組合せ(対戦)を行なう。
(参考) スイス式トーナメントの組み合わせ法
(注) 組み合わせの都合上、若干の変更がある可能性がある。

(18) 決勝の組合せ

(19) 順位の決め方

上から順に適用していく。
1) 勝数の多い者
2) ソルコフ方式 すべての対戦相手の勝星の合計の多い方
3) SB方式 負かした相手の勝星の合計の多い方
4) ミディアム方式 負かした相手の勝星が最高と最低の2人を除いた相手の
勝星の合計の多い方
5) DH方式 同率者が対戦している場合は勝者の方
6) 対戦表の順位 上位を優先する
本戦では、前年順位、予選順位の順
(注) 引分けを0.5勝とする。
総当たりの決勝では、2)は意味がない。

(20) 棋譜

(21) プログラム等の保存およびクレーム期間

(i) 参加者は、大会バージョンを1年間(決勝終了の翌日から)保存する。
大会で用いたプログラムの実行ファイル、データなど、大会の状況が再現できるもの。
なお、途中でプログラム等の変更を行った場合は、どれか一つのバージョンでよい。
(ii) 正当と判断されたクレームがあった場合、CSAはその提出を求め、限られた調査委員会で調査を行う。提出されない場合、入賞を剥奪/次回以降の参加を制限する場合がある。調査委員会は別途定める。
(iii) クレームの期限は決勝終了の翌日から6カ月とする。

(付則) 本ルールは日本語版と英語版を作成する。その解釈に疑義ある時は、日本語版を以て正本とする。



通信プロトコル(CSA形式98年版(最新版))

(1) コマンド

(a) 通常の指し手:
先後(先手:+ 、後手:- )の後、移動前、移動後の位置、移動後の駒名
駒名:歩から玉まで:FU, KY, KE, GI, KI, KA, HI, OU
上の成駒:TO, NY, NK, NG, , UM, RY
駒台の位置は、00
(注)成りは、移動後の駒名で判断する。
例:+7776FU(▲7六歩)、-0034KA(△3四角打)、+2423TO(▲2三歩成)
(b) 特殊なコマンド:(+-を付けない)
投 了:%TORYO
待った:%MATTA
中 断:%CHUDAN
千日手:%SENNICHITE
持将棋:%JISHOGI
(入玉で)勝ちの宣言:%KACHI
(入玉で)引き分けの宣言:%HIKIWAKE
(a)(b)共、以上の文字列の後にLF(16進の0A)を付加する。
待ったは、自分の手番において行い、それに対して相手は2手戻し、待ったを
した方の手番とする。待ったをした手の消費時間は戻す。待ったは、代理ソフトで手入力にミスがあったときに使用する。
持将棋、勝ちの宣言、引き分けの宣言は、試合のルールによって使い分ける。

(2) 通信条件

通信回線は、RS232Cを使用する(条件は以下のとおり)。
ボーレイト 1200bps
データ長 8 bit
パリティ なし
ストップビット 1 bit
X制御 あり

(3) ケーブル、コネクタ

コンピュータ側コネクタはD-SUB9ピンオスとする。その他のコネクタしかない機種については、変換コネクタ(ケーブル)を使用し、D-SUB9ピンオスに変換する(リバース不可)。コンピュータ間の接続にはリバースケーブルでコネクタが両端ともD-SUB9ピンメスのものを使用する。
以上を原則とするが、変換コネクタと接続ケーブルが一緒になったものを使用
してもよい。

(4) 開始時の処理

後手が受信待ち状態であることを確認した後、先手が思考を開始する。

(5) 終了時の処理

(a) 投了
投了によって対局の終了とする。コンピュータが負けと判断したならば、投了コマンドを送信し、対局を終了する。詰ませても対局を終了せず、相手からの投了コマンドを待って対局を終了する。
(b) 千日手
自分の手番の局面において、千日手と判断された場合、千日手コマンドを送信し、対局を終了する(自動可)。相手の手番(自分が指した後)の局面における千日手を検出しても、受信を中断してはいけない。
千日手コマンドを受信した場合、対局を終了する。
どちらの場合も、その状態から再開できることが望ましい。
(c) 持将棋
持将棋と判断した場合、持将棋コマンドを送信し、対局を終了する(持将棋の判定は、試合のルールによる)。
(d) 中断
受信待ちの状態において、何らかの操作で強制的に対局を中断できるようにしなければならない。その際には、相手から中断コマンドが送られてきたときと同様の処理を行う。

(6) 再開時の処理(できることが望ましい機能)

中断およびそれに類する状態から、以下の処理で再開ができるようにすること
が望ましい。
対局している両者で手数が異なるときは、進んでいる方の局面を戻し(戻した
手の消費時間も戻す)、同一局面とする。
(a) 通信の場合
指し手を受けるほうが受信待機し、手番側の思考を開始する。
(b) 手入力の場合
指し手を受けるほうを指し手入力待ちとし、手番側の思考を開始する。

(7) トラブル発生時の処理

ルール上指せない手や意味不明の文字列等が送られてきた場合には、送られて
きた文字列を画面に表示し、中断処理を行う。

(8) その他

コンピュータ同士の通信対局では、待った・中断を自動的に行ってはならない。


以下は、吉村氏提供の通信部ソースです。
許可を得て、配布します。


ウィンドウズ環境で32ビットAPIを使った通信対局を可能にするためのプログラム例を記述いたします。 現在、森田将棋、金沢将棋、柿木将棋と通信できておりますが、何らかの問題があればご指摘願います。

このプログラムを大会参加者の方がご自分のプログラムに組み込むことはご自由ですが、私はいかなる保証も致しません。 各自の責任において、ご使用願います

#通信対局が大会の標準となるように、皆さん努力しましょう!

なお、このプログラムは32ビットAPIを使用するウインドウズ用のものです。 一応、私はVC++でコンパイルしております。
(注:VC++バージョン4.X を使用される場合、StdAfx.hというファイルにある以下の行を削除してください
#define VC_EXTRALEAN
バージョン5.0の場合には、削除の必要なし)

static HANDLE hCom;
int  RS_init( )   /* 通信ポートを初期化する */
{
    DCB           dcb ;
    COMMTIMEOUTS  CommTimeOuts ;
    if ( ( hCom = CreateFile ( "COM1",    /* オープンするファイル名 "COM1"  */
           GENERIC_READ | GENERIC_WRITE, /* 既存のファイルをオープンする   */
           0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ) )
		   == INVALID_HANDLE_VALUE   ) {
	return 1; // error
    }
    CommTimeOuts.ReadIntervalTimeout =  MAXDWORD;
    CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
    CommTimeOuts.ReadTotalTimeoutConstant = 1000;
    CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
    CommTimeOuts.WriteTotalTimeoutConstant = 1000;
    if ( !SetCommTimeouts( hCom, &CommTimeOuts )){
      CloseHandle(hCom);
      return 2; // SetCommTimeouts error
    }
    dcb.DCBlength = sizeof ( DCB ) ;
    dcb.BaudRate = 1200 ;
    dcb.fBinary = TRUE ;
    dcb.fParity = 0;
    dcb.fOutxCtsFlow = 0;         // CTS output flow control
    dcb.fOutxDsrFlow = 0;         // DSR output flow control
    dcb.fDtrControl =  1;         // DTR flow control type
    dcb.fDsrSensitivity = 0;      // DSR sensitivity
    dcb.fTXContinueOnXoff = 0;    // XOFF continues Tx
    dcb.fOutX = 1;                // XON/XOFF out flow control
    dcb.fInX = 1;                 // XON/XOFF in flow control
    dcb.fErrorChar = 0;           // enable error replacement
    dcb.fNull = 0;                // enable null stripping
    dcb.fRtsControl = 1;          // RTS flow control
    dcb.fAbortOnError = 0;        // abort reads/writes on error
    dcb.XonLim = 2048;            // transmit XON threshold
    dcb.XoffLim = 512;            // transmit XOFF threshold
    dcb.ByteSize = 8;             // number of bits/byte, 4-8
    dcb.Parity = NOPARITY;        // 0-4=no,odd,even,mark,space
    dcb.StopBits = ONESTOPBIT;    // 0,1,2 = 1, 1.5, 2
    dcb.XonChar = 17;             // Tx and Rx XON character
    dcb.XoffChar = 19;            // Tx and Rx XOFF character
    dcb.ErrorChar = 0;            // error replacement character
    dcb.EofChar = 0;              // end of input character
    dcb.EvtChar = 0;              // received event character
    if ( !SetCommState( hCom, &dcb ) ){
	CloseHandle(hCom);
        return 3;//SetCommState error
    }
    return(0);
}
void   RS_close ()                    /* 通信ポートをクローズする   */
{
    CloseHandle( hCom );
}

/*
  文字を一字読み込む、
    読み込んだ場合は1を返す
    読み込む文字がなかった場合は0を返す
*/
int RS_read(unsigned char *c)
{
	DWORD length;
	if( !ReadFile(hCom, c, 1, &length, NULL) ) return 0;
	return length;
}

void RS_send(unsigned char c)
{
	DWORD length;
	WriteFile(hCom, &c, 1, &length, NULL);
}

Nobuhiro Yoshimura

Konami Computer Entertainment Tokyo The opinions expressed
Office: yosimura@konami.co.jp here are mine and not
Home: yoshimura@acm.org necessarily those of Konami.


/*==============================================
Macintosh communication sample code (C or C++)

1999.6.21 KAKINOKI YOSHIKAZU
------------------------------------------------
Macintosh用シリアル通信プログラム例

このプログラムを大会参加者がご自分のプログラムに組み込むことはご自由ですが、私はいかなる保証も致しません。
各自の責任において、ご使用願います。

柿木 義一
=============================================*/

#include	<Serial.h>
byte com_speed = 1, com_bit = 1, com_parity, com_x, com_stop;
short RsPort;	// 0:Modem, 1:Printer
static	short	in, out;
static	short	com_speeds[5] = {baud300, baud1200, baud2400,
	baud4800, baud9600};
static	short	com_bits[2] = {data7, data8};
static	short	com_paritys[3] = {noParity, oddParity, evenParity};
static	short	com_stops[3] = {stop10, stop15, stop20};
/*==============================
	return 	  0: OK
			-1: error
==============================*/
int	openRS(void)
{
	SerShk	shk;
	OSErr	err;
 	short conf = com_speeds[com_speed]
 			+ com_stops[com_stop]
 			+ com_paritys[com_parity]
 			+ com_bits[com_bit];
 	shk.fXOn = 0;
 	shk.fCTS = 1;
	shk.xOn = 0x13;
 	shk.xOff = 0x11;
 	shk.errs = parityErr + hwOverrunErr + framingErr;
 	shk.evts = ctsEvent;
 	shk.fInX = 0;
	if (RsPort)	// printer port / KEYSPAN USB-SERIAL ADAPTER
	{
		err = OpenDriver("\p.BIn", &in);
		if (err != noErr)
			return -1;
		err = OpenDriver("\p.BOut", &out);
	}
	else	// modem port
	{
		err = OpenDriver("\p.AIn", &in);
		if (err != noErr)
			return -1;
		err = OpenDriver("\p.AOut", &out);
	}
	if (err != noErr)
		return -1;
	err = SerReset(in, conf);
	if (err != noErr)
		return -1;
	err = SerReset(out, conf);
	if (err != noErr)
		return -1;
	err = SerHShake(in, &shk);
	if (err != noErr)
		return -1;
	err = SerHShake(out, &shk);
	if (err != noErr)
		return -1;
	return 0;
}
void	closeRS(void)
{
	CloseDriver(in);
	CloseDriver(out);
}
/*======================
	readRS
	read 1byte
	return 	  N: OK
			-1: error
			-2: break
======================*/
static	short readRS(long *len, char *buf)
{
	SerStaRec	st;
	short		err, ref;
	SerStatus(in, &st);
	if (st.cumErrs)
	{
		*len = 0L;
		return -1;
	}
	for (;;)
	{
		if ((err = SerGetBuf(in, len)) != noErr)
			return -1;
		if (*len)
		{
			FSRead(in, len, buf);
			return *len;
		}
		if (break_check())	// operator's break function
			return -2;
	}
	return 0;
}
/*======================
	return 	  0: OK
				!= 0: error
======================*/
static	short  writeRS(long *len, char *buf)
{
	SerStaRec	st;
	short		err;
	SerStatus(out, &st);
	if (st.cumErrs || st.wrPend || st.ctsHold)
		return -1;
	return FSWrite(out, len, buf);
}
/*============*/
/*======================
	return 	  0: OK
				!= 0: error
======================*/
static	int	puts_rs(char *s)
{
	int	r;
	long	len;
	len = strlen(s);
	r = writeRS(&len, s);
	return r;
}
/*======================
	return 	  >0: char
			-1: error
			-2: break
======================*/
static	int	get_rs(void)
{
	long	len = 1;
	char	buf[256];
	int	r;
	r = readRS(&len, buf);
	if (r < 0)
		return r;
	else
		return buf[0];
}



CSA標準棋譜ファイル形式
1991年 3月 8日 原案 柿木 義一
1991年 3月 9日 CSAで検討
第1版 1991年 5月11日 CSAで検討・決定
第3版 1997年 8月25日 CSA理事会で承認
%KACHI,%HIKIWAKE を追加

1. はじめに

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

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

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

(1)「コンピュータ将棋ファイル記述形式」(第1版)、CSA 資料集 Vol.1
(2)「通信将棋規約の案」,CSA 資料集 Vol.2
(3)「第1回コンピュータ将棋選手権, 通信仕様」, CSA 資料集 Vol.4

2. 棋譜ファイルの形式

2.1 概要

棋譜ファイルは処理を容易とするため、テキストファイルとする。MS-DOSファイルの場合は、コメントと対局者名にシフトJISコードの漢字を使用してもよい。

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

(1) 対局者名
(2) 開始盤面(持駒、手番を含む)
(3) 指し手と消費時間
(4) コメント

コメント以外は、この順番でデータがなければならない。(1)(2)(3)は、省略できる。

セパレータ(/だけの行)をはさんで、これらデータを繰り返し、複数の棋譜や盤面を示すことができる。

2.2 駒と位置

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

2.3 対局者名

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

例:
N+NAKAHARA
N-YONENAGA

2.4 開始盤面

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.5 指し手と消費時間

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

(1) 通常の指し手

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

(2) 特殊な指し手

%で始まる。

投了 :%TORYO
待った:%MATTA
中断 :%CHUDAN
千日手:%SENNICHITE
持将棋:%JISHOGI
詰み :%TSUMI
不詰み:%FUZUMI
エラー:%ERROR (指し手の文字列が正しくない。あるいはルール上指せない等)。
(入玉で)勝ちの宣言:%KACHI
(入玉で)引き分けの宣言:%HIKIWAKE

(注)%KACHI,%HIKIWAKE は、コンピュータ将棋選手権のルールに対応し、第3版で
追加。

(3) 消費時間

"T"に続き、その指し手で消費した時間を秒単位で示す。1秒未満は、切り捨て。省略可能とする。

例:
T10

2.6 コメント

"'"(アポストロフィー)で始まる行はコメントとする。文の途中からのコメントは、できない。

2.7 マルチステートメント

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

2.8 ファイル名の拡張子("."以降の名前)

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

3. 棋譜ファイルの例

'----------棋譜ファイルの例"example.csa"-----------------
'対局者名
N+NAKAHARA
N-YONENAGA
'平手の盤面
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
T12
-3334FU
T6
%CHUDAN