オセロ続き
2.hsp
*set ;諸設定
dim chip,10,10 ;ボードを設定 一つ目横 二つ目縦
;0無し 1黒 2白 3端
dim chip2,10,10 ;仮想ボードを設定
c=0 ;カウント用変数
repeat 10
chip(0,c)=3 : chip(9,c)=3 : c+=1
loop
c=1
repeat 9
chip(c,0)=3 : chip(c,9)=3 : c+=1
loop
chip(4,4)=2 : chip(4,5)=1 : chip(5,4)=1 : chip(5,5)=2
buffer 1,,, : picload "chip1.bmp" : buffer 2,,, : picload "chip2.bmp" : buffer 3,,, : picload "chip3.bmp"
player=2 ;プレイヤー変数
point1=2
gsel 0
;メインループ
*main
cls
gosub *scan : gosub *check
if point1 ! point1a : gosub *change
pos 300,30 : mes "白:"+point2 : mes "黒:"+point1
if player=2 : mes "あなたの番です" : else : mes "CPUの番です"
button "パス",*pass
if player=1 : goto *cpu
goto *click
*pass
if player=2 : player=1 : else : player=2
goto *main
プレーヤー変数の値を入れ替えます。
*check ;ボードを作成
c=1 : point1a=0 : point2=0
repeat 8 : c1=1
repeat 8
if chip(c,c1)=0 : pos 30*c,30*c1 : gcopy 1
if chip(c,c1)=1 : pos 30*c,30*c1 : gcopy 2 : point1a+=1
if chip(c,c1)=2 : pos 30*c,30*c1 : gcopy 3 : point2+=1
c1+=1
loop : c+=1
loop : return
*change ;プレイヤーチェンジ
point1=point1a
if player=2 : player=1:else : player=2
return
*cpu
dim count,100
;dim chip3,10,10
c=0 : c1=0 : ka=0
*checkloop
if chip2(c,c1)=1 : gosub *think
c1+=1 : if c1=10 : c1=0 : c+=1
if c=10 : goto *loopend
ka+=1
goto *checkloop
*think
x=1 : n=0
repeat ;1
if (chip(c+x,c1)=0)|(chip(c+x,c1)=3) : break
if chip(c+x,c1)=player:{
n=x-1
if n<=0:break
;chip(c,c1)=player
count(ka)+=1
repeat n
;chip(c+n,c1)=player
count(ka)+=1
n-=1
loop : break}
x+=1
loop
x=1 : n=0
repeat ;2
if (chip(c-x,c1)=0)|(chip(c-x,c1)=3) : break
if chip(c-x,c1)=player:{
n=x-1
if n<=0:break
;chip(c,c1)=player
count(ka)+=1
repeat n
;chip(c-n,c1)=player
count(ka)+=1
n-=1
loop : break}
x+=1
loop
x=1 : n=0
repeat ;3
if (chip(c+x,c1+x)=0)|(chip(c+x,c1+x)=3) : break
if chip(c+x,c1+x)=player:{
n=x-1
if n<=0:break
;chip(c,c1)=player
count(ka)+=1
repeat n
;chip(c+n,c1+n)=player
count(ka)+=1
n-=1
loop : break}
x+=1
loop
x=1 : n=0
repeat ;4
if (chip(c-x,c1+x)=0)|(chip(c-x,c1+x)=3) : break
if chip(c-x,c1+x)=player:{
n=x-1
if n<=0:break
;chip(c,c1)=player
count(ka)+=1
repeat n
;chip(c-n,c1+n)=player
count(ka)+=1
n-=1
loop : break}
x+=1
loop
x=1 : n=0
repeat ;5
if (chip(c-x,c1-x)=0)|(chip(c-x,c1-x)=3) : break
if chip(c-x,c1-x)=player:{
n=x-1
if n<=0:break
;chip(c,c1)=player
count(ka)+=1
repeat n
;chip(c-n,c1-n)=player
count(ka)+=1
n-=1
loop : break}
x+=1
loop
x=1 : n=0
repeat ;6
if (chip(c+x,c1-x)=0)|(chip(c+x,c1-x)=3) : break
if chip(c+x,c1-x)=player:{
n=x-1
if n<=0:break
;chip(c,c1)=player
count(ka)+=1
repeat n
;chip(c+n,c1-n)=player
count(ka)+=1
n-=1
loop : break}
x+=1
loop
x=1 : n=0
repeat ;7
if (chip(c,c1+x)=0)|(chip(c,c1+x)=3) : break
if chip(c,c1+x)=player:{
n=x-1
if n<=0:break
;chip(c,c1)=player
count(ka)+=1
repeat n
;chip(c,c1+n)=player
count(ka)+=1
n-=1
loop : break}
x+=1
loop
x=1 : n=0
repeat ;8
if (chip(c,c1-x)=0)|(chip(c,c1-x)=3) : break
if chip(c,c1-x)=player:{
n=x-1
if n<=0:break
;chip(c,c1)=player
count(ka)+=1
repeat n
;chip(c,c1-n)=player
count(ka)+=1
n-=1
loop : break}
x+=1
loop
return
*loopend
c=0
sortval count,1
sortget max,0
repeat
if max>10 : max-=10 : c+=1 :else : break
loop
wait 50
if count.0=0 : goto *pass
mx=c : my=max : goto *reverse1
*scan ;チップが置けるかどうか
dim chip2,10,10
c=1
repeat 8 : c1=1
repeat 8 : n=1
repeat 2
if (chip(c,c1)=n)&(chip(c,c1+1)=0) : chip2(c,c1+1)=1
if (chip(c,c1)=n)&(chip(c,c1-1)=0) : chip2(c,c1-1)=1
if (chip(c,c1)=n)&(chip(c+1,c1+1)=0) : chip2(c+1,c1+1)=1
if (chip(c,c1)=n)&(chip(c-1,c1+1)=0) : chip2(c-1,c1+1)=1
if (chip(c,c1)=n)&(chip(c-1,c1-1)=0) : chip2(c-1,c1-1)=1
if (chip(c,c1)=n)&(chip(c+1,c1)=0) : chip2(c+1,c1)=1
if (chip(c,c1)=n)&(chip(c-1,c1)=0) : chip2(c-1,c1)=1
if (chip(c,c1)=n)&(chip(c+1,c1-1)=0) : chip2(c+1,c1-1)=1
n+=1
loop : c1+=1
loop : c+=1
loop : return
*click
repeat
stick k : if k=256 : break
wait 1
loop : goto *click2
*click2
if (mousex<300)&(mousey<300):goto *click3 : else : goto *click
*click3
if chip2(mousex/30,mousey/30)=1:{
mx=mousex/30 : my=mousey/30
goto *reverse1}
else : goto *click
*reverse1 ;裏返しチェック
x=1 : n=0
repeat ;1
if (chip(mx+x,my)=0)|(chip(mx+x,my)=3) : break
if chip(mx+x,my)=player:{
n=x-1
if n<=0:break
chip(mx,my)=player
repeat n
chip(mx+n,my)=player : n-=1
loop : break}
x+=1
loop
x=1 : n=0
repeat ;2
if (chip(mx-x,my)=0)|(chip(mx-x,my)=3) : break
if chip(mx-x,my)=player:{
n=x-1
if n<=0:break
chip(mx,my)=player
repeat n
chip(mx-n,my)=player
n-=1
loop : break}
x+=1
loop
x=1 : n=0
repeat ;3
if (chip(mx+x,my+x)=0)|(chip(mx+x,my+x)=3) : break
if chip(mx+x,my+x)=player:{
n=x-1
if n<=0:break
chip(mx,my)=player
repeat n
chip(mx+n,my+n)=player : n-=1
loop : break}
x+=1
loop
x=1 : n=0
repeat ;4
if (chip(mx-x,my+x)=0)|(chip(mx-x,my+x)=3) : break
if chip(mx-x,my+x)=player:{
n=x-1
if n<=0:break
chip(mx,my)=player
repeat n
chip(mx-n,my+n)=player : n-=1
loop : break}
x+=1
loop
x=1 : n=0
repeat ;5
if (chip(mx-x,my-x)=0)|(chip(mx-x,my-x)=3) : break
if chip(mx-x,my-x)=player:{
n=x-1
if n<=0:break
chip(mx,my)=player
repeat n
chip(mx-n,my-n)=player : n-=1
loop : break}
x+=1
loop
x=1 : n=0
repeat ;6
if (chip(mx+x,my-x)=0)|(chip(mx+x,my-x)=3) : break
if chip(mx+x,my-x)=player:{
n=x-1
if n<=0:break
chip(mx,my)=player
repeat n
chip(mx+n,my-n)=player : n-=1
loop : break}
x+=1
loop
x=1 : n=0
repeat ;7
if (chip(mx,my+x)=0)|(chip(mx,my+x)=3) : break
if chip(mx,my+x)=player:{
n=x-1
if n<=0:break
chip(mx,my)=player
repeat n
chip(mx,my+n)=player : n-=1
loop : break}
x+=1
loop
x=1 : n=0
repeat ;8
if (chip(mx,my-x)=0)|(chip(mx,my-x)=3) : break
if chip(mx,my-x)=player:{
n=x-1
if n<=0:break
chip(mx,my)=player
repeat n
chip(mx,my-n)=player : n-=1
loop : break}
x+=1
loop
goto *main
見た通り、非常に無駄が多いスクリプトとなっております。
いくらでも改善の余地はあると思いますが、こんな考え方もあるのだと、割り切って見てください。