最近、DICEWARSというゲームに嵌っています。ルールはこのあたりを見ていただくとして、こんな感じでオリジナルのゲームを作れないかなぁと考えてみたりしてる過程で、「nDmの結果分布テーブルを出すスクリプトとか無いかなぁ」と思ってざっくり検索したんですが見つからず。
ならば自分で作ろう多分CPANにいけばありそうな気はするけど敢えて! という事で作ってみました。


use strict;
use warnings;

my %dicecount;

sub dcalc
{
my($currentnum,$maxnum,$face,$depth)=@_;
$depth--;
foreach(1..$face)
{

if($depth==0)
{
$dicecount{$currentnum+$_}++;
next;
}
&dcalc($currentnum+$_,$maxnum,$face,$depth);
}
}

my($num,$face,$percent)=@ARGV;
if(!$num||!$face)
{
die "usage: numcalc.pl n m (percent)\n(case of nDm)\nif (percent) is true, print by percent style."
}
&dcalc(0,$num,$face,$num);

foreach(sort {$a<=>$b} keys(%dicecount))
{
if($percent)
{
print "$_\t".($dicecount{$_}/($face**$num)*100)."%\n";
}
else
{
print "$_\t$dicecount{$_}\n";
}
}



こんな感じです。



実際に使う場合、例えば6面ダイス3個(3D6)の結果分布を表示する場合は


perl ndmcalc.pl 3 6

としてやればOK。



さらに3つ目の引数を渡してやる(値は何でもOK)


perl ndmcalc.pl 3 6 1

と、結果をパーセント表示する機能も付いてます。