オセロ
ソースのダウンロード
osero.hsp
2.hsp
#include "hspda.as"
(あとで手の評価をするときに必要になります)
*index
screen 0,400,300 : mes "オセロ" : button"START",*a_set
mes "CPU対戦" : button"START",*go
stop
2人でやるか、CPU対戦をするか選択します。
*go
#include "2.hsp"
stop
*a_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
実はボードを一回り大きめに取ってあり、端を示す3を代入します。
buffer 1,,, : picload "chip1.bmp" : buffer 2,,, : picload "chip2.bmp" : buffer 3,,, : picload "chip3.bmp"
player=2 ;プレイヤー変数
point1=2
gsel 0
;メインループ
*a_main
cls
gosub *a_scan
gosub *a_check
if point1 ! point1a : gosub *a_change
pos 300,30 : mes "白:"+point2 : mes "黒:"+point1
if player=2 : mes "白の番です" : else : mes "黒の番です"
button "パス",*a_pass
goto *a_click
ここからいろいろな指示を出します。
*a_pass
if player=2 : player=1 : else : player=2
goto *a_main
*a_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
このとき同時に、両者の得点も求めます。
*a_change ;プレイヤーチェンジ
point1=point1a
if player=2 : player=1 : else : player=2
return
*a_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
置けるならば1が代入されます。
*a_click
repeat
stick k : if k=256 : break
wait 1
loop : goto *a_click2
*a_click2
if (mousex<300)&(mousey<300):goto *a_click3 : else : goto *a_click
*a_click3
if chip2(mousex/30,mousey/30)=1:{
mx=mousex/30 : my=mousey/30
goto *a_reverse1}
else : goto *a_click
*a_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 *a_main
内容は、全方位(8方向)を全て1マスずつ進んでいき、
何も無い所か端にぶつかれば終わり、
敵の色にぶつかればそのまま進み、
自分の色にぶつかったら戻ります。
戻りながら敵の色を自分の色に変えていきます。
そうすることで色を変えていくのです。