終盤(次の一手)の考え方メモ
相手の王が取れるなら取る
王手がかかっている場合はその手を受ける
相手の王に詰みがあるなら詰ます
自玉に詰みがあるなら防ぐ
相手玉に必至がかかるならかける
(この辺からはかなり先の話)
自玉に必至がかかるなら受ける
合法手を指すアルゴリズムを流用
「*kr0」と「*kr1」は使ってるのかわからないけどとりあえず入れておくw
;---------------------------
;comban⇒mkへ変換
;---------------------------
repeat 81
if comban.cnt>20:kk=comban.cnt-29
if comban.cnt>18:kk=comban.cnt-32
if comban.cnt>14:kk=comban.cnt-33
if comban.cnt>10:kk=comban.cnt+4
if comban.cnt>8 :kk=comban.cnt+3
kk=comban.cnt
x=cnt\9:y=cnt/9
ms.x.y=kk
loop
mk.0.2=comban.81
mk.0.3=comban.82
mk.0.4=comban.83
mk.0.5=comban.84
mk.0.6=comban.85
mk.0.7=comban.86
mk.0.8=comban.87
mk.1.2=comban.88
mk.1.3=comban.89
mk.1.4=comban.90
mk.1.5=comban.91
mk.1.6=comban.92
mk.1.7=comban.93
mk.1.8=comban.94
gosub *ghsy0
;---------------------------
;mk⇒combanへ変換
;---------------------------
repeat 81
x=cnt\9:y=cnt/9
if ms.x.y=-18:comban.cnt=15
if ms.x.y=-17:comban.cnt=16
if ms.x.y=-16:comban.cnt=17
if ms.x.y=-15:comban.cnt=18
if ms.x.y=-13:comban.cnt=19
if ms.x.y=-12:comban.cnt=20
if ms.x.y=-8:comban.cnt=21
if ms.x.y=-7:comban.cnt=22
if ms.x.y=-6:comban.cnt=23
if ms.x.y=-5:comban.cnt=24
if ms.x.y=-4:comban.cnt=25
if ms.x.y=-3:comban.cnt=26
if ms.x.y=-2:comban.cnt=27
if ms.x.y=-1:comban.cnt=28
if ms.x.y=12:comban.cnt=9
if ms.x.y=13:comban.cnt=10
if ms.x.y=15:comban.cnt=11
if ms.x.y=16:comban.cnt=12
if ms.x.y=17:comban.cnt=13
if ms.x.y=18:comban.cnt=14
if ms.x.y=0:comban.cnt=0
comban.cnt=mx.x.y
loop
comban.81=mk.0.2
comban.82=mk.0.3
comban.83=mk.0.4
comban.84=mk.0.5
comban.85=mk.0.6
comban.86=mk.0.7
comban.87=mk.0.8
comban.88=mk.1.2
comban.89=mk.1.3
comban.90=mk.1.4
comban.91=mk.1.5
comban.92=mk.1.6
comban.93=mk.1.7
comban.94=mk.1.8
return
;-----------------------------------------
;COMの候補手を「okte.0」に出力
;(単なるパクリ)
;-----------------------------------------
*ghsy0
okte.0=""
repeat 9 : x=cnt
repeat 9 : y=cnt
;**************************先手用****************************
if ms.x.y=8 : x2=x : y2=y-1 : if ms.x2.y2<=0 : gosub *x2y2
if ms.x.y=7 {
repeat 8
x2=x : y2=y-1-cnt
if y2<0 : break
if ms.x2.y2>0 : break
if ms.x2.y2<0 : gosub *x2y2 : break
if ms.x2.y2=0 : gosub *x2y2
loop
}
if ms.x.y=6 : x2=x-1 : if x2>=0 : y2=y-2 : if ms.x2.y2<=0 : gosub *x2y2
if ms.x.y=6 : x2=x+1 : if x2<=8 : y2=y-2 : if ms.x2.y2<=0 : gosub *x2y2
if ms.x.y=5 : x2=x : y2=y-1 : if y2>=0 : if ms.x2.y2<=0 : gosub *x2y2 ;真上移動
if ms.x.y=5 : x2=x-1 : y2=y-1 : if (x2>=0)&(y2>=0) : if ms.x2.y2<=0 : gosub *x2y2 ;左上移動
if ms.x.y=5 : x2=x-1 : y2=y+1 : if (x2>=0)&(y2<=8) : if ms.x2.y2<=0 : gosub *x2y2 ;左下移動
if ms.x.y=5 : x2=x+1 : y2=y-1 : if (x2<=8)&(y2>=0) : if ms.x2.y2<=0 : gosub *x2y2 ;右上移動
if ms.x.y=5 : x2=x+1 : y2=y+1 : if (x2<=8)&(y2<=8) : if ms.x2.y2<=0 : gosub *x2y2 ;右下移動
if ms.x.y=4 : x2=x : y2=y+1 : if y2<=8 : if ms.x2.y2<=0 : gosub *x2y2 ;真下移動
if ms.x.y=4 : x2=x : y2=y-1 : if y2>=0 : if ms.x2.y2<=0 : gosub *x2y2 ;真上移動
if ms.x.y=4 : x2=x-1 : y2=y : if x2>=0 : if ms.x2.y2<=0 : gosub *x2y2 ;真左移動
if ms.x.y=4 : x2=x+1 : y2=y : if x2<=8 : if ms.x2.y2<=0 : gosub *x2y2 ;真右移動
if ms.x.y=4 : x2=x-1 : y2=y-1 : if (x2>=0)&(y2>=0) : if ms.x2.y2<=0 : gosub *x2y2 ;左上移動
if ms.x.y=4 : x2=x+1 : y2=y-1 : if (x2<=8)&(y2>=0) : if ms.x2.y2<=0 : gosub *x2y2 ;右上移動
if ms.x.y=3 {
repeat 8 ;左上方向
x2=x-1-cnt : y2=y-1-cnt
if (x2<0)|(y2<0) : break
if ms.x2.y2>0 : break
if ms.x2.y2<0 : gosub *x2y2 : break
if ms.x2.y2=0 : gosub *x2y2
loop
repeat 8 ;左下方向
x2=x-1-cnt : y2=y+1+cnt
if (x2<0)|(y2>8) : break
if ms.x2.y2>0 : break
if ms.x2.y2<0 : gosub *x2y2 : break
if ms.x2.y2=0 : gosub *x2y2
loop
repeat 8 ;右上方向
x2=x+1+cnt : y2=y-1-cnt
if (x2>8)|(y2<0) : break
if ms.x2.y2>0 : break
if ms.x2.y2<0 : gosub *x2y2 : break
if ms.x2.y2=0 : gosub *x2y2
loop
repeat 8 ;右下方向
x2=x+1+cnt : y2=y+1+cnt
if (x2>8)|(y2>8) : break
if ms.x2.y2>0 : break
if ms.x2.y2<0 : gosub *x2y2 : break
if ms.x2.y2=0 : gosub *x2y2
loop
}
if ms.x.y=2 {
repeat 8 ;上方向
x2=x : y2=y-1-cnt
if y2<0 : break
if ms.x2.y2>0 : break
if ms.x2.y2<0 : gosub *x2y2 : break
if ms.x2.y2=0 : gosub *x2y2
loop
repeat 8 ;下方向
x2=x : y2=y+1+cnt
if y2>8 : break
if ms.x2.y2>0 : break
if ms.x2.y2<0 : gosub *x2y2 : break
if ms.x2.y2=0 : gosub *x2y2
loop
repeat 8 ;左方向
x2=x-1-cnt : y2=y
if x2<0 : break
if ms.x2.y2>0 : break
if ms.x2.y2<0 : gosub *x2y2 : break
if ms.x2.y2=0 : gosub *x2y2
loop
repeat 8 ;右方向
x2=x+1+cnt : y2=y
if x2>8 : break
if ms.x2.y2>0 : break
if ms.x2.y2<0 : gosub *x2y2 : break
if ms.x2.y2=0 : gosub *x2y2
loop
}
if ms.x.y=1 : x2=x : y2=y+1 : if y2<=8 : if ms.x2.y2<=0 : gosub *x2y2 ;真下移動
if ms.x.y=1 : x2=x : y2=y-1 : if y2>=0 : if ms.x2.y2<=0 : gosub *x2y2 ;真上移動
if ms.x.y=1 : x2=x-1 : y2=y : if x2>=0 : if ms.x2.y2<=0 : gosub *x2y2 ;真左移動
if ms.x.y=1 : x2=x+1 : y2=y : if x2<=8 : if ms.x2.y2<=0 : gosub *x2y2 ;真右移動
if ms.x.y=1 : x2=x-1 : y2=y-1 : if (x2>=0)&(y2>=0) : if ms.x2.y2<=0 : gosub *x2y2 ;左上移動
if ms.x.y=1 : x2=x-1 : y2=y+1 : if (x2>=0)&(y2<=8) : if ms.x2.y2<=0 : gosub *x2y2 ;左下移動
if ms.x.y=1 : x2=x+1 : y2=y-1 : if (x2<=8)&(y2>=0) : if ms.x2.y2<=0 : gosub *x2y2 ;右上移動
if ms.x.y=1 : x2=x+1 : y2=y+1 : if (x2<=8)&(y2<=8) : if ms.x2.y2<=0 : gosub *x2y2 ;右下移動
if ms.x.y=18 : x2=x : y2=y+1 : if y2<=8 : if ms.x2.y2<=0 : gosub *x2y29 ;真下移動
if ms.x.y=18 : x2=x : y2=y-1 : if y2>=0 : if ms.x2.y2<=0 : gosub *x2y29 ;真上移動
if ms.x.y=18 : x2=x-1 : y2=y : if x2>=0 : if ms.x2.y2<=0 : gosub *x2y29 ;真左移動
if ms.x.y=18 : x2=x+1 : y2=y : if x2<=8 : if ms.x2.y2<=0 : gosub *x2y29 ;真右移動
if ms.x.y=18 : x2=x-1 : y2=y-1 : if (x2>=0)&(y2>=0) : if ms.x2.y2<=0 : gosub *x2y29 ;左上移動
if ms.x.y=18 : x2=x+1 : y2=y-1 : if (x2<=8)&(y2>=0) : if ms.x2.y2<=0 : gosub *x2y29 ;右上移動
if ms.x.y=17 : x2=x : y2=y+1 : if y2<=8 : if ms.x2.y2<=0 : gosub *x2y29 ;真下移動
if ms.x.y=17 : x2=x : y2=y-1 : if y2>=0 : if ms.x2.y2<=0 : gosub *x2y29 ;真上移動
if ms.x.y=17 : x2=x-1 : y2=y : if x2>=0 : if ms.x2.y2<=0 : gosub *x2y29 ;真左移動
if ms.x.y=17 : x2=x+1 : y2=y : if x2<=8 : if ms.x2.y2<=0 : gosub *x2y29 ;真右移動
if ms.x.y=17 : x2=x-1 : y2=y-1 : if (x2>=0)&(y2>=0) : if ms.x2.y2<=0 : gosub *x2y29 ;左上移動
if ms.x.y=17 : x2=x+1 : y2=y-1 : if (x2<=8)&(y2>=0) : if ms.x2.y2<=0 : gosub *x2y29 ;右上移動
if ms.x.y=16 : x2=x : y2=y+1 : if y2<=8 : if ms.x2.y2<=0 : gosub *x2y29 ;真下移動
if ms.x.y=16 : x2=x : y2=y-1 : if y2>=0 : if ms.x2.y2<=0 : gosub *x2y29 ;真上移動
if ms.x.y=16 : x2=x-1 : y2=y : if x2>=0 : if ms.x2.y2<=0 : gosub *x2y29 ;真左移動
if ms.x.y=16 : x2=x+1 : y2=y : if x2<=8 : if ms.x2.y2<=0 : gosub *x2y29 ;真右移動
if ms.x.y=16 : x2=x-1 : y2=y-1 : if (x2>=0)&(y2>=0) : if ms.x2.y2<=0 : gosub *x2y29 ;左上移動
if ms.x.y=16 : x2=x+1 : y2=y-1 : if (x2<=8)&(y2>=0) : if ms.x2.y2<=0 : gosub *x2y29 ;右上移動
if ms.x.y=15 : x2=x : y2=y+1 : if y2<=8 : if ms.x2.y2<=0 : gosub *x2y29 ;真下移動
if ms.x.y=15 : x2=x : y2=y-1 : if y2>=0 : if ms.x2.y2<=0 : gosub *x2y29 ;真上移動
if ms.x.y=15 : x2=x-1 : y2=y : if x2>=0 : if ms.x2.y2<=0 : gosub *x2y29 ;真左移動
if ms.x.y=15 : x2=x+1 : y2=y : if x2<=8 : if ms.x2.y2<=0 : gosub *x2y29 ;真右移動
if ms.x.y=15 : x2=x-1 : y2=y-1 : if (x2>=0)&(y2>=0) : if ms.x2.y2<=0 : gosub *x2y29 ;左上移動
if ms.x.y=15 : x2=x+1 : y2=y-1 : if (x2<=8)&(y2>=0) : if ms.x2.y2<=0 : gosub *x2y29 ;右上移動
if ms.x.y=13 {
repeat 8 ;左上方向
x2=x-1-cnt : y2=y-1-cnt
if (x2<0)|(y2<0) : break
if ms.x2.y2>0 : break
if ms.x2.y2<0 : gosub *x2y29 : break
if ms.x2.y2=0 : gosub *x2y29
loop
repeat 8 ;左下方向
x2=x-1-cnt : y2=y+1+cnt
if (x2<0)|(y2>8) : break
if ms.x2.y2>0 : break
if ms.x2.y2<0 : gosub *x2y29 : break
if ms.x2.y2=0 : gosub *x2y29
loop
repeat 8 ;右上方向
x2=x+1+cnt : y2=y-1-cnt
if (x2>8)|(y2<0) : break
if ms.x2.y2>0 : break
if ms.x2.y2<0 : gosub *x2y29 : break
if ms.x2.y2=0 : gosub *x2y29
loop
repeat 8 ;右下方向
x2=x+1+cnt : y2=y+1+cnt
if (x2>8)|(y2>8) : break
if ms.x2.y2>0 : break
if ms.x2.y2<0 : gosub *x2y29 : break
if ms.x2.y2=0 : gosub *x2y29
loop
x2=x : y2=y+1 : if y2<=8 : if ms.x2.y2<=0 : gosub *x2y29 ;真下移動
x2=x : y2=y-1 : if y2>=0 : if ms.x2.y2<=0 : gosub *x2y29 ;真上移動
x2=x-1 : y2=y : if x2>=0 : if ms.x2.y2<=0 : gosub *x2y29 ;真左移動
x2=x+1 : y2=y : if x2<=8 : if ms.x2.y2<=0 : gosub *x2y29 ;真右移動
}
if ms.x.y=12 {
repeat 8 ;上方向
x2=x : y2=y-1-cnt
if y2<0 : break
if ms.x2.y2>0 : break
if ms.x2.y2<0 : gosub *x2y29 : break
if ms.x2.y2=0 : gosub *x2y29
loop
repeat 8 ;下方向
x2=x : y2=y+1+cnt
if y2>8 : break
if ms.x2.y2>0 : break
if ms.x2.y2<0 : gosub *x2y29 : break
if ms.x2.y2=0 : gosub *x2y29
loop
repeat 8 ;左方向
x2=x-1-cnt : y2=y
if x2<0 : break
if ms.x2.y2>0 : break
if ms.x2.y2<0 : gosub *x2y29 : break
if ms.x2.y2=0 : gosub *x2y29
loop
repeat 8 ;右方向
x2=x+1+cnt : y2=y
if x2>8 : break
if ms.x2.y2>0 : break
if ms.x2.y2<0 : gosub *x2y29 : break
if ms.x2.y2=0 : gosub *x2y29
loop
x2=x-1 : y2=y-1 : if (x2>=0)&(y2>=0) : if ms.x2.y2<=0 : gosub *x2y29 ;左上移動
x2=x-1 : y2=y+1 : if (x2>=0)&(y2<=8) : if ms.x2.y2<=0 : gosub *x2y29 ;左下移動
x2=x+1 : y2=y-1 : if (x2<=8)&(y2>=0) : if ms.x2.y2<=0 : gosub *x2y29 ;右上移動
x2=x+1 : y2=y+1 : if (x2<=8)&(y2<=8) : if ms.x2.y2<=0 : gosub *x2y29 ;右下移動
}
loop
loop
notesel okte.0 : notemax max
repeat max
noteget te,cnt
tox="" : strmid tox,te,0,1 : int tox
toy="" : strmid toy,te,1,1 : int toy
tok="" : strmid tok,te,2,3 : int tok
prm="" : strmid prm,te,5,1 : int prm
frx="" : strmid frx,te,6,1 : int frx
fry="" : strmid fry,te,7,1 : int fry
frk="" : strmid frk,te,8,3
if toy<=2 : if tok=8 : okte.0+=""+tox+toy+" 81"+frx+fry+frk+"\n"
if toy=0 : if tok=8 : notedel cnt
if toy=0 : if tok=7 : te=""+tox+toy+" 71"+frx+fry+frk : noteadd te,cnt,1
if toy=1 : if tok=7 : okte.0+=""+tox+toy+" 71"+frx+fry+frk+"\n"
if toy=2 : if tok=7 : okte.0+=""+tox+toy+" 71"+frx+fry+frk+"\n"
if toy=2 : if tok=6 : okte.0+=""+tox+toy+" 61"+frx+fry+frk+"\n"
if toy<=1 : if tok=6 : te=""+tox+toy+" 61"+frx+fry+frk : noteadd te,cnt,1
if (toy<=2)|(fry<=2) : if tok=5 : okte.0+=""+tox+toy+" 51"+frx+fry+frk+"\n"
if (toy<=2)|(fry<=2) : if tok=3 : okte.0+=""+tox+toy+" 31"+frx+fry+frk+"\n"
if (toy<=2)|(fry<=2) : if tok=2 : okte.0+=""+tox+toy+" 21"+frx+fry+frk+"\n"
loop
repeat 9 : x=cnt
repeat 9 : y=cnt
if ms.x.y=8 : nihu=1 : break ;2歩チェック
loop
if nihu=0 {
repeat 9 : y=cnt
if mk.0.8>0 : if y!0 : if ms.x.y=0 : okte.0+=""+x+y+" 8099 0"+"\n"
loop
}
nihu=0
repeat 9 : y=cnt
if mk.0.7>0 : if y!0 : if ms.x.y=0 : okte.0+=""+x+y+" 7099 0"+"\n"
if mk.0.6>0 : if y>1 : if ms.x.y=0 : okte.0+=""+x+y+" 6099 0"+"\n"
if mk.0.5>0 : if ms.x.y=0 : okte.0+=""+x+y+" 5099 0"+"\n"
if mk.0.4>0 : if ms.x.y=0 : okte.0+=""+x+y+" 4099 0"+"\n"
if mk.0.3>0 : if ms.x.y=0 : okte.0+=""+x+y+" 3099 0"+"\n"
if mk.0.2>0 : if ms.x.y=0 : okte.0+=""+x+y+" 2099 0"+"\n"
loop
loop
return
*x2y2 ;ms.x.y<9の時用
if ms.x2.y2=0 : okte.0+=""+x2+y2+" "+ms.x.y+"0"+x+y+" "+ms.x2.y2+"\n" : return
if ms.x2.y2>-9 : okte.0+=""+x2+y2+" "+ms.x.y+"0"+x+y+" "+ms.x2.y2+"\n"
if ms.x2.y2<-9 : okte.0+=""+x2+y2+" "+ms.x.y+"0"+x+y+""+ms.x2.y2+"\n"
return
*x2y29 ;ms.x.y>9の時用
if ms.x2.y2=0 : okte.0+=""+x2+y2+" "+ms.x.y+"0"+x+y+" "+ms.x2.y2+"\n" : return
if ms.x2.y2>-9 : okte.0+=""+x2+y2+" "+ms.x.y+"0"+x+y+" "+ms.x2.y2+"\n"
if ms.x2.y2<-9 : okte.0+=""+x2+y2+" "+ms.x.y+"0"+x+y+""+ms.x2.y2+"\n"
return
*kr0
kiki.0.x2.y2++
return
*kr1
kiki.1.x2.y2++
return
あとでもうちょい整理する予定
|