ソラマメブログ
プロフィール
mina Cookie
mina Cookie
IMに関してはこちら必読ください!
※asa Soyerは幽霊スタッフですw
アクセスカウンタ
< 2024年11月 >
S M T W T F S
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

2007年11月09日

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

「おみくじ」を作ろう!

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

とまあ、強引なツカミとともに不定期気まぐれ記事がやってまいりましたよ。
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()の組合せで無作為選択屋ケンちゃん(ぉぃ

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




同じカテゴリー(学習)の記事画像
【mina】所持金0
同じカテゴリー(学習)の記事
 【asa】おーねがいattach!attach! (2008-02-25 14:16)
 【asa】スクリプトに日本語しゃべらせるアレの支援ツール (2007-08-25 02:53)
 【asa】気まぐれLSL tips:ちゃんと座ってよ;; (2007-06-04 16:09)
 【asa】ネタ製作とその実現3 ぱーみっしょん (2007-04-25 17:20)
 【asa】ネタ製作とその実現2 代替手段に学ぶ (2007-04-23 18:39)
 【asa】ネタ製作とその実現1 目指せハンカチ王子 (2007-04-16 11:07)

Posted by mina Cookie at 00:37│Comments(5)学習
この記事へのコメント
こんにちは、

以前椅子作りでお世話になりましたJinkoです。いつもいろいろヒントをありがとうございます。

llListRandomize()って知りませんでした。
なかなか便利そうですよねー

特に、2つとか3つのパラメータを組にできるところが面白いと感じました。

["Club", 3, "Heart", 1, "Spade", 4, "Diamond", 2]

みたいなリストをシャッフルできて便利ですよねー

llFrand()で取り出すと、同じカードが出てくることもあるけど、llListRandomize()だと、重複チェックしなくって4枚ちゃんと取り出せる!!

面白いですねー
こんどどこかで使ってみます^^

ありがとうございました。
Posted by jinko at 2007年11月09日 08:51
Jinkoさん、おひさしぶりです^^
コメントありがとうございました!

llListRandomize()は、友達が、あることをしたいと考えていて、その友達が「これ使えるのかなあ?」と見付けてきてくれた関数なんです。
調べてみたら結構使えそう、ということで記事にしてみました^^

おっしゃる通り、2つずつ、3つずつ、シャッフルできるという特徴的な機能は、アイデア次第で色々応用できそうですよね。
「無作為の並べ替え」が一発でできるってのもとても便利です。

> ["Club", 3, "Heart", 1, "Spade", 4, "Diamond", 2]
> みたいなリストをシャッフルできて便利ですよねー

これ、かなりポイント高い発想です。
たとえばトランプカード全てをこの形式で配列にして、2つずつシャッフルし、取り出しも2つずつの単位で行う。
2つずつの取り出しは、llList2List()でできます。
たとえばBlackJackゲームなどを考えた場合、出したカードの合計を得る処理が必要になりますので、スーツと数を別々に取れることが重要になります。

簡単な例として、
「トランプを切り上から5枚めくって、どんなカードが出たか?とカードの数の合計値を出す」
というものを考えてみます。
今インできる環境ではないので動くかどうかの検証ができません・・・エラー出るかな^^;
インできる環境になったら検証してみますね。

default{
touch_start(integer num){
list card = ["Club", 1, "Club", 2, ...略... ,"Spade", 12, "Spade", 13]; // 52枚分書、、、かなくてもいいけど。テストだし。
integer count = 0;
integer total = 0;
// カードを5枚取り出す
for(count=0; count < 5; count++){
list selected = llList2List(card, count * 2, count * 2 + 1); // 2つずつ組になってるので、配列のcount x 2 番目から、 count x 2 + 1番目までを取り出す
string suit = llList2String(selected, 0); // "Club"とか"Heart"とかが得られる
integer number = llList2String(selected, 1); // 1, 2,とかが得られる
llOwnerSay("COUNT : " + (string)count + " : " + suit + " " + (string)number); // 取れたカードの表示
total = total + number;
}
llOwnerSay("SUM of the card: " + (string)number); // カードの数合計表示
}
}


プログラミング言語の話になってしまいますが、こういうのは通常「値のセット」をもたせることができる仕組みを使います。
C言語ならば構造体、オブジェクト指向言語ならオブジェクトを使ったクラスライブラリです。
しかしLSLにはこういった「値のセット」をもつための仕組みが無いためこういった実装方法となる、という具合です。
Posted by asa Soyer at 2007年11月09日 10:37
うわーーーーエラーだらけ。
修正版を載せます。


default{
touch_start(integer num){
list card = ["Club", 1, "Club", 2, "Club", 3, "Club", 4, "Club", 5, "Club", 6,
"Club", 7, "Club", 8, "Club", 10, "Club", 11, "Club", 12, "Club", 13];
integer count = 0;
integer total = 0;
list shufd_card = llListRandomize(card, 2);
for(count=0; count < 5; count++){
list selected = llList2List(shufd_card, count * 2, count * 2 + 1);
string suit = llList2String(selected, 0);
integer number = llList2Integer(selected, 1);
llOwnerSay("COUNT : " + (string)count + " : " + suit + " " + (string)number);
total = total + number;
}
llOwnerSay("SUM of the card: " + (string)total);
}
}
Posted by asa Soyer at 2007年11月10日 00:25
さらに丁寧な解説と具体的なサンプルありがとうございました。

これでワタシもllListRandomize()がわかったぞーって気になってきました^^
あはは。

LISTの使い方って奥が深いですねー
Posted by jinkojinko at 2007年11月11日 13:07
あははw
なにかを製作なさる際の味付けにでもなれば幸いです^^
Posted by asa Soyer at 2007年11月12日 12:43
※このブログではブログの持ち主が承認した後、コメントが反映される設定です。
上の画像に書かれている文字を入力して下さい
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。