トップ 新規 編集 差分 一覧 Farm ソース 検索 ヘルプ PDF RSS ログイン

乱数ロールプログラム

[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;
お名前: コメント: