詰め将棋ルーチン製作
詰め将棋ルーチンを作ってみた。
詰むか詰まないかの探索なので、評価関数も関係ないし、
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歩 ・ 金 ・ | 三 |
・ ・ ・ ・ ・ ・ ・ 歩 ・ | 四 |
・ ・ ・ ・ ・ ・ ・ ・ ・ | 五 |
・ ・ ・ ・ ・ ・ ・ ・ ・ | 六 |
・ ・ ・ ・ ・ ・ ・ ・ ・ | 七 |
・ ・ ・ ・ ・ ・ ・ ・ ・ | 八 |
・ ・ ・ ・ ・ ・ ・ ・ ・ | 九 |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- +
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
持ち駒