空想曲線

吉里吉里2/KAG3でのゲーム制作に使える小ネタ置き場。ゲーム用素材も置いてます。

吉里吉里/KAG:万能ダイスを作ってみよう 前編  

2016-05-17
2017-06-14
cm0
tb0

吉里吉里/KAGちょいネタシリーズ。
TRPG等で使用するダイスツールを吉里吉里で作ろうぜというネタです。
少し改造すればティラノスクリプトでも使えるかと思います。

全3回、内容は以下を予定しています。

 前編:ダイスの面数を自由に設定できるようにする
 中編:ダイスの個数を自由に設定できるようにする
 後編:ダイスの面数と個数をeditで入力できるようにする

まずは基本になる6面ダイスを作っていくよいよい ヽ(・∀・ )ノ
今回、KAGの intrandom は使用しませんのでご注意ください。


[ eval exp="f.dice = int(Math.floor(Math.random() * 6) + 1)" ]
ダイスロールの結果:[ emb exp="f.dice"]

このスクリプトを実行すると6面ダイスを1個ロールした結果を表示します。
f.dice の値は実数で弾き出されるため int で括って整数にするのを忘れずに。

ダイスの個数と面数が固定であればこれで十分なのですが
今回は「万能ダイス」を作るのが目的なのでもうちょい頑張りましょう。


/* 乱数を発生させる関数を作る
------------------------------------------------------------*/

// 引数:min=最小値、max=最大値
function diceRoll(min,max){
return int(Math.floor(Math.random() * ((max - min) + 1)) + min);
}


処理の内容をざっくり説明します。



1.Math.randomで0~1未満の乱数を発生させる


ためしに[ emb exp="f.dice = Math.random()" ]と書いて実行してみます。


0.91977
0.44133
0.51011
0.67559
0.55129
0.49673
0.51269
0.59877
0.78376
0.03391


本当は小数点以下の位がズラズラ並んでいるのですが要らないので小数点以下5位でカット。



2.乱数に「最大値-最小値+1」を乗算する


6面ダイスの最小値は1、最大値は6なので6を掛けます。


[ emb exp="f.dice = Math.random() * ((6 - 1) + 1)"]


0.91977*6 = 5.51862
0.44133*6 = 2.64798
0.51011*6 = 3.06066
0.67559*6 = 4.05354
0.55129*6 = 3.30774
0.49673*6 = 2.98038
0.51269*6 = 3.07614
0.59877*6 = 3.59262
0.78376*6 = 4.70256
0.03391*6 = 0.20346



3.Math.floorで小数点以下を切り捨てた後、最小値を足す


[ emb exp="f.dice = Math.floor(Math.random() * 6) + 1" ]


5.51862 → 5+1=6
2.64798 → 2+1=3
3.06066 → 3+1=4
4.05354 → 4+1=5
3.30774 → 3+1=4
2.98038 → 2+1=3
3.07614 → 3+1=4
3.59262 → 3+1=4
4.70256 → 4+1=5
0.20346 → 0+1=1


Math オブジェクトの floor メソッドは小数点以下を切り捨てます。
詳しく知りたい人は「Mathオブジェクト」で検索すると幸せになれるよ。



ということで最初に書いた

[ eval exp="f.dice = int(Math.floor(Math.random() * 6) + 1)" ]

を diceRoll() を使って書き直していきます。



;1~6の6面ダイスをふる
[ eval exp="f.dice =diceRoll(1,6)" ]
1D 6の結果:[ emb exp="f.dice" ]

;0~9の10面ダイスをふる
[ eval exp="f.dice =diceRoll(0,9)" ]
1D 10の結果:[ emb exp="f.dice" ]

;1~100の100面ダイスをふる
[ eval exp="f.dice =diceRoll(1,100)" ]
1D100の結果:[ emb exp="f.dice" ]


あとは引数 min の値を max の値より大きく書いてしまったときに
自動的に min と max の値を入れ替えるように修正しておきます。
うっかりさんもこれなら安心です。


/* ダイスロール
---------------------------------------------------*/

// 引数:min=最小値、max=最大値

function diceRoll(min,max){
if(min > max){min <-> max;}
// min が max より大きいときは値を入れ替える
return int(Math.floor(Math.random() * ((max - min) + 1)) + min);
}


ということで何面ダイスでも好きなだけコロコロできるようになりました。
次回はダイスの個数を設定できるようにしていきます。

今回はここまでー (´∀`*)ノシ


関連記事

コメント

コメントの投稿

Secret

トラックバック

トラックバックURL
→http://kopacurve.blog33.fc2.com/tb.php/417-894d48e3
この記事にトラックバックする(FC2ブログユーザー)

Author

Recent

Category

Link

Comment

Mailform

Twitter