バッチファイル(オセロ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