TDJの隠れ家♪ トップ>HSP >Scripts>オセロ

オセロ

とりあえずソースを書きます。
ソースのダウンロード
osero.hsp
2.hsp

#include "hspda.as"

とりあえず、HSPDAをインクルードします。
(あとで手の評価をするときに必要になります)

*index
screen 0,400,300 : mes "オセロ" : button"START",*a_set
mes "CPU対戦" : button"START",*go
stop

これは最初の画面です。
2人でやるか、CPU対戦をするか選択します。

*go
#include "2.hsp"
stop

CPU対戦バージョンをインクルードします。

*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

プレイヤーがパスを選択したときに、CPUに順番を回します。

*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マスずつ進んでいき、
何も無い所か端にぶつかれば終わり、
敵の色にぶつかればそのまま進み、
自分の色にぶつかったら戻ります。
戻りながら敵の色を自分の色に変えていきます。
そうすることで色を変えていくのです。