 |
|
 |
|
中高生のための 今から始めるプログラミング
05. 盤面に駒を置く |
最終更新日:2004/02/11
|
|
|
1 サブルーチンを作成
|
|
せっかくクリックした位置がわかるようになったのですから、そこに駒を置いてみたくなるのがスジというものです。この項では、指定された番地に駒を置くサブルーチン(put)を作りましょう。まずは普通にサブルーチン put を定義してください。
|
|
|
10 declare external sub main.format
20 declare external sub main.post
30 declare external sub main.put
......
!**************** サブルーチン ****************
1000 module main !モジュール定義
1010 public sub format
1020 public sub post
1030 public sub put
1100 share numeric w,r,pieces(0 to 7,0 to 7)
......
!---------------- ▽駒を置く ----------------
3000 external sub put(x,y)
3999 end sub
!---------------- △駒を置く ----------------
9999 end module
|
|
|
ただひとつ違うのが、今まで他のサブルーチンは何の引数も持っていなかったのに対して、put は引数 x, y を持っているということです。この引数は、external文で、サブルーチン名の後ろにカッコでくくって定義します。ここでは 3000行目でそうしています。定義ができましたら、メインルーチンで、クリックされたマスの番地を表示する代わりにサブルーチン put を呼び出すようにしてみましょう。270文のprint文を、
|
|
|
!**************** メインルーチン ****************
110 call format !formatを呼び出し
160 let w=40 !格子の幅
165 let left=0 !初期化
210 do until right=1
215 let left_=left !直前のマウスの左ボタンの状態
220 mouse poll mx,my,left,right !マウス位置を取得
230 if left=1 and left_=0 then
250 let x=int(mx/w)
260 let y=7-int(my/w)
270 call put(x,y) !putを呼び出し
289 end if
299 loop
999 end
|
|
|
と書き換えてください。
|
|
2 白駒を置く
|
|
さて、盤面に駒を置いてみるとなると、少し難しく聞こえるかもしれませんが、実はとても簡単です。なぜなら、与えられた盤面行列から盤面を画面に描画する処理は、先にサブルーチン post で作ってしまっているので、実際は盤面行列の値だけ変えるだけですむからです。この値を変える処理も、変える位置は駒を置くそこだけですから、1行で終わってしまいます。そこに post を呼び出すcall文を加えても2行ですむのです。ですから、追加する行は(コメントも含めれば)次の3つになりますね。
|
|
|
!---------------- ▽駒を置く ----------------
3000 external sub put(x,y)
3100 !駒を置く
3110 let pieces(y,x)=1 !(x,y)マス目の値を1(白駒)に
3120 call post
3999 end sub
!---------------- △駒を置く ----------------
|
|
|
ここで、pieces は2次配列ですから、縦が先に来ることに注意してください。また、ここでは置く駒は白駒のみです。交互に色を変えるには次の項を参考にしてください。
|
|
3 置く駒の色を交互に変える
|
|
さて、上では置ける駒は白駒のみでしたが、オセロは2人ゲームですから、白駒が置いたら次は黒駒が置けるようにならなければいけません。つまり、片方が置いたら、その手番を逆にしないといけないのです。これは、現在どちらの手番かを表す変数 p を用意して行います。まず、初期化の段階で先手の駒の色(白:1, 黒:-1)を p に代入します。そして駒を置く処理を行うたびに p の正負を逆転させます。これを繰り返せば、交互に駒を置いていることになるのです。では、実際にソースを書いてみましょう。
|
|
|
!**************** サブルーチン ****************
1000 module main !モジュール定義
1010 public sub format
1020 public sub post
1030 public sub put
1100 share numeric w,r,pieces(0 to 7,0 to 7),p
1200 !定数を定義
1210 let w=40 !格子の幅
1220 let r=13 !駒の半径
1230 let p=-1 !先手の駒の色
......
!---------------- ▽駒を置く ----------------
3000 external sub put(x,y)
3100 !駒を置く
3110 let pieces(y,x)=p !(x,y)マス目の値をpに
3120 call post
3130 let p=-p !駒の色を逆転
3999 end sub
!---------------- △駒を置く ----------------
9999 end module
|
|
|
オセロの公式ルールでは、先手は黒になっているので、ここでも初期化の段階で p の値は -1(黒) にしました。
|
|
|
ここまでのソースをダウンロード
|
|
|
|
|
 |
|
 |