新しく発言する EXIT インデックスへ
オセロゲームは作れますか?

  オセロゲームは作れますか? 会社員 2005/02/20 20:35:17 
  表示部分だけですが、、、 山中和義 2005/02/21 11:07:06 
  │├盤をクリックしてゲームが可能です。 山中和義 2005/02/21 16:41:53 
  │└続き 山中和義 2005/02/21 16:42:35 
  完成版を記載しておきます。。。 山中和義 2005/02/21 19:10:50 
   ├続き 山中和義 2005/02/21 19:11:39 
   ├オセロの結果 会社員 2005/03/05 21:24:45 
   ├続きです 会社員 2005/03/05 21:30:15 
   └続きの続き 会社員 2005/03/05 21:32:11 

  オセロゲームは作れますか? 会社員 2005/02/20 20:35:17  ツリーへ

オセロゲームは作れますか? 返事を書く
会社員 2005/02/20 20:35:17
こんばんは
オセロゲームは作ることは可能でしょうか?

作れる場合、どういう風にプログラムを組めばいいのでしょうか?

ランダムで対戦させて、先手、後手どちらが勝率が高いか調べてみたいのですが。

  表示部分だけですが、、、 山中和義 2005/02/21 11:07:06  ツリーへ

Re: オセロゲームは作れますか? 返事を書く
山中和義 2005/02/21 11:07:06
表示部分だけですが、、、

!オセロゲーム

SET BITMAP SIZE 640,480 !画面サイズ640×480
SET WINDOW 0,640,0,480 !左下が原点。横がX、縦Y
SET COLOR mode "NATIVE" !RGB指定
SET TEXT font "",12 !文字サイズ

DIM CEL(8,8) !配置情報

!盤を表示する
SET AREA COLOR colorindex(0,1,0) !緑
PLOT AREA:50,50; 50,450; 450,450; 450,50
FOR i=1 TO 8 !行番号
PLOT TEXT ,AT 25,470-50*i:STR$(i)
NEXT i
FOR i=1 TO 8 !列番号
PLOT TEXT ,AT 20+50*i,460:CHR$(i+64)
NEXT i


!マス目を表示する
SET LINE COLOR colorindex(0,0,0) !黒
PLOT LINES:50,50; 50,450; 450,450; 450,50; 50,50
FOR i=1 TO 2
PLOT LINES:50-i,50-i; 50-i,450+i; 450+i,450+i; 450+i,50-i; 50-i,50-i
NEXT i

FOR i=1 TO 8 !縦線
PLOT LINES:50*i,50; 50*i,450
NEXT i
FOR i=1 TO 8 !横線
PLOT LINES:50,50*i; 450,50*i
NEXT i

!初期化
FOR i=1 TO 8
FOR j=1 TO 8
LET CEL(i,j)=0 !置いてない状態
NEXT j
NEXT i
LET CEL(4,4)=1 !白中央
LET CEL(5,5)=1
LET CEL(4,5)=-1 !黒中央
LET CEL(5,4)=-1



!今の局面を表示する
FOR i=1 TO 8
FOR j=1 TO 8
IF CEL(i,J)=1 THEN !白石があるなら
CALL plot_white(i,j,1)
END IF
IF CEL(i,J)=-1 THEN !黒石があるなら
CALL plot_white(i,j,0)
END IF
NEXT j
NEXT i


END

!石を描画する
EXTERNAL SUB plot_white(i,j,c)
CALL MAPPING(i,j, x,y) !マス目からXY座標に変換する
SET AREA COLOR colorindex(c,c,c) !白または黒
DRAW disk WITH SCALE(20)*SHIFT(x,y)
END SUB

!マス目番号からXY座標を求める
!横,縦 i,j、x,y
EXTERNAL SUB MAPPING(i,j, x,y)
LET x = i*50+25
LET y = j*50+25
END SUB

  │├盤をクリックしてゲームが可能です。 山中和義 2005/02/21 16:41:53  ツリーへ

Re: 表示部分だけですが、、、 返事を書く
山中和義 2005/02/21 16:41:53
盤をクリックしてゲームが可能です。
打てない場合のスキップがまだです。

!オセロゲーム

SET BITMAP SIZE 640,480 !画面サイズ640×480
SET WINDOW 0,640,0,480 !左下が原点。横がX、縦Y
SET COLOR mode "NATIVE" !RGB指定
SET TEXT font "",12 !文字サイズ

DIM CEL(8,8) !配置情報

!盤を表示する
SET AREA COLOR colorindex(0,1,0) !緑
PLOT AREA:50,50; 50,450; 450,450; 450,50
FOR i=1 TO 8 !行番号
PLOT TEXT ,AT 25,470-50*i:STR$(i)
NEXT i
FOR i=1 TO 8 !列番号
PLOT TEXT ,AT 20+50*i,460:CHR$(i+64)
NEXT i


!マス目を表示する
SET LINE COLOR colorindex(0,0,0) !黒
PLOT LINES:50,50; 50,450; 450,450; 450,50; 50,50
FOR i=1 TO 2
PLOT LINES:50-i,50-i; 50-i,450+i; 450+i,450+i; 450+i,50-i; 50-i,50-i
NEXT i

FOR i=1 TO 8 !縦線
PLOT LINES:50*i,50; 50*i,450
NEXT i
FOR i=1 TO 8 !横線
PLOT LINES:50,50*i; 450,50*i
NEXT i

!局面を初期化する
FOR i=1 TO 8
FOR j=1 TO 8
LET CEL(i,j) = 0 !置いてない状態
NEXT j
NEXT i
LET CEL(4,4) = 1 !白中央
LET CEL(5,5) = 1
LET CEL(4,5) = -1 !黒中央
LET CEL(5,4) = -1

LET flg = -1 !ゲーム中(黒の手)※-1は黒、1は白
CALL plot_now(CEL,flg) !今の局面を表示する

DO WHILE flg<>0 !※0は終了
!-----石が置けるかチェックする
LET ok = -1
DO WHILE ok<0 !はさんだ位置に置くまで
LET i=4
LET j=4
DO WHILE CEL(i,j)<>0 !空きマスをクリックするまで
LET i=-1
LET j=-1
DO WHILE i<1 OR i>8 OR j<1 OR j>8 !マス目の中をクリックするまで
MOUSE POLL x,y,left,right
DO WHILE left=0
MOUSE POLL x,y,left,right
LOOP
LET i = INT(x/50) !XY座標をマス目に変換する
LET j = INT((500-y)/50)
LOOP
LOOP
PRINT i;j !debug debug debug

CALL check2(CEL,i,j,flg, ok) !はさんでいるか確認する
LOOP
!-----はさんだ縦横斜めを反転させる
LET CEL(i,j) = flg !そこに石を埋める

!-----局面を表示する
LET flg = -flg !手を交代する
CALL plot_now(CEL,flg) !今の局面を表示する

WAIT DELAY 0.2
LOOP

END

  │└続き 山中和義 2005/02/21 16:42:35  ツリーへ

Re: 表示部分だけですが、、、 返事を書く
山中和義 2005/02/21 16:42:35
続き

!石を描画する
EXTERNAL SUB plot_stone(i,j,c)
CALL ij2xy(i,j, x,y) !マス目からXY座標に変換する
SET AREA COLOR colorindex(0,0,0) !黒の輪郭
DRAW disk WITH SCALE(21)*SHIFT(x,y)
SET AREA COLOR c !白または黒
DRAW disk WITH SCALE(20)*SHIFT(x,y)
END SUB

!マス目番号からXY座標を求める ※横,縦 i,j、x,y
EXTERNAL SUB ij2xy(i,j, x,y)
LET x = i*50+25
LET y = 450-j*50+25
END SUB

!今の局面を表示する
EXTERNAL SUB plot_now(CEL(,),stn)
LET n1=0 !白・黒の数
LET n2=0
FOR i=1 TO 8
FOR j=1 TO 8
IF CEL(i,J)=1 THEN !白石なら
CALL plot_stone(i,j,colorindex(1,1,1))
LET n1=n1+1
END IF
IF CEL(i,J)=-1 THEN !黒石なら
CALL plot_stone(i,j,colorindex(0,0,0))
LET n2=n2+1
END IF
NEXT j
NEXT i

SET AREA COLOR colorindex(1,1,1)
PLOT AREA:500,0;640,0;640,480;500,480

PLOT TEXT ,AT 500,300:"白:"&STR$(n1) !石の数を表示する
PLOT TEXT ,AT 500,275:"黒:"&STR$(n2)

IF n1+n2<64 THEN
IF stn=1 THEN !白なら
CALL plot_stone(10,2,colorindex(1,1,1))
ELSE
CALL plot_stone(10,2,0)
END IF
PLOT TEXT ,AT 560,370:"の番"
ELSE
PLOT TEXT ,AT 500,370:"おわり!"
LET stn = 0
END IF
END SUB

!指定したマスの石を得る
EXTERNAL FUNCTION get_cell(CEL(,),i,j)
LET get_cell = 0
IF i>0 AND i<9 AND j>0 AND j<9 THEN !マス内だけ
LET get_cell = CEL(i,j)
END IF
END FUNCTION

!はさんでいるか確認して、裏返す
EXTERNAL SUB check2(CEL(,),i,j,stn,ok)
LET check2 = -1

FOR dx=-1 TO 1 !横方向
FOR dy=-1 TO 1 !縦方向
IF dx=0 AND dy=0 THEN !8方向なら
ELSE
LET N = 0
LET s=i+dx !ひとつ隣へ
LET t=j+dy
LET AA = get_cell(CEL,s,t)
DO WHILE NOT(AA=0 OR AA=stn) !マス外か石がないか同じ色の石まで
IF AA=-stn THEN
LET N=N+1 !間に相手の石がある
END IF
LET s=s+dx !次のマス目へ
LET t=t+dy
LET AA = get_cell(CEL,s,t)
LOOP
IF AA=stn AND N>0 THEN !●○・・○●と●○・・○を区別する
LET ok = 1
CALL reverse(CEL,i,j,stn,N,dx,dy) !裏返す
END IF
END IF
NEXT dy
NEXT dx
END SUB

!裏返す(自分の石と同じ色にする)
EXTERNAL SUB reverse(CEL(,),i,j,stn,N,dx,dy)
LET s=i+dx !ひとつ隣へ
LET t=j+dy
FOR k=1 TO N
LET CEL(s,t) = stn
LET s=s+dx !次のマス目へ
LET t=t+dy
NEXT k
END SUB

  完成版を記載しておきます。。。 山中和義 2005/02/21 19:10:50  ツリーへ

Re: オセロゲームは作れますか? 返事を書く
山中和義 2005/02/21 19:10:50
完成版を記載しておきます。。。
左クリックで石を置き、右クリックでスキップします。

!オセロゲーム

SET BITMAP SIZE 640,480 !画面サイズ640×480
SET WINDOW 0,640,0,480 !左下が原点。横がX、縦Y
SET COLOR mode "NATIVE" !RGB指定
SET TEXT font "",12 !文字サイズ

DIM CEL(8,8) !配置情報

!盤を表示する
SET AREA COLOR colorindex(0,1,0) !緑
PLOT AREA:50,50; 50,450; 450,450; 450,50
FOR i=1 TO 8 !行番号
PLOT TEXT ,AT 25,470-50*i:STR$(i)
NEXT i
FOR i=1 TO 8 !列番号
PLOT TEXT ,AT 20+50*i,460:CHR$(i+64)
NEXT i


!マス目を表示する
SET LINE COLOR colorindex(0,0,0) !黒
PLOT LINES:50,50; 50,450; 450,450; 450,50; 50,50
FOR i=1 TO 2
PLOT LINES:50-i,50-i; 50-i,450+i; 450+i,450+i; 450+i,50-i; 50-i,50-i
NEXT i

FOR i=1 TO 8 !縦線
PLOT LINES:50*i,50; 50*i,450
NEXT i
FOR i=1 TO 8 !横線
PLOT LINES:50,50*i; 450,50*i
NEXT i

!局面を初期化する
FOR i=1 TO 8
FOR j=1 TO 8
LET CEL(i,j) = 0 !置いてない状態
NEXT j
NEXT i
LET CEL(4,4) = 1 !白中央
LET CEL(5,5) = 1
LET CEL(4,5) = -1 !黒中央
LET CEL(5,4) = -1

LET flg = -1 !ゲーム中(黒の手)※-1は黒、1は白
CALL plot_now(CEL,flg) !今の局面を表示する

DO WHILE flg<>0 !※0は終了
!-----石が置けるかチェックする
MOUSE POLL x,y,left,right
DO WHILE left=0 AND right=0 !クリックされたら
MOUSE POLL x,y,left,right
LOOP

IF left=1 AND right=0 THEN !左クリックなら
LET i = INT(x/50) !XY座標をマス目に変換する
LET j = INT((500-y)/50)
PRINT i;j !debug debug debug

IF i>0 AND i<9 AND j>0 AND j<9 THEN !マス目の中をクリックしたら
IF CEL(i,j)=0 THEN !空き位置を指定したら
CALL check2(CEL,i,j,flg, ok) !はさんでいるか確認し、縦横斜めを反転させる
IF ok>0 THEN !はさんだ位置に置いたら
LET CEL(i,j) = flg !そこに石を埋める
LET flg = -flg !手を交代する
END IF
END IF
END IF
END IF
IF left=0 AND right=1 THEN !右クリックなら
LET flg = -flg !手を交代する
END IF

!-----局面を表示する
CALL plot_now(CEL,flg) !今の局面を表示する

WAIT DELAY 0.2
LOOP

END

   ├続き 山中和義 2005/02/21 19:11:39  ツリーへ

Re: 完成版を記載しておきます。。。 返事を書く
山中和義 2005/02/21 19:11:39
続き


!石を描画する
EXTERNAL SUB plot_stone(i,j,c)
CALL ij2xy(i,j, x,y) !マス目からXY座標に変換する
SET AREA COLOR colorindex(0,0,0) !黒の輪郭
DRAW disk WITH SCALE(21)*SHIFT(x,y)
SET AREA COLOR c !白または黒
DRAW disk WITH SCALE(20)*SHIFT(x,y)
END SUB

!マス目番号からXY座標を求める ※横,縦 i,j、x,y
EXTERNAL SUB ij2xy(i,j, x,y)
LET x = i*50+25
LET y = 450-j*50+25
END SUB

!今の局面を表示する
EXTERNAL SUB plot_now(CEL(,),stn)
LET n1=0 !白・黒の数
LET n2=0
FOR i=1 TO 8
FOR j=1 TO 8
IF CEL(i,J)=1 THEN !白石なら
CALL plot_stone(i,j,colorindex(1,1,1))
LET n1=n1+1
END IF
IF CEL(i,J)=-1 THEN !黒石なら
CALL plot_stone(i,j,colorindex(0,0,0))
LET n2=n2+1
END IF
NEXT j
NEXT i

SET AREA COLOR colorindex(1,1,1)
PLOT AREA:500,0;640,0;640,480;500,480

PLOT TEXT ,AT 500,300:"白:"&STR$(n1) !石の数を表示する
PLOT TEXT ,AT 500,275:"黒:"&STR$(n2)

IF n1+n2<64 THEN
IF stn=1 THEN !白なら
CALL plot_stone(10,2,colorindex(1,1,1))
ELSE
CALL plot_stone(10,2,0)
END IF
PLOT TEXT ,AT 560,370:"の番"
ELSE
PLOT TEXT ,AT 500,370:"おわり!"
LET stn = 0
END IF
END SUB

!指定したマスの石を得る
EXTERNAL FUNCTION get_cell(CEL(,),i,j)
LET get_cell = 0
IF i>0 AND i<9 AND j>0 AND j<9 THEN !マス内だけ
LET get_cell = CEL(i,j)
END IF
END FUNCTION

!はさんでいるか確認して、裏返す
EXTERNAL SUB check2(CEL(,),i,j,stn,ok)
LET ok = -1
FOR dx=-1 TO 1 !横方向
FOR dy=-1 TO 1 !縦方向
IF dx=0 AND dy=0 THEN !8方向なら
ELSE
LET N = 0
LET s=i+dx !ひとつ隣へ
LET t=j+dy
LET AA = get_cell(CEL,s,t)
DO WHILE NOT(AA=0 OR AA=stn) !マス外か石がないか同じ色の石まで
IF AA=-stn THEN
LET N=N+1 !間に相手の石がある
END IF
LET s=s+dx !次のマス目へ
LET t=t+dy
LET AA = get_cell(CEL,s,t)
LOOP
IF AA=stn AND N>0 THEN !●○・・○●と●○・・○を区別する
LET ok = 1
CALL reverse(CEL,i,j,stn,N,dx,dy) !裏返す
END IF
END IF
NEXT dy
NEXT dx
END SUB

!裏返す(自分の石と同じ色にする)
EXTERNAL SUB reverse(CEL(,),i,j,stn,N,dx,dy)
LET s=i+dx !ひとつ隣へ
LET t=j+dy
FOR k=1 TO N
LET CEL(s,t) = stn
LET s=s+dx !次のマス目へ
LET t=t+dy
NEXT k
END SUB

   ├オセロの結果 会社員 2005/03/05 21:24:45  ツリーへ

Re: 完成版を記載しておきます。。。 返事を書く
会社員 2005/03/05 21:24:45
オセロの結果
白 1998(後手)
黒 1876(先手)
引き分け175
無効試合数474

山中和義さんありがとうございました。
まだ修正しないとダメなのですが、
(手番がないときの処理が、ある時間待った場合次に移るようなプログラムになっている)
後手やや有利という結果でした。

多分、オセロ特有の逆転裏返しがあるため、最後に
駒を打つ方が有利なのかもしれません。

-------------------------------------
!オセロゲーム
RANDOMIZE
!勝敗カウンタ
LET CNT_WHT=0
LET CNT_BLK=0
LET CNT_HKW=0

10
!初期設定
SET BITMAP SIZE 640,480 !画面サイズ640×480
SET WINDOW 0,640,0,480 !左下が原点。横がX、縦Y
SET COLOR mode "NATIVE" !RGB指定
SET TEXT font "",12 !文字サイズ
DIM CEL(8,8) !配置情報

!盤を表示する
SET AREA COLOR colorindex(0,1,0) !緑
PLOT AREA:50,50; 50,450; 450,450; 450,50
FOR i=1 TO 8 !行番号
PLOT TEXT ,AT 25,470-50*i:STR$(i)
NEXT i
FOR i=1 TO 8 !列番号
PLOT TEXT ,AT 20+50*i,460:CHR$(i+64)
NEXT i

!マス目を表示する
SET LINE COLOR colorindex(0,0,0) !黒
PLOT LINES:50,50; 50,450; 450,450; 450,50; 50,50
FOR i=1 TO 2
PLOT LINES:50-i,50-i; 50-i,450+i; 450+i,450+i; 450+i,50-i; 50-i,50-i
NEXT i

FOR i=1 TO 8 !縦線
PLOT LINES:50*i,50; 50*i,450
NEXT i
FOR i=1 TO 8 !横線
PLOT LINES:50,50*i; 450,50*i
NEXT i

!局面を初期化する
FOR i=1 TO 8
FOR j=1 TO 8
LET CEL(i,j) = 0 !置いてない状態
NEXT j
NEXT i
LET CEL(4,4) = 1 !白中央
LET CEL(5,5) = 1
LET CEL(4,5) = -1 !黒中央
LET CEL(5,4) = -1
!◇◇◇◇◇◇以上初期設定終了◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇

LET flg = -1 !ゲーム中(黒の手)※-1は黒、1は白
CALL plot_now(CEL,flg,CNT_WHT,CNT_BLK,CNT_HKW,MK_CNT) !今の局面を表示する

   ├続きです 会社員 2005/03/05 21:30:15  ツリーへ

Re: 完成版を記載しておきます。。。 返事を書く
会社員 2005/03/05 21:30:15
続きです
DO WHILE flg<>0 !※0は終了
LET i = INT(MOD(RND*1000000,8))+1
LET j = INT(MOD(RND*1000000,8))+1
PRINT i;j !debug debug debug
LET Wait_CNT= Wait_CNT+1

IF i>0 AND i<9 AND j>0 AND j<9 THEN !マス目の中をクリックしたら 1〜8の間
IF CEL(i,j)=0 THEN !空き位置を指定したら
CALL check2(CEL,i,j,flg, ok) !はさんでいるか確認し、縦横斜めを反転させる
IF ok>0 THEN !はさんだ位置に置いたら
LET CEL(i,j) = flg !そこに石を埋める
LET flg = -flg !手を交代する
LET Wait_CNT=0
END IF
END IF
END IF
! IF left=0 AND right=1 THEN !右クリックなら
IF Wait_CNT>1000 THEN !待ってもダメなら
LET flg = -flg !手を交代する
END IF
IF Wait_CNT>10000 THEN !待ってもダメなら
LET MK_CNT = MK_CNT+1 !無効試合
LET flg =0
END IF
!-----局面を表示する
IF Wait_CNT<100 THEN
CALL plot_now(CEL,flg,CNT_WHT,CNT_BLK,CNT_HKW,MK_CNT) !今の局面を表示する flg=0で終了
END IF
! WAIT DELAY 0.1
LOOP

WAIT DELAY 10

GOTO 10
END

!石を描画する
EXTERNAL SUB plot_stone(i,j,c)
CALL ij2xy(i,j, x,y) !マス目からXY座標に変換する
SET AREA COLOR colorindex(0,0,0) !黒の輪郭
DRAW disk WITH SCALE(21)*SHIFT(x,y)
SET AREA COLOR c !白または黒
DRAW disk WITH SCALE(20)*SHIFT(x,y)
END SUB

!マス目番号からXY座標を求める ※横,縦 i,j、x,y
EXTERNAL SUB ij2xy(i,j, x,y)
LET x = i*50+25
LET y = 450-j*50+25
END SUB

!今の局面を表示する
EXTERNAL SUB plot_now(CEL(,),stn,CNT_WHT,CNT_BLK,CNT_HKW,MK_CNT)
LET n1=0 !白・黒の数
LET n2=0
FOR i=1 TO 8
FOR j=1 TO 8
IF CEL(i,J)=1 THEN !白石なら
CALL plot_stone(i,j,colorindex(1,1,1))
LET n1=n1+1
END IF
IF CEL(i,J)=-1 THEN !黒石なら
CALL plot_stone(i,j,colorindex(0,0,0))
LET n2=n2+1
END IF
NEXT j
NEXT i

   └続きの続き 会社員 2005/03/05 21:32:11  ツリーへ

Re: 完成版を記載しておきます。。。 返事を書く
会社員 2005/03/05 21:32:11
続きの続き
SET AREA COLOR colorindex(1,1,1)
PLOT AREA:500,0;640,0;640,480;500,480
PLOT TEXT ,AT 500,300:"白:"&STR$(n1) !石の数を表示する
PLOT TEXT ,AT 500,275:"黒:"&STR$(n2) !石の数を表示する
PLOT TEXT ,AT 500,250:"白勝ち数:"&STR$(CNT_WHT) !白の勝ち数を表示する
PLOT TEXT ,AT 500,225:"黒勝ち数:"&STR$(CNT_BLK) !黒の勝ち数を表示する
PLOT TEXT ,AT 500,200:"引き分数:"&STR$(CNT_HKW) !黒の勝ち数を表示する
PLOT TEXT ,AT 500,175:"無効試合数:"&STR$(MK_CNT) !無効試合数を表示する
IF n1+n2<64 THEN !もし 64枚以下なら
IF stn=1 THEN !白なら
CALL plot_stone(10,2,colorindex(1,1,1))
ELSE
CALL plot_stone(10,2,0)
END IF
PLOT TEXT ,AT 560,370:"の番"
!もし 64枚以下でも
IF n1=0 THEN
PLOT TEXT ,AT 500,370:"おわり!黒勝!"
LET stn = 0
LET CNT_BLK=CNT_BLK+1
END IF
IF n2=0 THEN
PLOT TEXT ,AT 500,370:"おわり!白勝!"
LET stn = 0
LET CNT_WHT=CNT_WHT+1
END IF
ELSE !もし64を超えたらおわり
IF n1<n2 THEN
PLOT TEXT ,AT 500,370:"おわり!黒勝!"
LET stn = 0
LET CNT_BLK=CNT_BLK+1
END IF
IF n1>n2 THEN
PLOT TEXT ,AT 500,370:"おわり!白勝!"
LET stn = 0
LET CNT_WHT=CNT_WHT+1
END IF
IF n1=n2 THEN
PLOT TEXT ,AT 500,370:"引き分け!"
LET stn = 0
LET CNT_HKW=CNT_HKW+1
END IF
END IF
END SUB

!指定したマスの石を得る
EXTERNAL FUNCTION get_cell(CEL(,),i,j)
LET get_cell = 0
IF i>0 AND i<9 AND j>0 AND j<9 THEN !マス内だけ
LET get_cell = CEL(i,j)
END IF
END FUNCTION

!はさんでいるか確認して、裏返す
EXTERNAL SUB check2(CEL(,),i,j,stn,ok)
LET ok = -1
FOR dx=-1 TO 1 !横方向
FOR dy=-1 TO 1 !縦方向
IF dx=0 AND dy=0 THEN !8方向なら
ELSE
LET N = 0
LET s=i+dx !ひとつ隣へ
LET t=j+dy
LET AA = get_cell(CEL,s,t)
DO WHILE NOT(AA=0 OR AA=stn) !マス外か石がないか同じ色の石まで
IF AA=-stn THEN
LET N=N+1 !間に相手の石がある
END IF
LET s=s+dx !次のマス目へ
LET t=t+dy
LET AA = get_cell(CEL,s,t)
LOOP
IF AA=stn AND N>0 THEN !●○・・○●と●○・・○を区別する
LET ok = 1
CALL reverse(CEL,i,j,stn,N,dx,dy) !裏返す
END IF
END IF
NEXT dy
NEXT dx
END SUB

!裏返す(自分の石と同じ色にする)
EXTERNAL SUB reverse(CEL(,),i,j,stn,N,dx,dy)
LET s=i+dx !ひとつ隣へ
LET t=j+dy
FOR k=1 TO N
LET CEL(s,t) = stn
LET s=s+dx !次のマス目へ
LET t=t+dy
NEXT k
END SUB


インデックスへ EXIT
新規発言を反映させるにはブラウザの更新ボタンを押してください。