.
中高生のための
今から始めるプログラミング
09. 駒を裏返す
最終更新日:2004/02/11

<<BACK ↑HOME NEXT>>

 1  関数の改造
さて、オセロの一番要の部分のなるのが駒を裏返すことです。オセロではこれがないと対戦ができませんね。では、オセロで駒を裏返すサブルーチンをまた一から作りましょう。…とは今回は言わないのです。これは、駒を置けるかチェックする関数 check を少し改造するだけでできます。これからは関数 check を駒を置けるかの判定と、駒の裏返しの両方に用いますので、それぞれを2つのモードに分けましょう。関数の引数に、mode を追加し、0 ならば駒を置けるかチェックし、1 ならば駒を裏返します。まずは、引数を追加してみましょう。
 
!---------------- ▽駒を置く ----------------
3000 external sub put(x,y)

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

3999 end sub
!---------------- △駒を置く ----------------

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

4999 end function
!---------------- △置けるかどうか判定 ----------------
引数を追加するのに伴なって、呼び出す側も変えなければなりません。ここでは、裏返せるかチェックすると同時に駒を裏返してしまおうと言う考えです。
 

 2  駒を裏返す
駒を裏返すのは、実はとても簡単です。まず、ある方向に挟めるかどうか探していって、もし自分の色が見つかったら、駒を置く位置からそこまでを自分の色に変えれば良いのです。つまり、自分の色が見つかった時点の i の値に対して、(x,y) から (y+ty*i,x+tx*i) までの値を自分の色にします。つまり、
 
4400   case is>=2 !その方向にある自分の駒を探す
4500    if pieces(y+ty*i,x+tx*i)=p then !自分の駒の場合
4510     let check=1
4520     if mode=1 then !modeが1のときに駒を裏返す
4530      for k=0 to i
4540       let pieces(y+ty*k,x+tx*k)=p
4549      next k
4559     end if
4590     goto 4899 !処理を終了
4599    end if
4600    if pieces(y+ty*i,x+tx*i)=0 then !空きマスの場合
4690     goto 4899 !処理を終了
4699    end if
4700    !(相手の駒の場合は何もせず次に進むので省略)
クリックすると原寸大で表示します。とすれば良いのです。もちろん、mode が 0 のときには 4520-4559行目は実行されません。ですから、mode を 0 にすればチェックだけができて、1 にすれば裏返すこともできるようになるのです。では、実行してみてください。駒も裏返せるようになり、ますます本物のオセロに近づいてきました。もちろん、この状態で既にゲームをプレイすることもできます。ここで要の部分は終わりで、次章からは細かい機能を少しづつ追加していくようになります。
 
ここまでのソースをダウンロード
 

<<BACK ↑HOME NEXT>>

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