バッチファイル(オセロ005_石を置く処理_1)
■オセロのルールに基づき石を置いた時の裏返す処理を組んでみる。
オセロのプログラムを組む際に一番考えなければならないのがおそらくここ。
オセロのルールでは相手の石を裏返すことができない場所には置くことができない(当然、既に石が置かれているところにも置くことはできない)。
これから裏返すロジックを次のように考えてみる。
1. 石を置く場所には既に石が置いてあるか?
→ ある場合、もう一度入力を求める。
→ ない場合、2へ進む。
2. 石を置いたとき、その(上)に相手の石があるか?
→ ある場合、3へ進む。
→ ない場合、(上)を(右上)に変えて、もう一度2へ進む。
さらに、右、右下、下、左下、左、左上の順で同様にする。
3. 相手の石の方向の(1つ先)に自分の石があるか?
→ ある場合、挟んだ石の位置を記録する。
→ ない場合(スペースの場合)、2に戻り次の方向を調べる。
→ ない場合(相手の石の場合)、(2つ先)に変えて、もう一度3へ進む。
さらに3, 4, 5, 6つ先まで同様にする。
4. 挟んだ(記録された)石があるか?
→ ある場合、記録された石を裏返す。
→ ない場合、もう一度入力を求める
(相手の石を裏返すことができない場所には置くことができない)。
と、ここまで考えた後、いろいろ試してみたがバッチファイルではそもそもリストのような保存しておく入れものが使えないよう。リストが使えないので、試しに次のようなコードを作成してみた。行7列4, 行3列5など入力すると目的の石は裏返ったので、これをもとに考えていく。
ロジックとしては、裏返すことができる場合、必ず目的の方向に自身と同じ色の石があるはずなので、その場合に裏返す処理を行う。処理はif文で縦、横、斜めの8方向に対してそれぞれ組む。
長ったらしいコードになったけど、動かすこと優先で。
@echo off for /l %%n in (1,1,8) do ( for /l %%m in (1,1,8) do ( set array[%%n][%%m]=_ ) ) set array[4][4]=〇 set array[4][5]=● set array[5][4]=● set array[5][5]=〇 set array[6][5]=● set array[6][4]=● set array[4][3]=〇 set array[4][2]=〇 set array[4][1]=〇 set array[5][6]=〇 set array[5][7]=〇 set array[6][6]=〇 set array[6][7]=〇 set array[6][8]=〇 set array[7][5]=● set array[7][6]=● setlocal enabledelayedexpansion for /l %%n in (1,1,8) do ( echo !array[%%n][1]!!array[%%n][2]!!array[%%n][3]!!array[%%n][4]!!array[%%n][5]!!array[%%n][6]!!array[%%n][7]!!array[%%n][8]! ) set /P position="Player A: " set line=%position:~0,1% set row=%position:~-1% set array[%line%][%row%]=〇 setlocal enabledelayedexpansion for /l %%n in (1,1,8) do ( echo !array[%%n][1]!!array[%%n][2]!!array[%%n][3]!!array[%%n][4]!!array[%%n][5]!!array[%%n][6]!!array[%%n][7]!!array[%%n][8]! ) set checkcnt=1 :check set startline=%line% set startrow=%row% :checkline if %checkcnt%==1 ( set /a startline=startline-1 ) else if %checkcnt%==2 ( set /a startline=startline-1 set /a startrow=startrow+1 ) else if %checkcnt%==3 ( set /a startrow=startrow+1 ) else if %checkcnt%==4 ( set /a startline=startline+1 set /a startrow=startrow+1 ) else if %checkcnt%==5 ( set /a startline=startline+1 ) else if %checkcnt%==6 ( set /a startline=startline+1 set /a startrow=startrow-1 ) else if %checkcnt%==7 ( set /a startrow=startrow-1 ) else if %checkcnt%==8 ( set /a startline=startline-1 set /a startrow=startrow-1 ) else ( goto :update ) if !array[%startline%][%startrow%]!==_ ( set /a checkcnt=checkcnt+1 goto :check ) else if !array[%startline%][%startrow%]!==● ( goto :checkline ) else if !array[%startline%][%startrow%]!==〇 ( pause set /a linenum=1 if %checkcnt%==1 ( for /l %%n in (%startline%,1,%line%) do ( set array[%%n][%startrow%]=〇 ) ) else if %checkcnt%==2 ( setlocal enabledelayedexpansion for /l %%n in (%startline%,1,%line%) do ( set array[%%n][!startrow!]=〇 set /a startrow=startrow-1 ) ) else if %checkcnt%==3 ( for /l %%n in (%row%,1,%startrow%) do ( set array[%startline%][%%n]=〇 ) ) else if %checkcnt%==4 ( setlocal enabledelayedexpansion for /l %%n in (%startline%,-1,%line%) do ( set array[%%n][!startrow!]=〇 set /a startrow=startrow-1 ) ) else if %checkcnt%==5 ( for /l %%n in (%line%,1,%startline%) do ( set array[%%n][%startrow%]=〇 ) ) else if %checkcnt%==6 ( setlocal enabledelayedexpansion for /l %%n in (%startline%,-1,%line%) do ( set array[%%n][!startrow!]=〇 set /a startrow=startrow+1 ) ) else if %checkcnt%==7 ( for /l %%n in (%startrow%,1,%row%) do ( set array[%startline%][%%n]=〇 ) ) else if %checkcnt%==8 ( setlocal enabledelayedexpansion for /l %%n in (%startline%,1,%line%) do ( set array[%%n][!startrow!]=〇 set /a startrow=startrow+1 ) ) pause set /a checkcnt=checkcnt+1 goto :check ) :update setlocal enabledelayedexpansion for /l %%n in (1,1,8) do ( echo !array[%%n][1]!!array[%%n][2]!!array[%%n][3]!!array[%%n][4]!!array[%%n][5]!!array[%%n][6]!!array[%%n][7]!!array[%%n][8]! )