 |
|
 |
|
中高生のための 今から始めるプログラミング
09. 駒を裏返す |
最終更新日:2004/02/11
|
|
|
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 にすれば裏返すこともできるようになるのです。では、実行してみてください。駒も裏返せるようになり、ますます本物のオセロに近づいてきました。もちろん、この状態で既にゲームをプレイすることもできます。ここで要の部分は終わりで、次章からは細かい機能を少しづつ追加していくようになります。
|
|
|
ここまでのソースをダウンロード
|
|
|
|
|
 |
|
 |