.
中高生のための
今から始めるプログラミング
10. パスを判定する
最終更新日:2004/02/12

<<BACK ↑HOME NEXT>>

 1  現在の状態がパスか判定する
クリックすると原寸大で表示します。さて、今のままのソースでも普通にオセロをプレイすることは可能ですが、いくつかの特殊な場面でまだいくつかの不具合があります。例えば、白の手番になって、右のような盤面になった場合。この状態ではどこにも白駒を置くことができないので、どこをクリックしても反応しなくなってゲームが進まなくなってしまいます。本来なら、こういう状態になったら白はパスになるはずですが、現在のこのプログラムにはその機能がありません。そこで、本章では、パスの機能を追加します。
まずは、現在の状態がパスになるのか判定しましょう。パスになるのはどういうことかと言うと、つまり全てのマスに駒が置けなくなることです。ですから、全てのマスに対して check 関数をかけてしまえば良いのです。ここで注意してほしいのが、チェックするだけで実際に駒を裏返すわけではないので、check 関数の引数 mode の値は 0 にするということです。まず pass の値を 1 にしておき、全てのマスに check 関数をかけている間、もし関数の戻り値が 1 になった場合は変数 pass の値を 0 にしてループから抜け出し、0 であった場合は何もしないようにすれば、pass の 0 か 1 かがパスになるかならないかを表すことになります。0 であった場合に pass の値を 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

3200 !パスを判定する
3210 let pass=1
3220 for i=0 to 7
3230  for j=0 to 7
3240   if check(i,j,0)=1 then
3250    let pass=0
3259   end if
3269  next j
3279 next i

3300 !パスだった場合の処理
3310 select case pass
3320 case 0
3330  !何もしない
3400 case 1
3410  let p=-p !駒の色を逆転
3599 end select

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

 2  両者ともパスである場合
クリックすると原寸大で表示します。オセロでは、盤面全てが駒で埋まってしまったり、右図のように全て同色の駒になってしまったりなど、両者とも置けない、つまり両者ともパスとなった時点でゲーム終了となっています。これはどうやって判断するかと言うと、少し技巧的になります。1回目の判定では、pass の値は 0 か 1 でした。もし 0 なら両者ともパスではないので何もしないとして、1 なら pass の値を 1 増やして3220行目に戻ります。すると、今度は pass の値は 0 か 2 になります。もし 0 だったら先ほど書いたとおり何もしません。もし 2 ならば終了するようにします。こうすると、うまい具合にパスの判定ができるようになります。では、ソースを書いてみましょう。
 
3200 !パスを判定する
3210 let pass=0   !passの値を初期化
3215 let pass=pass+1 !passの値を1増やす
3220 for i=0 to 7
3230  for j=0 to 7
3240   if check(i,j,0)=1 then
3250    let pass=0
3259   end if
3269  next j
3279 next i

3300 !パスだった場合の処理
3310 select case pass
3320 case 0
3330  !何もしない
3400 case 1
3410  let p=-p !駒の色を逆転
3420  goto 3215 !一旦戻る
3500 case 2
3510  stop   !ゲーム終了
3599 end select
3210-3215行目は少し工夫してみました。1回目は pass が 1 に、2回目は pass が 2 になる仕組みです。さて、パスの判定までできるようになり、これでオセロのルールは全て網羅しました。ただ、ゲームを終了する時に、何も表示されないのは寂しいですよね。勝敗くらいは表示してほしいと思いませんか?そこで、次回はゲームを終了する時に勝敗を表示する方法について説明します。そして、感動の最終回です!!
 

<<BACK ↑HOME NEXT>>

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