前回に対して、主に次の点が変更になっていますので、御注意下さい。
運営の都合上、今後、若干の変更がある可能性があります。
実施要領
(1) 日時
(2) 場所
(3) 主催
(4) 協力
(5) 協賛
(6) 賞品
(7) 参加費
(8) 参加資格(必須の機能)
(注)
(9) プログラムにあることが望ましい機能
(10) 通信機能について
(11) 試合の方法(予選・決勝共通)
(12) 持ち時間
(13) 入玉について
(14) 勝敗の決定
(15) 予選と決勝の方式
(16) 次回のシード順
(17) 予選の組合せ
(18) 決勝の組合せ
(19) 順位の決め方
(20) 棋譜
(21) プログラム等の保存およびクレーム期間
(付則) 本ルールは日本語版と英語版を作成する。その解釈に疑義ある時は、日本語版を以て正本とする。
(1) コマンド
(2) 通信条件
(3) ケーブル、コネクタ
(4) 開始時の処理
(5) 終了時の処理
(6) 再開時の処理(できることが望ましい機能)
(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]; }
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