.
中高生のための
今から始めるプログラミング
06. 駒が置けるか判定する その1
最終更新日:2004/02/11

<<BACK ↑HOME NEXT>>

 1  関数の作成
さて、前章で、実際に盤面上に駒が置けるようになったわけですが、どこをクリックしても見境なく駒が置けてしまいます。オセロにはきちんと駒が置ける位置を定めたルールがあり、
 
1. そこに他の駒がないこと。
2. そこに置いた自分の駒と他の位置の自分の駒で、縦、横、あるいは斜めから相手の駒を挟めること。
この2つが満たされていなければ駒をその位置に置くことはできません。この項では、その2つを判定する関数(check)を定義します。関数の定義は、普通のサブルーチンとほとんど変わりません。ただし、sub が function に置き換わります。
 
10 declare external sub main.format
20 declare external sub main.post
30 declare external sub main.put
40 declare external function main.check
  ......

!**************** サブルーチン ****************
1000 module main  !モジュール定義
1010 public sub format
1020 public sub post
1030 public sub put
1040 public function check
1100 share numeric w,r,pieces(0 to 7,0 to 7),p
  ......

!---------------- ▽置けるかどうか判定 ----------------
4000 external function check(x,y)

4999 end function
!---------------- △置けるかどうか判定 ----------------

9999 end module
引数 x,y は今まさに置こうとしているマスの位置です。
 

 2  置く位置に駒があるかないかを判定する
さて、まずは1つ目のルール、「そこに他の駒がないこと。」について判定してみましょう。もし他の駒があれば 0(置けない)を、なければ 1(置ける)を返すようにします。他の駒がその位置に「ない」ということは、その位置(x,y)における pieces(y,x) の値が 0 であることと一緒です。もし 1 や -1 であれば、これは白駒や黒駒が置いてあることになります。ですから、もし pieces(y,x) が 0 であれば 1 を、それ以外だったら 0 を返すようにすれば良いのです。
 
!---------------- ▽置けるかどうか判定 ----------------
4000 external function check(x,y)

4100 !他の駒があるかないか
4110 if pieces(y,x)=0 then
4120  let check=1
4130 else
4140  let check=0
4149 end if

4999 end function
!---------------- △置けるかどうか判定 ----------------
 

 3  駒を置く直前に判定を入れる
まず、他の駒があるかないかを判定するソースはできました。しかし、この関数はまだどこからも使われていません。せっかくこうして作った関数も、使われなければないのと同じです。この関数は駒を置けるか置けないか判定するものですから、実際に駒を置くサブルーチン put で使います。もし check の値が 0 なら置けないのですから、結局サブルーチン put は呼び出されても何もしなければ良いのです。つまり、サブルーチン put 内の、3110-3130行目を、
 
!---------------- ▽駒を置く ----------------
3000 external sub put(x,y)

3100 !駒を置く
3105 if check(x,y)=1 then
3110  let pieces(y,x)=p !(x,y)マス目の値をpに
3120  call post
3130  let p=-p !駒の色を逆転
3149 end if

3999 end sub
!---------------- △駒を置く ----------------
とはさめば、判定がされていることになりますね。尚、関数は、サブルーチンと違って call文を使わなくても呼び出すことができます。
 
ここまでのソースをダウンロード
 

<<BACK ↑HOME NEXT>>

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