バッチファイルの用途といえば、作業の自動化という印象ですが、実はバッチファイルで乱数を生成することもできます。これにより、簡単なゲームを作ることも出来ます。
この記事では、バッチファイルで乱数を生成する方法と、乱数を使用したじゃんけんゲームのサンプルコードを紹介します。
乱数の生成方法
環境変数 %RANDOM% を使用します。この環境変数は、0から32767までの範囲でランダムな整数を返します。
サンプルコード
以下のバッチファイルは、1から10までの乱数を生成します。
@echo off
set /a randNum=%RANDOM% %% 10 + 1
echo %randNum%
pause
このコードでは、%RANDOM% によって生成された乱数を10で割った余りを求め(これにより0から9の範囲の数値が得られる)、そこに1を加えて1から10の範囲の乱数を生成しています。
応用例:じゃんけんゲーム
バッチファイルの乱数を利用したじゃんけんゲームのサンプルコードです。
@echo off
setlocal
:gameStart
echo.
echo じゃんけんをしましょう!
echo 1: グー 2: チョキ 3: パー
echo.
rem 入力なしでEnter押された場合の対策
set playerChoice=0
rem プレイヤーの手
:inputHand
set /p playerChoice="あなたの手を選んでください(1-3): "
if "%playerChoice%"=="1" (
set playerHand=グー
) else if "%playerChoice%"=="2" (
set playerHand=チョキ
) else if "%playerChoice%"=="3" (
set playerHand=パー
) else (
goto inputHand
)
echo.
echo あなたの手: %playerHand%
rem コンピュータの手はランダム
set /a compChoice=%RANDOM% %% 3 + 1
if %compChoice%==1 set compHand=グー
if %compChoice%==2 set compHand=チョキ
if %compChoice%==3 set compHand=パー
echo コンピュータの手: %compHand%
echo.
rem judgeとプレイヤーの手を結合したラベルに飛ぶ
goto judge%playerChoice%
rem プレイヤーの手がグーの場合
:judge1
if %compChoice%==1 echo 引き分けです
if %compChoice%==2 echo あなたの勝ちです!
if %compChoice%==3 echo あなたの負けです…
goto askPlayAgain
rem プレイヤーの手がチョキの場合
:judge2
if %compChoice%==1 echo あなたの負けです…
if %compChoice%==2 echo 引き分けです
if %compChoice%==3 echo あなたの勝ちです!
goto askPlayAgain
rem プレイヤーの手がパーの場合
:judge3
if %compChoice%==1 echo あなたの勝ちです!
if %compChoice%==2 echo あなたの負けです…
if %compChoice%==3 echo 引き分けです
goto askPlayAgain
rem もう一度遊ぶかをプレイヤーに質問する
:askPlayAgain
echo.
set /p playAgain="もう一度遊びますか? (y/n): "
if /i "%playAgain%"=="y" goto gameStart
if /i "%playAgain%"=="n" goto end
goto askPlayAgain
rem 終了
:end
endlocal
実行結果
バッチファイルの乱数の特徴と注意点
バッチファイルの乱数は、バッチファイルの実行の仕方によって動作が異なるため注意が必要です。
実験用のバッチファイル
環境変数 %RANDOM% の値をそのまま表示するバッチファイルを使用し、どのような値が生成されているかを調べます。
@echo off
echo %RANDOM%
pause
バッチファイルをダブルクリックした場合
得られる数値は、順番に大きくなる傾向でした。ランダム値というよりはシリアル値です。
コマンドラインから実行の場合
得られる数値は、増減します。
実験結果からの推測
ダブルクリックの結果より、コンソール起動後の初回に取得される %RANDOM% の値は、システムが起動してからの時間などのシリアル値(の末尾)ではないかと推測します。
また、同一のコンソールから複数回 %RANDOM% を使用する場合、初回はシリアル値だが、2回目以降は乱数っぽく値が増減する。これは、同じコンソールで %RANDOM% を複数回使用する場合、前回の %RANDOM% の値を次回のシード(種)にするなどの工夫がされているためと思われる。
バッチファイルの乱数の注意点
バッチファイルの環境変数 %RANDOM% は、得たい値域により使い方を工夫する必要がありそうです。
じゃんけんゲームの1~3など、値域が狭い場合は、得られる値がたとえシリアル値であったとしても、その値の剰余をとることによりランダムな値を得ることができるため、問題は無さそうです。
一方で、0~1万など、値域が広い乱数を得たい場合は、初回の %RANDOM% がシリアル値であることが悪影響を及ぼしそうです。この場合は、%RANDOM% を1回空読みして2回目から使用するなどとすれば、乱数らしく使える可能性はありそうです。
まとめ
本記事では、バッチファイルで乱数を生成する方法と、その使用例を紹介しました。また、バッチファイルの乱数の特徴についても紹介しました。乱数の値が大きく増減することを期待する処理を書く場合は、初回の %RANDOM% を読み飛ばすなど工夫が必要と思われます。