入玉勝ち宣言を入れてみました
CSAサイトの通信プロトコル定義書に、以下のような記述があります
「入玉宣言勝ち」の条件(第13回選手権で使用のもの): 次の条件が成立する場合、勝ちを宣言できる(以下「入玉宣言勝ち」と云う)。 条件: (a) 宣言側の手番である。 (b) 宣言側の玉が敵陣三段目以内に入っている。 (c) 宣言側が(大駒5点小駒1点の計算で) ・先手の場合28点以上の持点がある。 ・後手の場合27点以上の持点がある。 ・点数の対象となるのは、宣言側の持駒と敵陣三段目 以内に存在する玉を除く宣言側の駒のみである。 (d) 宣言側の敵陣三段目以内の駒は、玉を除いて10枚以上存在する。 (e) 宣言側の玉に王手がかかっていない。 (詰めろや必死であることは関係ない) (f) 宣言側の持ち時間が残っている。(切れ負けの場合) 以上1つでも条件を満たしていない場合、宣言した方が負けとなる。 (注) このルールは、日本将棋連盟がアマチュアの公式戦で使用しているものである。 以上の宣言は、コンピュータが行い、画面上に明示する。
プログラム的にはこんな感じですか、
if( SorE==SELF && sou>0 && sou<=4*16+9 && !isMate(SorE) ) { int kachi=0; for( int y=2*16;y<=4*16;y+=16 ) for( int x=1;x<=9;x++) { int c=ban[x+y]; if( c==SHI || c==SKA || c==SRY || c==SUM ) kachi+=5; else if(c!=SOU && (c&SELF) ) kachi+=1; } for(int i=SFU;i<=SHI;i++) { if( i==SHI || i==SKA ) kachi+=5*hand[i]; else kachi+=hand[i]; } if( kachi>=28 ) { printf("info string 「入玉宣言勝ち」成立 持点=%d \n",kachi); return 2; } }
大駒は5点で大きいから、取られるともったいないので盤面には打たない方が良さそうですね。
もしくは大駒で敵のそっぽ駒を取りまくるのが有効かも。