なぜか五連を認識しなかったり、四三を三々と誤判定します。
何ででしょうか。コードはこちら↓
↑長い…。メニュー表示&棋譜閲覧機能&COM対戦機能(途中)をつけたからか・・・。
;連珠5 #packopt name "連珠5.exe" #include "mod_menu.as" ;-------- マクロ宣言 -------- #enum global NULL=0 #enum sousa_kifu #enum sousa_ahead #enum sousa_next #enum sousa_battle ;----- ボタンを押したときに自動的に飛ぶ ----- oncmd gosub *menuclick,WM_COMMAND onkey gosub *keypush size=20 kflg=0 ;---------- メニュー ---------- ;---------- 操作(&S) ---------- newmenu smenu,1 addmenu smenu,"棋譜ロード(&L)",sousa_kifu addmenu smenu,"前に戻る(&A)",sousa_ahead addmenu smenu,"次に進む(&N)",sousa_next addmenu smenu,"対戦(&B)",sousa_battle newmenu menu,0 addmenu menu,"操作(&S)",smenu,0x10 applymenu menu ;------------------------------ screen 0,size*17,size*21 font "MS ゴシック",size title "連珠5" stop *menuclick switch (wparam & 0xFFFF) case sousa_kifu gosub *record kflg=1 swbreak case sousa_ahead gosub *mae swbreak case sousa_next gosub *ato swbreak case sousa_battle gosub *taisen kflg=0 swbreak swend return *keypush ;L…ロード A…前 N…後 V…対戦 switch iparam case 76 gosub *record kflg=1 swbreak case 65 gosub *mae swbreak case 78 gosub *ato swbreak case 66 gosub *taisen kflg=0 swbreak swend return ;----------------------------- *record dialog "txt",16,"棋譜ファイル" if stat=0 :return dim ban,15,15 ;0→無,1→黒,2→白 sdim kifu,7*15*15+100 ;棋譜データ。一列五行、ALL notesel kifu :noteload refstr max=notemax title "連珠5 - 棋譜("+strf("%3d",point)+"手目)" gosub *byoga ;棋譜解析・閲覧 gosub *kaiseki return *kaiseki sdim datax,20,15*15 sdim datay,20,15*15 for gyo,0,max noteget data,gyo datax(gyo)=int(strmid(data,0,2))-1 datay(gyo)=int(strmid(data,3,2))-1 next return *mae if (kflg=0)|(point=0) :return point- ban(datax(point),datay(point))=0 title "連珠5 - 棋譜("+strf("%3d",point)+"手目)" gosub *byoga2 return *ato if (kflg=0)|(point=max-1) :return point+ title "連珠5 - 棋譜("+strf("%3d",point)+"手目)" gosub *byoga2 return *byoga2 for k,0,point teban2=k\2+1 ban(datax(k),datay(k))=teban2 next gosub *byoga return ;----------------------------- *taisen onkey 0 pat=0 mes " 黒 白 key" mes " 人 vs 人 → A" mes " 人 vs CPU → B" mes "CPU vs 人 → C" mes "CPU vs CPU → D" mes "今、Aのみ" repeat getkey keycheck,65 :if keycheck=1 :pat=1 :break ;getkey keycheck,66 :if keycheck=1 :pat=2 :break ;getkey keycheck,67 :if keycheck=1 :pat=3 :break ;getkey keycheck,68 :if keycheck=1 :pat=4 :break await 5 loop ;配列を初期化 dim ban,15,15 ;0→無,1→黒,2→白 sdim kifu,7*15*15+100 ;棋譜データ。一列五行、ALL title "連珠5 - 対戦" gosub *byoga vsflg=0 :winflg=0 ;打つ for count,0,225 teban=count\2+1 if teban=1 :t2="黒" :else :t2="白" mes t2+"の手番です。" switch pat case 1 gosub *keyloop swbreak case 2 if teban=1 :gosub *keyloop :else :gosub *complay swbreak case 3 if teban=2 :gosub *keyloop :else :gosub *complay swbreak case 4 gosub *complay swbreak swend gosub *kiroku mx- :my- ban(mx,my)=teban gosub *byoga gosub *hantei if (iflg1=1)|(iflg2=1)|(iflg3=1) { vsflg=2 _break } else { if gflg=1 { vsflg=1 _break } } next if vsflg=1 { mes t2+"の勝ちです!" :kifu+=str(t2)+"の勝ちです!" } else { if vsflg=2 { if iflg1=1 :mes "黒の三々禁負けです。" :kifu+="黒の三々禁負けです。" if iflg2=1 :mes "黒の四々禁負けです。" :kifu+="黒の四々禁負けです。" if iflg3=1 :mes "黒の長連禁負けです。" :kifu+="黒の長連禁負けです。" } else :mes "引き分けです。" :kifu+="引き分けです。" } dialog "棋譜を保存しますか?(kifu.txt)",2,"連珠5" if stat=6 :notesel kifu :notesave "kifu.txt" cls :onkey 1 dialog "終了" return ;----------------------------- *keyloop repeat stick ky,16+256 if ky&16 :dialog kifu if ky&256 { mx=int(1.0*mousex/size) :my=int(1.0*mousey/size) if (mx>=1)&(mx<=15)&(my>=1)&(my<=15) { if ban(mx-1,my-1)=0 :break } } await 5 loop return *complay wait 10 randomize bak=teban ;自分の手番をバックアップ ura=-teban+3 ;敵の手番を変数に格納 ;自分の五連を探す for y,0,15 for x,0,15 if ban(x,y)=0 { teban=bak :mx=x :my=y gosub *hantei if gflg=1 { mx=x+1 :my=y+1 :teban=bak return } } next next ;敵の活四を防ぐ if k4flg=1 { } ;ランダムに手を生成 sdim listx,225 :sdim listy,225 kazu=0 for y,0,15 for x,0,15 if ban(x,y)=0 { teban=bak :mx=x :my=y gosub *hantei if (iflg1=0)&(iflg2=0)&(iflg3=0) { listx(kazu)=x :listy(kazu)=y kazu+ } } next next listr=rnd(kazu) mx=listx(listr)+1 :my=listy(listr)+1 return *byoga ;盤を描画 redraw 0 cls mes " WWWWWWWWWWWWWWW " sdim hyozi,20 for y,0,15 hyozi="W" for x,0,15 if ban(x,y)=0 :hyozi+="┼" if ban(x,y)=1 :hyozi+="●" if ban(x,y)=2 :hyozi+="○" next hyozi+="W" mes hyozi next mes " WWWWWWWWWWWWWWW " redraw 1 return *kiroku kifu+=strf("%2d",mx)+","+strf("%2d",my)+"\n" return ;[渡し値] ;[返り値] ;gflg {0…五連無し,1…五連有り} ;k4flg,k3flg ;iflg1(0…三々禁なし,1…三々禁あり) ;iflg2(0…四々禁なし,1…四々禁あり) ;iflg3(0…長連禁なし,1…長連禁あり) *hantei gflg=0 :iflg1=0 :iflg2=0 :iflg3=0 ;五連が出来ているか調べる gosub *hantei2 ;五連を調べる(グレードアップ版) dim yaku2,4 yaku2(0)=yaku(0)+yaku(4)-1 ;上下方向 yaku2(1)=yaku(1)+yaku(5)-1 ;右斜め方向 yaku2(2)=yaku(2)+yaku(6)-1 ;左右方向 yaku2(3)=yaku(3)+yaku(7)-1 ;左斜め方向 dim katu2,4 katu2(0)=katu(0)+katu(4) katu2(1)=katu(1)+katu(5) katu2(2)=katu(2)+katu(6) katu2(3)=katu(3)+katu(7) dim tobi,4 ;五連判定 for k,0,4 if yaku2(k)=5 { ;通常五連 gflg=1 _break } else { if yaku2(k)>5 { if teban=1 { ;長連・黒 iflg3=1 _break } else { ;長連・白 gflg=1 _break } } } next ;三々・四々判定 ;カウント sansan=0 sisi=0 for k,0,4 if (yaku2(k)=3)&(katu2(k)=0) :sansan+ if (yaku2(k)=4)&(katu2(k)!2) :sisi+ next if (sansan>=2)&(teban=1) { iflg1=1 }else { if sansan=1 { k3flg=1 } } if (sisi>=2)&(teban=1) { iflg2=1 }else { if sisi=1 { k4flg=1 } } return ;[渡し値] ;teban {1…黒,2…白} ;mx,my ;[返り値] ;yaku(0〜7) 数 ;katu(0〜7) 敵の石があるか *hantei2 dim yaku,8 dim katu,8 ura=-teban+3 ;上 if my>=4 { hflg=0 for k,0,5 switch ban(mx,my-k) case teban hflg+ swbreak case ura katu(0)=1 _break swbreak swend next yaku(0)=hflg } ;右上 if (mx<=10)&(my>=4) { hflg=0 for k,0,5 switch ban(mx+k,my-k) case teban hflg+ swbreak case ura katu(1)=1 _break swbreak swend next yaku(1)=hflg } ;右 if mx<=10 { hflg=0 for k,0,5 switch ban(mx+k,my) case teban hflg+ swbreak case ura katu(2)=1 _break swbreak swend next yaku(2)=hflg } ;右下 if (mx<=10)&(my<=10) { hflg=0 for k,0,5 switch ban(mx+k,my+k) case teban hflg+ swbreak case ura katu(3)=1 _break swbreak swend next yaku(3)=hflg } ;下 if my<=10 { hflg=0 for k,0,5 switch ban(mx,my+k) case teban hflg+ swbreak case ura katu(4)=1 _break swbreak swend next yaku(4)=hflg } ;左下 if (mx>=4)&(my<=10) { hflg=0 for k,0,5 switch ban(mx-k,my+k) case teban hflg+ swbreak case ura katu(5)=1 _break swbreak swend next yaku(5)=hflg } ;左 if mx>=4 { hflg=0 for k,0,5 switch ban(mx-k,my) case teban hflg+ swbreak case ura katu(6)=1 _break swbreak swend next yaku(6)=hflg } ;左上 if (mx>=4)&(my>=4) { hflg=0 for k,0,5 switch ban(mx-k,my-k) case teban hflg+ swbreak case ura katu(7)=1 _break swbreak swend next yaku(7)=hflg } return