More ... | HSPで将棋プログラムを作ろう!!サブルーチン群*wnd #include "llmod.as" mref bmscr, 67 // BMSCR構造体 hWnd = bmscr.13 // HSPウィンドウハンドル prm = hWnd, -16 // HSPのウィンドウスタイル dllproc "GetWindowLongA",prm,2,D_USER style = dllret // 現在のウィンドウスタイルを取得 style = style | 0x00010000 // WS_MAXIMIZEBOXを追加 prm = hWnd, -16, style dllproc "SetWindowLongA",prm,3,D_USER // 設定 prm = hWnd, 3 dllproc "ShowWindow", prm, 2, D_USER // 最大化表示 return *st sdim kif,64000 ;内部表現の棋譜保存用変数 dim ms,10,10 : dim mk,2,9 : dim mk2,2,9 ;msはマス、mkは持ち駒、mk2は評価関数で持ち駒の差分を知るための変数 dim kiki,2,10,10 ;kikiは利き、kiki.0.x.yはxy升の先手駒の利きの合計でkiki.1.x.yは後手 sdim okte,64000,2 ;okteは合法手を格納する。okte.0が先手でokte.1が後手用 tesuu=0 ;手数 ms.0.0=-7 : ms.1.0=-6 : ms.2.0=-5 : ms.3.0=-4 : ms.4.0=-1 : ms.5.0=-4 : ms.6.0=-5 : ms.7.0=-6 : ms.8.0=-7 : ms.1.1=-2 : ms.7.1=-3 ms.0.2=-8 : ms.1.2=-8 : ms.2.2=-8 : ms.3.2=-8 : ms.4.2=-8 : ms.5.2=-8 : ms.6.2=-8 : ms.7.2=-8 : ms.8.2=-8 repeat 9 : ms.cnt.6=8 : loop ms.1.7=3 : ms.7.7=2 : ms.0.8=7 : ms.1.8=6 : ms.2.8=5 : ms.3.8=4 : ms.4.8=1 : ms.5.8=4 : ms.6.8=5 : ms.7.8=6 : ms.8.8=7 ; mk.0.0=2,0,1,0,2,0,2,0,4,0,4,0,4,0,4,0,4,0 ; mk.0.0=2,2,1,1,2,2,2,2,4,4,4,4,4,4,4,4,4,4 ; dim ms,10,10 : ms.3.3=0 : ms.4.8=8 : mk.0.8=2 : mk.1.7=8 return *bh color 255,195,82 boxf BX+281,BY-(3*KYS)+256,BX+420,BY+288 ;先手の駒台 boxf BX+281,BY-(4*KYS)+128,BX+420,BY+128 ;後手の駒台 boxf BX,BY,KXS*9+BX,KYS*9+BY color repeat 10 line BX+(KXS*cnt),BY,BX+(KXS*cnt),BY+(KYS*9) line BX,BY+(KYS*cnt),BX+(KXS*9),BY+(KYS*cnt) loop return *hh color : pos 480,0 : mes kif pos 580,0 : mes mxte : mes mxpnt repeat 9 : x=cnt repeat 9 : y=cnt pos x*12+50,y*12+350 : mes kiki.0.x.y pos x*12+200,y*12+350 : mes kiki.1.x.y loop loop return *ks stick s,0 if s&1 : if tesuu>0 : gosub *back : gosub *back ; getkey g,37 : if g=1 : if tesuu>0 : gosub *back ; if (tesuu\2)=1 : await 5 : gosub *ghsy1 : notesel okte.1 : notemax max : rnd r,max : te="" : noteget te,r : gosub *go ;手がランダムのCPU if (tesuu\2)=1 : gosub *yomi1 ;1手読みCPU if s&4 { ; getkey g,39 : if g=1 { if (tesuu\2)=0 : gosub *ghsy0 : notesel okte.0 : notemax max : rnd r,max : te="" : noteget te,r : gosub *go } if mousex<=((KXS*9)+BX) : if BX<=mousex : if BY<=mousey : if mousey<=((KYS*9)+BY) { ;盤上の駒の操作 if frksh=1 : if s&256 : tox=(mousex-BX)/KXS : toy=(mousey-BY)/KYS : tok=ms.tox.toy : gosub *nari : gosub *hk : gosub *hk : if in!-1 : frksh=0 : gosub *go : return : else : ms.tox.toy=tok : ms.frx.fry=frk : if man=1 : mk.0.frk++ : frk=0 : frksh=0 : man=0 : return : else : frk=0 : frksh=0 : return if frksh=0 : if s&256 : gosub *ghsy0 : gosub *ghsy1 : frx=(mousex-BX)/KXS : fry=(mousey-BY)/KYS : frk=ms.frx.fry : if frk!0 : ms.frx.fry=0 : frksh=1 } if frksh=0 { ;駒台上の駒の操作 ここでの変数manは持ち駒を操作する場合、その駒を駒台からこのサブルーチンで1つ減らしてマウスで持った様に見せることにより *goでも余分に1つ駒が減るのを防ぐ為と、合法手でない手を指した場合の処理のところでこのサブルーチンで減らした分を戻す為のフラグ。 *goの終わりでmanを初期化 repeat 9 : c=cnt repeat mk.0.c if c>1 : if mousex>=((mk.0.c-cnt)*10+BX+280+((c\2)*60)) : if mousex<=(((mk.0.c-cnt)*10+BX+280+((c\2)*60))+KXS) : if mousey>=(BY-(((9-c)/2)*KYS)+256) : if mousey<=((BY-(((9-c)/2)*KYS)+256)+KYS) : if s&256 : gosub *ghsy0 : frx=9 : fry=9 : frk=c : mk.0.c-- : frksh=1 : man=1 : break loop loop } return *nari ;先手用だけ prm=0 if (tesuu\2)=0 : if (frk!1)&(frk!4) : if frx!9 { if frk<=5 : if (toy<=2)|(fry<=2) : dialog "成りますか?",2 : if stat=6 : prm=1 : else : prm=0 if (frk=7)|(frk=8) { if toy=0 : prm=1 if (toy=1)|(toy=2) : dialog "成りますか?",2 : if stat=6 : prm=1 : else : prm=0 } if frk=6 { if toy<=1 : prm=1 if toy=2 : dialog "成りますか?",2 : if stat=6 : prm=1 : else : prm=0 } } return *hk ;合法手リストに指した手があるか調べる if (frk>0)&(frk<9) : frk4=" "+frk if frk>9 : frk4=" "+frk if (tok>0)&(tok<9) : tok4=" "+tok if tok>9 : tok4=" "+tok if tok=0 : tok4=" "+tok if (frk<0)&(frk>-9) : frk4=" "+frk if frk<-9 : frk4=""+frk if (tok<0)&(tok>-9) : tok4=" "+tok if tok<-9 : tok4=""+tok te=""+tox+toy+frk4+prm+frx+fry+tok4 if (tesuu\2)=0 : instr in,okte.0,te if (tesuu\2)=1 : instr in,okte.1,te return *kh repeat 9 : x=cnt ;盤上の駒の表示 repeat 9 : y=cnt repeat 9 : z=(cnt*-1) if ms.x.y=z : pos x*KXS+BX,y*KYS+BY : color 255,255,255 : gmode 4,KXS,KYS,255 : gcopy 2,(cnt-1)*KXS+1,KYS*3,KXS,KYS if ms.x.y=cnt : pos x*KXS+BX,y*KYS+BY : color 255,255,255 : gmode 4,KXS,KYS,255 : gcopy 2,(cnt-1)*KXS+1,0,KXS,KYS loop repeat 7 : z=(cnt*-1)-12 : z2=cnt+12 if ms.x.y=z : pos x*KXS+BX,y*KYS+BY : color 255,255,255 : gmode 4,KXS,KYS,255 : gcopy 2,(z*-1-11)*KXS+1,KYS*4,KXS,KYS if ms.x.y=z2 : pos x*KXS+BX,y*KYS+BY : color 255,255,255 : gmode 4,KXS,KYS,255 : gcopy 2,(z2-11)*KXS+1,KYS,KXS,KYS loop loop loop repeat 9 : c=cnt ;駒台上の駒の表示 repeat mk.0.c if c>1 : if mk.0.c>0 : pos (mk.0.c-cnt)*10+BX+280+((c\2)*60),BY-(((9-c)/2)*KYS)+256 : color 255,255,255 : gmode 4,KXS,KYS,255 : gcopy 2,(c-1)*KXS+1,0,KXS,KYS loop repeat mk.1.c if c>1 : if mk.1.c>0 : pos (mk.1.c-cnt)*10+BX+280+((c\2)*60),BY-((c/2)*KYS)+128 : color 255,255,255 : gmode 4,KXS,KYS,255 : gcopy 2,(c-1)*KXS+1,KYS*3,KXS,KYS loop loop if frksh=1 { ;マウスで動かしている駒の表示 color 255,255,255 if (frk>0)&(frk<9) : pos mousex-(KXS/2),mousey-(KYS/2) : gmode 4,KXS,KYS,255 : gcopy 2,(frk-1)*KXS+1,0,KXS,KYS if frk>9 : pos mousex-(KXS/2),mousey-(KYS/2) : gmode 4,KXS,KYS,255 : gcopy 2,(frk-11)*KXS+1,KYS,KXS,KYS if (frk<0)&(frk>-9) : pos mousex-(KXS/2),mousey-(KYS/2) : gmode 4,KXS,KYS,255 : gcopy 2,(frk*-1-1)*KXS+1,KYS*3,KXS,KYS if frk<-9 : pos mousex-(KXS/2),mousey-(KYS/2) : gmode 4,KXS,KYS,255 : gcopy 2,(frk*-1-11)*KXS+1,KYS*4,KXS,KYS } return *go ;指し手を表す文字列型変数teをもとに駒を動かす 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 : int frk if prm=1 { if (tesuu\2)=1 : tok-=10 if (tesuu\2)=0 : tok+=10 } ms.frx.fry=0 : frk=ms.tox.toy : ms.tox.toy=tok if man=0 : if frx=9 { if (tesuu\2)=0 : mk.0.tok-- if (tesuu\2)=1 : tok=tok*-1 : mk.1.tok-- } if frk>9 : frk-=10 if frk<-9 : frk+=10 if (tesuu\2)=0 : frk=frk*-1 : mk.0.frk++ if (tesuu\2)=1 : mk.1.frk++ kif+=""+te+"\n" if (tesuu\2)=0 : snd 0 tesuu++ : man=0 return *back notesel kif : noteget te,tesuu-1 : notedel tesuu-1 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 : int frk ms.frx.fry=tok : ms.tox.toy=frk if frx=9 { if (tesuu\2)=1 : mk.0.tok++ if (tesuu\2)=0 : tok=tok*-1 : mk.1.tok++ } if frk>9 : frk-=10 if frk<-9 : frk+=10 if (tesuu\2)=1 : frk=frk*-1 : mk.0.frk-- if (tesuu\2)=0 : mk.1.frk-- tesuu-- return *ghsy1 okte.1="" repeat 9 : x=cnt repeat 9 : y=cnt ;**************************後手用**************************** if ms.x.y=-8 : x2=x : y2=y+1 : if ms.x2.y2>=0 : gosub *msx2y2 if ms.x.y=-7 { repeat 8 x2=x : y2=y+1+cnt if y2>8 : break if ms.x2.y2<0 : break if ms.x2.y2>0 : gosub *msx2y2 : break if ms.x2.y2=0 : gosub *msx2y2 loop } if ms.x.y=-6 : x2=x-1 : if x2>=0 : y2=y+2 : if ms.x2.y2>=0 : gosub *msx2y2 if ms.x.y=-6 : x2=x+1 : if x2<=8 : y2=y+2 : if ms.x2.y2>=0 : gosub *msx2y2 if ms.x.y=-5 : x2=x : y2=y+1 : if y2<=8 : if ms.x2.y2>=0 : gosub *msx2y2 ;真下移動 if ms.x.y=-5 : x2=x-1 : y2=y-1 : if (x2>=0)&(y2>=0) : if ms.x2.y2>=0 : gosub *msx2y2 ;左上移動 if ms.x.y=-5 : x2=x-1 : y2=y+1 : if (x2>=0)&(y2<=8) : if ms.x2.y2>=0 : gosub *msx2y2 ;左下移動 if ms.x.y=-5 : x2=x+1 : y2=y-1 : if (x2<=8)&(y2>=0) : if ms.x2.y2>=0 : gosub *msx2y2 ;右上移動 if ms.x.y=-5 : x2=x+1 : y2=y+1 : if (x2<=8)&(y2<=8) : if ms.x2.y2>=0 : gosub *msx2y2 ;右下移動 if ms.x.y=-4 : x2=x : y2=y+1 : if y2<=8 : if ms.x2.y2>=0 : gosub *msx2y2 ;真下移動 if ms.x.y=-4 : x2=x : y2=y-1 : if y2>=0 : if ms.x2.y2>=0 : gosub *msx2y2 ;真上移動 if ms.x.y=-4 : x2=x-1 : y2=y : if x2>=0 : if ms.x2.y2>=0 : gosub *msx2y2 ;真左移動 if ms.x.y=-4 : x2=x+1 : y2=y : if x2<=8 : if ms.x2.y2>=0 : gosub *msx2y2 ;真右移動 if ms.x.y=-4 : x2=x-1 : y2=y+1 : if (x2>=0)&(y2<=8) : if ms.x2.y2>=0 : gosub *msx2y2 ;左下移動 if ms.x.y=-4 : x2=x+1 : y2=y+1 : if (x2<=8)&(y2<=8) : if ms.x2.y2>=0 : gosub *msx2y2 ;右下移動 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 *msx2y2 : break if ms.x2.y2=0 : gosub *msx2y2 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 *msx2y2 : break if ms.x2.y2=0 : gosub *msx2y2 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 *msx2y2 : break if ms.x2.y2=0 : gosub *msx2y2 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 *msx2y2 : break if ms.x2.y2=0 : gosub *msx2y2 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 *msx2y2 : break if ms.x2.y2=0 : gosub *msx2y2 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 *msx2y2 : break if ms.x2.y2=0 : gosub *msx2y2 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 *msx2y2 : break if ms.x2.y2=0 : gosub *msx2y2 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 *msx2y2 : break if ms.x2.y2=0 : gosub *msx2y2 loop } if ms.x.y=-1 : x2=x : y2=y+1 : if y2<=8 : if ms.x2.y2>=0 : gosub *msx2y2 ;真下移動 if ms.x.y=-1 : x2=x : y2=y-1 : if y2>=0 : if ms.x2.y2>=0 : gosub *msx2y2 ;真上移動 if ms.x.y=-1 : x2=x-1 : y2=y : if x2>=0 : if ms.x2.y2>=0 : gosub *msx2y2 ;真左移動 if ms.x.y=-1 : x2=x+1 : y2=y : if x2<=8 : if ms.x2.y2>=0 : gosub *msx2y2 ;真右移動 if ms.x.y=-1 : x2=x-1 : y2=y-1 : if (x2>=0)&(y2>=0) : if ms.x2.y2>=0 : gosub *msx2y2 ;左上移動 if ms.x.y=-1 : x2=x-1 : y2=y+1 : if (x2>=0)&(y2<=8) : if ms.x2.y2>=0 : gosub *msx2y2 ;左下移動 if ms.x.y=-1 : x2=x+1 : y2=y-1 : if (x2<=8)&(y2>=0) : if ms.x2.y2>=0 : gosub *msx2y2 ;右上移動 if ms.x.y=-1 : x2=x+1 : y2=y+1 : if (x2<=8)&(y2<=8) : if ms.x2.y2>=0 : gosub *msx2y2 ;右下移動 if ms.x.y=-18 : x2=x : y2=y+1 : if y2<=8 : if ms.x2.y2>=0 : gosub *msx2y29 ;真下移動 if ms.x.y=-18 : x2=x : y2=y-1 : if y2>=0 : if ms.x2.y2>=0 : gosub *msx2y29 ;真上移動 if ms.x.y=-18 : x2=x-1 : y2=y : if x2>=0 : if ms.x2.y2>=0 : gosub *msx2y29 ;真左移動 if ms.x.y=-18 : x2=x+1 : y2=y : if x2<=8 : if ms.x2.y2>=0 : gosub *msx2y29 ;真右移動 if ms.x.y=-18 : x2=x-1 : y2=y+1 : if (x2>=0)&(y2<=8) : if ms.x2.y2>=0 : gosub *msx2y29 ;左下移動 if ms.x.y=-18 : x2=x+1 : y2=y+1 : if (x2<=8)&(y2<=8) : if ms.x2.y2>=0 : gosub *msx2y29 ;右下移動 if ms.x.y=-17 : x2=x : y2=y+1 : if y2<=8 : if ms.x2.y2>=0 : gosub *msx2y29 ;真下移動 if ms.x.y=-17 : x2=x : y2=y-1 : if y2>=0 : if ms.x2.y2>=0 : gosub *msx2y29 ;真上移動 if ms.x.y=-17 : x2=x-1 : y2=y : if x2>=0 : if ms.x2.y2>=0 : gosub *msx2y29 ;真左移動 if ms.x.y=-17 : x2=x+1 : y2=y : if x2<=8 : if ms.x2.y2>=0 : gosub *msx2y29 ;真右移動 if ms.x.y=-17 : x2=x-1 : y2=y+1 : if (x2>=0)&(y2<=8) : if ms.x2.y2>=0 : gosub *msx2y29 ;左下移動 if ms.x.y=-17 : x2=x+1 : y2=y+1 : if (x2<=8)&(y2<=8) : if ms.x2.y2>=0 : gosub *msx2y29 ;右下移動 if ms.x.y=-16 : x2=x : y2=y+1 : if y2<=8 : if ms.x2.y2>=0 : gosub *msx2y29 ;真下移動 if ms.x.y=-16 : x2=x : y2=y-1 : if y2>=0 : if ms.x2.y2>=0 : gosub *msx2y29 ;真上移動 if ms.x.y=-16 : x2=x-1 : y2=y : if x2>=0 : if ms.x2.y2>=0 : gosub *msx2y29 ;真左移動 if ms.x.y=-16 : x2=x+1 : y2=y : if x2<=8 : if ms.x2.y2>=0 : gosub *msx2y29 ;真右移動 if ms.x.y=-16 : x2=x-1 : y2=y+1 : if (x2>=0)&(y2<=8) : if ms.x2.y2>=0 : gosub *msx2y29 ;左下移動 if ms.x.y=-16 : x2=x+1 : y2=y+1 : if (x2<=8)&(y2<=8) : if ms.x2.y2>=0 : gosub *msx2y29 ;右下移動 if ms.x.y=-15 : x2=x : y2=y+1 : if y2<=8 : if ms.x2.y2>=0 : gosub *msx2y29 ;真下移動 if ms.x.y=-15 : x2=x : y2=y-1 : if y2>=0 : if ms.x2.y2>=0 : gosub *msx2y29 ;真上移動 if ms.x.y=-15 : x2=x-1 : y2=y : if x2>=0 : if ms.x2.y2>=0 : gosub *msx2y29 ;真左移動 if ms.x.y=-15 : x2=x+1 : y2=y : if x2<=8 : if ms.x2.y2>=0 : gosub *msx2y29 ;真右移動 if ms.x.y=-15 : x2=x-1 : y2=y+1 : if (x2>=0)&(y2<=8) : if ms.x2.y2>=0 : gosub *msx2y29 ;左下移動 if ms.x.y=-15 : x2=x+1 : y2=y+1 : if (x2<=8)&(y2<=8) : if ms.x2.y2>=0 : gosub *msx2y29 ;右下移動 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 *msx2y29 : break if ms.x2.y2=0 : gosub *msx2y29 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 *msx2y29 : break if ms.x2.y2=0 : gosub *msx2y29 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 *msx2y29 : break if ms.x2.y2=0 : gosub *msx2y29 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 *msx2y29 : break if ms.x2.y2=0 : gosub *msx2y29 loop x2=x : y2=y+1 : if y2<=8 : if ms.x2.y2>=0 : gosub *msx2y29 ;真下移動 x2=x : y2=y-1 : if y2>=0 : if ms.x2.y2>=0 : gosub *msx2y29 ;真上移動 x2=x-1 : y2=y : if x2>=0 : if ms.x2.y2>=0 : gosub *msx2y29 ;真左移動 x2=x+1 : y2=y : if x2<=8 : if ms.x2.y2>=0 : gosub *msx2y29 ;真右移動 } 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 *msx2y29 : break if ms.x2.y2=0 : gosub *msx2y29 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 *msx2y29 : break if ms.x2.y2=0 : gosub *msx2y29 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 *msx2y29 : break if ms.x2.y2=0 : gosub *msx2y29 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 *msx2y29 : break if ms.x2.y2=0 : gosub *msx2y29 loop x2=x-1 : y2=y-1 : if (x2>=0)&(y2>=0) : if ms.x2.y2>=0 : gosub *msx2y29 ;左上移動 x2=x-1 : y2=y+1 : if (x2>=0)&(y2<=8) : if ms.x2.y2>=0 : gosub *msx2y29 ;左下移動 x2=x+1 : y2=y-1 : if (x2<=8)&(y2>=0) : if ms.x2.y2>=0 : gosub *msx2y29 ;右上移動 x2=x+1 : y2=y+1 : if (x2<=8)&(y2<=8) : if ms.x2.y2>=0 : gosub *msx2y29 ;右下移動 } loop loop notesel okte.1 : 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>=6 : if tok=-8 : okte.1+=""+tox+toy+" -81"+frx+fry+frk+"\n" if toy=8 : if tok=-8 : notedel cnt if toy=8 : if tok=-7 : te=""+tox+toy+" -71"+frx+fry+frk : noteadd te,cnt,1 if toy=7 : if tok=-7 : okte.1+=""+tox+toy+" -71"+frx+fry+frk+"\n" if toy=6 : if tok=-7 : okte.1+=""+tox+toy+" -71"+frx+fry+frk+"\n" if toy=6 : if tok=-6 : okte.1+=""+tox+toy+" -61"+frx+fry+frk+"\n" if toy>=7 : if tok=-6 : te=""+tox+toy+" -61"+frx+fry+frk : noteadd te,cnt,1 if (toy>=6)|(fry>=6) : if tok=-5 : okte.1+=""+tox+toy+" -51"+frx+fry+frk+"\n" if (toy>=6)|(fry>=6) : if tok=-3 : okte.1+=""+tox+toy+" -31"+frx+fry+frk+"\n" if (toy>=6)|(fry>=6) : if tok=-2 : okte.1+=""+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.1.8>0 : if y!8 : if ms.x.y=0 : okte.1+=""+x+y+" -8099 0"+"\n" loop } nihu=0 repeat 9 : y=cnt if mk.1.7>0 : if y!8 : if ms.x.y=0 : okte.1+=""+x+y+" -7099 0"+"\n" if mk.1.6>0 : if y<7 : if ms.x.y=0 : okte.1+=""+x+y+" -6099 0"+"\n" if mk.1.5>0 : if ms.x.y=0 : okte.1+=""+x+y+" -5099 0"+"\n" if mk.1.4>0 : if ms.x.y=0 : okte.1+=""+x+y+" -4099 0"+"\n" if mk.1.3>0 : if ms.x.y=0 : okte.1+=""+x+y+" -3099 0"+"\n" if mk.1.2>0 : if ms.x.y=0 : okte.1+=""+x+y+" -2099 0"+"\n" loop loop return *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 *msx2y2 ;ms.x.y>-9の時用 if ms.x2.y2<9 : okte.1+=""+x2+y2+" "+ms.x.y+"0"+x+y+" "+ms.x2.y2+"\n" if ms.x2.y2>9 : okte.1+=""+x2+y2+" "+ms.x.y+"0"+x+y+" "+ms.x2.y2+"\n" return *msx2y29 ;ms.x.y<-9の時用 if ms.x2.y2<9 : okte.1+=""+x2+y2+""+ms.x.y+"0"+x+y+" "+ms.x2.y2+"\n" if ms.x2.y2>9 : okte.1+=""+x2+y2+""+ms.x.y+"0"+x+y+" "+ms.x2.y2+"\n" 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 *yomi1 gosub *ghsy1 : notesel okte.1 : notemax max : sdim mxte,64000 : mxpnt=-10000 ;mxteは後手の最善手を格納する変数 repeat 9 : mk2.0.cnt=mk.0.cnt : mk2.1.cnt=mk.1.cnt : loop repeat max pnt=0 ;評価関数で使う変数の初期化 pntはポイント mxpntはマックスポイント ; await : redraw 0 : color 255,255,255 : boxf : color ; gosub *bh ;盤表示 notesel okte.1 : noteget te,cnt : gosub *go : gosub *hyouka ; gosub *kh ;駒表示 ; gosub *hh ;変数表示 title ""+cnt ; redraw 1 gosub *back loop await 600 : notesel mxte : notemax max : rnd r,max : te="" : noteget te,r : gosub *go : snd 0 ;最善手リストからランダムに選んで指す return *hyouka ;プラスの評価 repeat 9 if cnt>0 : if mk.1.cnt>mk2.1.cnt : pnt+=100 loop ;マイナスの評価 if pnt=mxpnt : mxte+=""+te+"\n" if pnt>mxpnt : sdim mxte,64000 : mxpnt=pnt : mxte+=""+te+"\n" return |