バッチファイル(オセロ006_石を置く処理_2)
■オセロのルールに基づき石を置いた時の裏返す処理を組んでみる。
前回、石を裏返すロジックを考えたので、実際にオセロのプログラムに組み込んでみた。
問題が起きたら、直してまた試してを繰り返しながら、何とか64のマスが埋まるまで動くことを確認。1ゲーム分しか確認していないので、エラーになるような置き方があるかも・・・。
確認しているとき「最大 setlocal 再帰レベルに到達しました。」とコメントが出てきたけど、バッチファイルは動き続けていたので、そのまま確認。
さすがにこのままは見栄えが悪いけど。
修正したプログラムは下のもの。
:trial以下で、プレイヤーA、Bの入力を受け付け。
石が既に置かれている、8行を超える位置などフィールドの外になったら、:trialに戻って再度入力受け付け。
:check以下で、置いた石の位置の縦、横、斜めをチェック。
縦、横、斜めは、checkcntの数値とif文で決める。
:checkline以下で、相手側の石があった場合にさらにその一つ先の石を見るような形。
opponentstonenumやturnchangeflagで挟んだ石があるか、相手の番に変更できるかを判断するフラグを設定。
石を置く位置に対して縦、横、斜めのスペース、白石、黒石の状態を見ているので、1行、1列目など端に置いたときバッチファイルが止まった。0行、1列目などもスペースの設定が必要なので、初期設定の範囲を1-8から0-9に変更した。
石の処理が一応できたので、後は、結果を表示させるところで形は整うかな。
@echo off echo Start Othello set line = 0 set row = 0 rem /l:optional symbol, %%n:variable within for code、(1,1,8):(start number, increase, end number) rem initial setting on field, stone (white:〇, black:●), space:_ rem ============================== for /l %%n in (0,1,9) do ( for /l %%m in (0,1,9) do ( set array[%%n][%%m]=_ ) ) set array[4][4]=〇 set array[4][5]=● set array[5][4]=● set array[5][5]=〇 rem ============================== rem Display field rem echo makes newline, one line is displayed after combining strings rem ============================== 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]! ) rem ============================== set num=1 set player=A rem Player A and B place stone. When trial is finished, Player is set to 0. rem ============================== :trial 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]! ) if %player%==A ( set /P position="Player A: " ) else if %player%==B ( set /P position="Player B: " ) else ( set player=0 ) rem First and end character is used from input string set line=%position:~0,1% set row=%position:~-1% rem Check if stone is placed within the field if %line% gtr 8 ( echo Input again goto :trial ) if %row% gtr 8 ( echo Input again goto :trial ) if %line% lss 1 ( echo Input again goto :trial ) if %row% lss 1 ( echo Input again goto :trial ) rem Check if stone is already placed on the position if not !array[%line%][%row%]!==_ ( echo Input again goto :trial ) set checkcnt=1 set turnchangeflag=0 :check set startline=%line% set startrow=%row% set opponentstonenum=0 :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 ( if %turnchangeflag%==1 ( if %player%==A ( set player=B ) else if %player%==B ( set player=A ) ) goto :trial ) if %player%==A ( if !array[%startline%][%startrow%]!==_ ( set /a checkcnt=checkcnt+1 goto :check ) else if !array[%startline%][%startrow%]!==● ( set /a opponentstonenum=opponentstonenum+1 goto :checkline ) else if !array[%startline%][%startrow%]!==〇 ( if %opponentstonenum% geq 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 ) ) set turnchangeflag=1 ) set /a checkcnt=checkcnt+1 goto :check ) ) if %player%==B ( if !array[%startline%][%startrow%]!==_ ( set /a checkcnt=checkcnt+1 goto :check ) else if !array[%startline%][%startrow%]!==〇 ( set /a opponentstonenum=opponentstonenum+1 goto :checkline ) else if !array[%startline%][%startrow%]!==● ( if %opponentstonenum% geq 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 ) ) set turnchangeflag=1 ) set /a checkcnt=checkcnt+1 goto :check ) ) :result