.
中高生のための
今から始めるプログラミング
05. 盤面に駒を置く
最終更新日:2004/02/11

<<BACK ↑HOME NEXT>>

 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(黒) にしました。
 
ここまでのソースをダウンロード
 

<<BACK ↑HOME NEXT>>

Copyright (C) 2003-2004 Shohei Ohsawa, Naoya Okada & Fumiya Miyakawa. All rights reserved.