CSAプロトコルで対戦可能になりました
-
-
- >-2537NK
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- +
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- +
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
注意点は、手を送ると、エコーバックがある。改行もつけて送る。
このくらいかな?
確か、WindowsとUnixでの改行コードの違いが問題になってた記憶がある。
テストは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); }