CSAプロトコルで対戦可能になりました

http://wdoor.c.u-tokyo.ac.jp/shogi/tools/view/index.cgi?go_last=on&csa=http%3A%2F%2Fwdoor.c.u-tokyo.ac.jp%2Fshogi%2FLATEST%2Fwdoor%2Byowai_gps-1500-0%2Byowai_gps%2Btest%2B20070923123102.csa

      • >-2537NK
<----2537NK,T1 102手目 先手 ▼v香二v桂二v銀v角v飛 9 8 7 6 5 4 3 2 1
                                                      • +
・v玉 ・ ・ ・ ・ ・ ・v香|一 ・ ・ ・ ・v金 ・ ・ ・ ・|二 ・ ・v歩v銀 ・v金 ・v歩 ・|三 v歩 ・ ・v歩 ・v歩v歩 ・v歩|四 ・ ・ ・ ・ ・ ・ 歩 ・ ・|五 歩 ・v龍 ・ 歩 歩v桂v馬 ・|六 ・ ・ ・ 歩 ・ ・v圭 ・ ・|七 ・ ・ ・ 銀 王 ・ 銀 ・ ・|八 vと ・ ・ ・ 金 金 ・ ・v杏|九
                                                      • +
△ <---%TORYO

注意点は、手を送ると、エコーバックがある。改行もつけて送る。
このくらいかな?
確か、WindowsUnixでの改行コードの違いが問題になってた記憶がある。
テストはwdoorとしかしてないけど、wdoorは改行に寛容だったはず。


上記の棋譜は、自分は後手なんで勝ちなんですが、王様が裸なのが気になる。
持ち駒を大量にもってるので、そっちで安心して、
王の周囲に金・銀が三枚無いと減点が働いてないらしい。
減点とかじゃなくて、金・銀が三枚無いと「評価値が半分になる」なんて非線形でやってみるといいかも(^^;
持ち駒多くて余裕がある時こそ、王の守りをがっちりして欲しい。



山下さんのプログラムの上にもう1階層ラップした感じ

void CsaMove( Te a ,int time )
{
	char buf[256];

	if(a.to==0) return;

	if(a.koma&ENEMY) {
		if(a.from == 0) {
			sprintf_s(buf,"-00%d%s\n",posNum[a.to],csaKoma[ (a.koma&0x07) ]);
		} else {
			if(a.promote == 1) a.koma |= PROMOTED;
			sprintf_s(buf,"-%d%d%s\n",posNum[a.from],posNum[a.to],csaKoma[ (a.koma&0x0F) ]);
		}
	} else {
		if(a.from == 0) {
			sprintf_s(buf,"+00%d%s\n",posNum[a.to],csaKoma[ (a.koma&0x07) ]);
		} else {
			if(a.promote == 1) a.koma |= PROMOTED;
			sprintf_s(buf,"+%d%d%s\n",posNum[a.from],posNum[a.to],csaKoma[ (a.koma&0x0F) ]);
		}
	}

	CsaSend( buf );
	CsaRecv(buf);//echo back recieve
}

void CsaRecvMove( Te& a )
{
	char buf[256];

	a.koma=a.from=a.to=a.value=a.promote=0;

	for(;;) {
		CsaRecv(buf);
		if(buf[0]=='-' || buf[0]=='+' || buf[0]=='%' ) break;
		printf("--->%s",buf);
	}

	if(buf[0]=='%') {
		if( strstr(buf,"%TORYO") != NULL ) {
			a.value=-MUGEN;
			return;
		}
	}


	if(buf[1]=='0' && buf[2]=='0')
		a.from=0;
	else
		a.from=(buf[1]-'0')+(buf[2]-'0'+1)*16;
	a.to  =(buf[3]-'0')+(buf[4]-'0'+1)*16;

	for(int i=1;i<=15;i++) {
		if(csaKoma[i][0]==buf[5] && csaKoma[i][1]==buf[6] ) {
			a.koma=i;
			break;
		}
	}
	if(buf[0]=='-') a.koma |= ENEMY;
	if(buf[0]=='+') a.koma |= SELF;

	if( a.from!=0 && (a.koma&PROMOTED)!=0 && (cpu0.ban[a.from]&PROMOTED)==0 ) {
		a.promote=1;
		a.koma ^= PROMOTED;
	}

//	printf("RecvMove:%d %d %x %d \n",a.from,a.to,a.koma,a.promote);
}