!!!{{category SOS2改造}}乱数ロールプログラム !!概要 TRPGではダイスを振ることをロールすると言います。 というわけで乱数支援用のルーチンを2つ用意してみました。 :ランダムロール: これは単に乱数を発生するだけですが、サブルーチン化すると便利……かもしれません。 少し多機能になっています。 :ダイスロール: これは何面体ダイスを何回ロールしたか、という結果を出すことが出来ます。 洋ゲーやTRPG、某所Shattered Legacyなどで多用されている手法です:) !!ランダムロール !サブルーチン sub rnd_roll { $Roll = int(rand($_[0] - $_[2])) + $_[1]; $Roll -= $_[3]; $Roll = 0 if $Roll < 0; # 戻り値の最低値を 0 と指定 $Roll = $_[1] if $_[1] && $Roll < $_[1]; # $b が代入された場合、その値を最低値と指定 return($Roll); } !リクワイア $scalar = &rnd_roll($a,$b,$c,$d); !使い方 上記のリクワイアを記述することで実行します。 まず、各変数の説明が以下のようになります―― ,変数,説明 ,$scalar,発生した乱数が戻り値として代入されます。 ,$a,乱数の分母です。 ,$b,戻り値に+する数値です。 ,$c,乱数の分母から−させる数値(分母ボーナス)です。 ,$d,乱数の結果から−させる数値(分子ボーナス)です。 !注意 戻り値の最低値は 0 と指定しています。 $b が代入された場合、その値を最低値と指定しています。 サブルーチン内のコメントアウトを参照してください。 !ケーススタディ $a = 100; only $scalar = 0 〜 99; $a = 100; $b = 1; $scalar = 1 〜 100; $a = 100; $b = 1; $c = 50; $scalar = 1 〜 50; $a = 100; $d = 50; $scalar = 0 〜 49; $a = 100; $b = 10; $d = 100; $scalar = 10 〜 10; !!ダイスロール !サブルーチン sub dice_roll { if (!$_[0] || !$_[1]) { return('0') } $Dice = $Roll = 0; while ($Dice < $_[0]) { $Roll += int(rand($_[1])); $Roll ++; $Dice ++; } $Roll += $_[2]; return($Roll); } !リクワイア $scalar = &dice_roll($a,$b,$c); !使い方 上記のリクワイアを記述することで実行します。 まず、各変数の説明が以下のようになります―― ,変数,説明 ,$scalar,発生した乱数が戻り値として代入されます。 ,$a,ダイスをロールする回数です ,$b,ダイスの種類です、$b面体ダイスという意味です。 ,$c,ボーナス値を設定できます。 !ケーススタディ ショートソード(1D6) $scalar = &dice_roll(1,6); $scalar = 1 〜 6; ロングソード+1(1D8+1) $scalar = &dice_roll(1,8,1); $scalar = 2 〜 9; カシナートの剣(1D3+9) $scalar = &dice_roll(1,3,9); $scalar = 10 〜 12;