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