バッチファイル(オセロ004_プレイヤーの入力)

■オセロのプレイヤーが石を置く際のコードを組んでみる。

バッチファイルでは入力はset /Pを記述するだけでできる。
set /P position="Player A: "
として入力を受け付ける。if文を使ってプレイヤーAとBの入力待ちの表示を使い分ける。

上の文で入力内容をpositionに変数として入れた後、文字列操作で縦の位置、横の位置をえる。やり方はいろいろあると思うけど、縦、横8ケタずつまでなので、始めの1文字と最後の1文字を縦の位置、横の位置として取り出す。それが下の文。
set line=%position:~0,1%
set row=%position:~-1%
ここで%position:~0,1%は、1文字目(0番)から1文字を取得、%position:~-1%は、後ろから1文字を取得。if文もfor文と同じく、完了しないとsetの内容が反映されないようなので、まめにif文を閉じてsetが入らないようにする。(上の文字列操作をset /Pの入力とともにif文に入れたらうまくいかなかった)

echoを使って文字が正しく入っているか確認しながら、入力した位置にプレイヤーがAなら白、Bなら黒を入れる。
set array[%line%][%row%]=〇
入力がうまくいっているか、表示させた結果が下のもの。

まだ石を置くルールの処理を行っていないので、どこにも置ける状態。

これを繰り返すために、goto文を使ってみる。バッチファイルでは、上から処理が行われていくが、gotoの行にいった後は、goto の後ろに書いた位置にとぶ処理。
:trial
(入力処理の記述)
goto :trial
つまり、プレイヤーがAの時、Bの時にtrialの中の処理を繰り返し、ゲーム展開していく。よく考えたら、プレイヤーAでもBでも無い終了の条件を満たしたときにプレイヤーCのようにして、このgotoから抜けるようにできるかな。
終了の条件は、フィールドで石が埋まった場合を含め、どちらのプレイヤーも石を置くことができない場合でいいと思う。

今のコードは下のような感じ(ここでは繰り返し3,4回でtrialから出るようにしている。)

@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 (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]=〇
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
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%

echo %line%
echo %row%

if %player%==A (
set array[%line%][%row%]=〇
set player=B
) else if %player%==B (
set array[%line%][%row%]=●
set player=A
) else (
set player=0
)

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 /a num=num+1
if %num% geq 4 (
goto :result
)

goto :trial
:result
echo sample