バッチファイル(オセロ007_結果表示)

■結果表示を組んでみる。

前回までで石を置く処理をいれ、とりあえず最後まで石を置くことができたので、終わった後の結果表示を組んでみる。
プレイヤーA、Bともに置けなくなった状態になったとき、終了と判断させようかと考えたが、バッチファイルの中でいちいち置ける場所があるかどうか確認をするのも手間なので、次の2つの条件で終了にするようにした。
・手の数が60となったとき(はじめに置かれるの4マスを含めて64マス埋まったとき)
・プレイヤーAもBもパスしたとき
そのコードが下のもの。
条件が満たされたら、goto:resultで結果表示にとぶ。

(省略)
:trial
if %trialnum% gtr 60 (
goto :result
)

(省略)

if %position%==pass (
set /a turnchangeflag=turnchangeflag+1
if %turnchangeflag% gtr 1 (
goto :result
) else if %player%==A (
set player=B
) else if %player%==B (
set player=A
)
) else (
rem First and end character is used from input string
set line=%position:~0,1%
set row=%position:~-1%
)

(省略)

結果表示の処理は簡単に、64マスの中から白、黒の石の数をカウントして、その数を比較して結果を出力させるのみ。と思って、さらさら書いてたけど、結果の表示がうまくでない。括弧)の前に^(キャレットというらしい)が必要とのこと。
修正したコードとその結果が下のもの。

:result
set whitecnt=0
set blackcnt=0
for /l %%n in (1,1,8) do (
for /l %%m in (1,1,8) do (
if !array[%%n][%%m]!==〇 (
set /a whitecnt=whitecnt+1
) else if !array[%%n][%%m]!==● (
set /a blackcnt=blackcnt+1
)
)
)
if %whitecnt% gtr %blackcnt% (
echo Player A win (A:%whitecnt%, B:%blackcnt%^)
) else if %whitecnt% equ %blackcnt% (
echo Draw (A:%whitecnt%, B:%blackcnt%^)
) else if %whitecnt% lss %blackcnt% (
echo Player B win (A:%whitecnt%, B:%blackcnt%^)
)

これで一連の作業は終わり。
正しく入力していけばおそらく動くけど、文字列や空欄の入力した場合やどんな石の配置パターンでも正しく動くのかかなりあやしいと思う。次はそのテストを考えてみる。