詰め将棋ルーチン製作

詰め将棋ルーチンを作ってみた。
詰むか詰まないかの探索なので、評価関数も関係ないし、
alpha,betaの枝刈りもない。ようするにすべての手を読んで探す。


http://www31.ocn.ne.jp/~kfend/inside_kfend/hissi.html#c3
KFEndの解説を参考にした。



//詰めろルーチン

int attack(int depth,int depthmax,int SorE)
{
if(depth>=depthmax) return 0;

int v;
int tp;
Te t[500];
tp = makeMoves(SorE,t);

for(int i=0;i< tp ;i++) {
push();move( t[i],SorE );

//打ってみて、王手になってないなら次へ
if( SorE==SELF && (!controlS[k.eou] && !controlS2[k.eou] ) ) { undo( t[i],SorE);pop();continue; }
else if( SorE==ENEMY && (!controlE[k.sou] && !controlE2[k.sou] ) ) { undo( t[i],SorE);pop();continue; }

v=defense(depth+1,depthmax,enemy(SorE) );

undo( t[i],SorE );pop();

if(v==1){
if(depth==0) BestTe[depth][0]=t[i];
return 1;
}
}
return 0;
}

int defense(int depth,int depthmax,int SorE)
{
int v;
int tp;
Te t[500];
tp = makeMoves(SorE,t);

for(int i=0;i< tp ;i++) {
push();move( t[i],SorE );

//打ってみて、王手のままなら次へ
if( SorE==SELF && (controlE[k.sou] || controlE2[k.sou] ) ) { undo( t[i],SorE);pop();continue; }
else if( SorE==ENEMY && (controlS[k.eou] || controlS2[k.eou] ) ) { undo( t[i],SorE);pop();continue; }

v=attack(depth+1,depthmax,enemy(SorE) );

undo( t[i],SorE );pop();

if(v==0){
return 0;
}
}
return 1;
}

プログラムは単純にすんだ。
実際は、必至を考えないといけないし、同じ王手を生成でも、
敵が逃げる手があまり多い手は、「前向き枝刈り」した方がいいという
工夫もあるらしい。
詰め将棋は、研究が進んでいて、文献も多いし、
勝ち負けがはっきりしているので、プログラムも作りやすいと思う。


こちらの9手詰めの詰め将棋を解かせてみた。
http://www.shogitown.com/tume/jisaku/jisaku10.html


持ち駒
9 8 7 6 5 4 3 2 1

                                                        • +
・ ・ ・ ・ ・ ・ ・ ・v玉
・ ・ ・ ・ ・ ・ ・ ・ ・
・ ・ ・ と ・v歩 ・ ・ ・
・ ・ ・ ・ ・ ・ ・ 歩 ・
・ ・ ・ ・ ・ ・ ・ ・ ・
・ ・ ・ ・ ・ ・ ・ ・ ・
・ ・ ・ ・ ・ ・ ・ ・ ・
・ ・ ・ ・ ・ ・ ・ ・ ・
・ ・ ・ ・ ・ ・ ・ ・ ・
                                                        • +

持ち駒 香 金二

投了図


持ち駒
9 8 7 6 5 4 3 2 1

                                                        • +
・ ・ ・ ・v玉 ・ ・ ・ ・
・ ・ ・ ・ 金 ・ 杏 ・ ・
・ ・ ・ と ・v歩 ・ 金 ・
・ ・ ・ ・ ・ ・ ・ 歩 ・
・ ・ ・ ・ ・ ・ ・ ・ ・
・ ・ ・ ・ ・ ・ ・ ・ ・
・ ・ ・ ・ ・ ・ ・ ・ ・
・ ・ ・ ・ ・ ・ ・ ・ ・
・ ・ ・ ・ ・ ・ ・ ・ ・
                                                        • +

持ち駒