[トップ][編集][本文][編集履歴][一覧][最近の更新][->English]

Note:R-331G

終盤(次の一手)の考え方メモ

相手の王が取れるなら取る

王手がかかっている場合はその手を受ける

相手の王に詰みがあるなら詰ます

自玉に詰みがあるなら防ぐ

相手玉に必至がかかるならかける

(この辺からはかなり先の話)

  • 作っても処理に時間がかかりそう

自玉に必至がかかるなら受ける

合法手を指すアルゴリズムを流用

「*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

あとでもうちょい整理する予定