【asa】 ランラン乱数で おみくじ!

mina Cookie

2007年11月09日 00:37


「おみくじ」を作ろう!

今の世の中、やっぱりおみくじですよね!
ん?なんか言った?いきなりなんだ?って??
おみくじですよ、おみくじ!!

とまあ、強引なツカミとともに不定期気まぐれ記事がやってまいりましたよ。
LSL?スクリプト?もうふつうに使ってるけど?
とか、
なにそれー喰えるんかー?やるきなんてないぜ!
とかいう方は適宜スルーの方向でお願いします。
LSLわっかんなーいしーでもぉーちょっとつかってみったーいかんじー、というくらいの方には参考にならなくもない感じでまとめてみました。

どうもLSLそのものの設計思想って、プリミティブな機能の充実よりマクロ的な機能提供が重点的な気がします。
今回のテーマ「おみくじ」は、なんてったって乱数私は乱数(you're a 乱数)乱数は~やめら~れな~いHey!!てくらい、乱数命です。
乱数についても、マクロ的な機能が意識されているなあ、、、という関数がありました。
それが今回の主役、llListRandomize()です。
LSLで提供されてる乱数っぽい機能にはllFrand()という関数とllListRandomize()という関数があります。
たいていのプログラミング言語ではllFrand()のように素直な乱数(通常は0~1未満の小数)の発生機能だけが提供されてます。
が、llListRandomize()という関数がちょっと不思議ちゃん。
てか、これ、使い方次第で便利モノです。

えーと前置き永井豪。
今回は、このllListRandomize()をつかった「おみくじ」作りをネタにしてみます。
llListRandomize()の機能を簡単に説明すると、list型変数(配列;文字列や数値の集合体)の中身をシャッフルするもの、となります。
ちょうどトランプをきるような感じですね。
たとえば、
list kikuzo = ["いやん", "ばかん", "うふふん", "そこは", "おみみなの", "っあ~ん"];
とかいう配列があったとします。
おい!LSL内に日本語使えないだろ!って言った奴誰だ!?
正しいです^^
これは説明をわかりやすくしたいという心意気だと思ってくださいませ。
本当に日本語を扱いたいのであれば、LSL内で日本語つかうような感じの時に便利っぽい感じ とか参考にしちゃってみちゃってくださいませとさりげなく宣伝化!

で、たとえばこのlist 型変数 kikuzo に対して、
list result_list = llListRandomize(kikuzo, 1);
とします。
すると、result_listの中身は、kikuzoの中身がバラバラになったものが入ります。
たとえば、
["うふふん", "そこは", "おみみなの", "いやん", "っあ~ん", "ばかん"];
とか。
バリエーション数は単純な順列で、リスト数の階乗個ですね。
因みに、llListRandomizeの第2引数(1)を2にすると2つ("いやん"と"ばかん", "うふふん"と"そこは", "おみみなの"と"っあ~ん"、のセット)毎にシャッフルします。
["うふふん", "そこは", "いやん", "ばかん", "おみみなの", "っあ~ん"]などのように。
llListRandomizeの第2引数を3にすると3つ毎にシャッフルです。

さてここであらためて、
list result_list = llListRandomize(kikuzo, 1);
について考えてみましょう。
この result_list というリストの、たとえば1番目には何がくるのかわかりません。
"いやん"かもしれないし"ばかん"かもしれないし"うふふん"かもしれないし"そこは"かもしれないし"おみみなの"かもしれないし"っあ~ん"かもしれない。
そして1番目にくる文字列の範囲は元の配列kikuzoの中に定義されたもの、ということになります。
つまり、
list result_list = llListRandomize(kikuzo, 1);
で得られた配列、result_listの1番目の値を見れば「指定された範囲の中からランダムでひとつ選択」ということが実現できます。
 
「配列の先頭をとってくる」にはllList2XXXX()という関数を使います。
XXXX部分は取ってくる型により事なります。llList2Integer(), llList2Float(), llList2Key(), llList2Vector(), llList2Rot()等。
ここで扱っている、"いやん"とか"ばかん"は文字列なのでString、すなわち、llList2String()を使います。
llList2XXXX()で、「リストの何番目をとってくるか?」の指示は第2引数です。
「配列のn番目を取ってくる」には、llList2XXXX()の第2引数にn-1の数を記します。
つまり「配列の1番目を取ってくる」には、1-1 = 0 を指定するわけです。
よって、
string result = llList2String(result_list,0);
これでresultには、 "いやん"または"ばかん"または"うふふん"または"そこは"または"おみみなの"が入ります。
 
llListRandomize()とllList2String()をつかうことで、たとえば以下のような簡単なおみくじが作れます。
このスクリプトを放り込んだプリムをtouchすると、おみくじの結果を叫びますw

list omikujibako = ["dai-kichi", "chu-kichi", "syo-kichi", "kichi", "kyo", "dai-kyo"];
default {
touch_start(integer num){
list result_list = llListRandomize(omikujibako,1);
string result = llList2String(result_list, 0);
llShout(0, result + "!!!!!!");
}
}


 
今日のポイント:
1) llListRandomize()でシャッフル!シャッフル!
2) llList2String()でリストからピンポイントで打つべし!打つべし!
3) llListRandomize()とllList2String()の組合せで無作為選択屋ケンちゃん(ぉぃ

いささか壊れ気味な感じですが、壊れてるのは最初からですからお気きになさりませぬよう。
ではまたいつか!

学習