ソラマメブログ

2008年07月09日

ハノイの塔 作ってみた

これも前々から どうしようかな~ と思っていたもの
-----
ワッカを飛ばせば面白いかな というのでやってみた w
-----

-----

-----
リストもあげておきます
-----
まず本体から
//
// File: hanoi.pat
// Date Author number of nodes
// 2008/7/9 walkinglint 41
//
integer n = 3;
integer hanoi_channel = 8710;
integer i;
hanoi(integer from, integer to) {
moveDisk(n, from, to);
}
moveDisk(integer n, integer from, integer to) {
if (n > 1) {
moveDisk(n - 1, from, 6 - from - to);
}
llOwnerSay("move " + (string)n + " from " + (string)from + " to " + (string)to);
llMessageLinked(from, -(to - from), (string)n, NULL_KEY);
llSleep(6.0);
if (n > 1) {
moveDisk(n - 1, 6 - from - to, to);
}
}
default {
state_entry() {
for (i = 0; i < n; i++) {
llRegionSay(hanoi_channel + n - i, "die");
llMessageLinked(1, 0, (string)(n - i), NULL_KEY);
llSleep(1.0);
}
}
on_rez(integer param) {
llResetScript();
}
touch_start(integer total_number) {
integer i = 1;
integer j = 2;
while (TRUE) {
hanoi(i, j);
i++;
j++;
if (i > 3) {
i = 1;
}
if (j > 3) {
j = 1;
}
}
}
}
まあ この部分は アルゴリズム辞典からのパクリ ^^
-----
次に棒(ここでワッカを発射している)
//
// File: torus_cannon.lsl
// Date Author number of nodes
// 2008/7/9 walkinglint 25
//
float vel = 10.0;
integer hanoi_channel = 8710;
default {
link_message(integer sender_num, integer num, string str, key id) {
vector force;
if (num == -2) {
force = (<0.0, -0.4, 1.5> * vel) * llGetRot();
} else if (num == -1) {
force = (<0.0, -0.3, 1.0> * vel) * llGetRot();
} else if (num == 1) {
force = (<0.0, 0.3, 1.0> * vel) * llGetRot();
} else if (num == 2) {
force = (<0.0, 0.4, 1.5> * vel) * llGetRot();
} else if (num == 0) {
force = ZERO_VECTOR;
} else {
// no nothing
return ;
}
integer id = (integer)str;
llRegionSay(hanoi_channel + id, "die");
llRezObject("torus" + (string)id, llGetPos() + <0.0, 0.0, 2.0>,
force, llEuler2Rot(<0.0, 90.0, 0.0> * DEG_TO_RAD), 1);
}
}
最後にワッカ(発射時に前のものを消しているので消えるためのスクリプト)
//
// File: torus.lsl
// Date Author number of nodes
// 2008/7/9 walkinglint 12
//
integer hanoi_channel = 8710;
integer id = 1;
default {
state_entry() {
llSetStatus(STATUS_DIE_AT_EDGE, TRUE);
llListen(hanoi_channel + id, "", NULL_KEY, "");
}
listen(integer channel, string name, key id, string message) {
llDie();
}
}

同じカテゴリー(walking のスクリプティング講座)の記事
 プロフィール写真の表示に問題 (2009-11-30 20:55)
 ミニ太陽系 (2009-03-21 06:03)
 関数から文字列を返したら何か問題になる? (2009-03-18 18:02)
 llListFindList って型って関係ないんだったっけ (2009-03-18 14:02)
 夏時間(PDT)の実験 (2009-03-08 22:04)
 15パズルの作り方(その3) (2009-03-08 06:03)
上の画像に書かれている文字を入力して下さい
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。