ソラマメブログ
訪問ありがとう☆
QRコード
QRCODE

2008年06月21日

リストから要素を消す方法を教えて下さい。

解決しました。ありがとうございました。

【目的】
カードゲームを作ろうとしています。

【やりたいこと】
カードの束からランダムにカードを一枚引きます。
手札に引いたカードを入れておきます。
dialogで手札を表示して使うカードを選びます。
使ったカードを手札から消します。(この部分がどうやったらいいかわかりません)

【疑問点】
listの何番目の要素を消すという(llDeleteSubList)方法ではなくて、要素の名前を用いてリストからその名前の要素を消す方法。

【スクリプト】
list deck = ["ice","fire","air","earth",...]//カードの束を用意する
list hand ; //手札
i = llFloor(llFrand(40))://何番目のカードを引くか決める
llListInsertList(hand,llList2list(deck,i,i),llGetListLength(hand));//手札に引いたカードを入れる。
llDialog(llDetectedKey(0),"",hand,dialogchannel);//ダイアログで手札を表示
listen(integer channel,string name,key id,string message)
ここで聞いたmessageのカードを手札(handのリスト)から消したいのですが、
どうようにしたらよいのでしょうか?
よろしければどなたか教えていただけますでしょうか?
よろしくおねがいします。


この記事へのコメント
llListFindList(list src, list test)

http://rpgstats.com/wiki/index.php?title=LlListFindList

これでインデックスを調べて、lDeleteSubListするしかないような。
Posted by 田中明夫 at 2008年06月21日 21:40
田中さん
ありがとうございます!
llListFindListという関数があったなんて知りませんでした。
これで解決できると思います!
助かりました。本当にありがとうございます!
Posted by Treva SladeTreva Slade at 2008年06月21日 21:56
ちょっとした思い付きです。

1. list handは 1,"fire",3,"ice",...のように、元リストのインデックス込みのリストとする。
2. dialog用に、別途string menuitemsを用意し、"1.fire\n3.ice\n"のように情報を格納しておく。
3. llDialogのメッセージとしてはmenuitemsを使い、ボタン(チャットコマンドh)は、1,2,3の数字とする。
4.chat commandを受け取ったらintegerに転換し、これをインデックスとしてllDeleteSublistによってhandleの中身を消す。

想定されるメリット。インデックスを取り直す手間が省ける。ダイアログのボタンの表示がシンプルになる(文字数制限を気にしなくてよい)。
デメリット。menu用のデータを冗長に用意しなければならない。

たぶん田中明夫さんの方法が教科書的には正解だとは思いますが。
Posted by YooYoo at 2008年06月21日 22:08
Yooさん
アイデアありがとうございます!
元リストのインデックス込みのリスト、なるほどなるほど。
正直まだLSLの経験が浅くて、そのようなリストをつくった場合、どのように扱えばいいのかまだ理解できていません。
Yooさんのコメントを参考に勉強に励みたいと思います!
ありがとうございました!
Posted by Treva SladeTreva Slade at 2008年06月21日 22:19
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。