電子書籍の厳選無料作品が豊富!

いつもお世話になります。今回ご質問させて頂く内容はFlashlite1.0で、1~10までの数字をランダムかつ同じ数字がかぶらないように表示する方法(シャッフル)です。Flashlite2.0からは配列が使え、考えればシャッフルする方法もあったのですが、1.0ですと配列が使えない為やり方がわかりません。FlashのASは経験あるのですが、Flashliteの知識や経験があまりなく困っております。どなたかお教え頂けたらと思います。

具体的な内容なのですが、今作ったスクリプトが以下です。iという文字にsetを使い擬似配列(?)を組みarray0~array9という変数をランダムな数字で表すといったスクリプトを組んだのですが、これだとランダムなので同じ数字が何回も出てきてしまいます。これを同じ数字は省いてダブる数字が無いようにしたいと思っています。

▼スクリプト▼
num = 10;
for(i = 0;i < num;i++){
set("array" add i,random(10));
}
// 確認用
trace(array0);
trace(array1);
trace(array2);
trace(array3);
trace(array4);
trace(array5);
trace(array6);
trace(array7);
trace(array8);
trace(array9);

お手数お掛けして申し訳ありません。どなたかお教え頂ける方がいらっしゃいましたらよろしく御願い致します。

制作環境はAdobe Flash CS3です。

A 回答 (2件)

説明・・・うまくできる自信ないですが^^;


不足と感じれば遠慮なく補足要求してください。
説明のためnum = 10;は定数で書かせていただきました。


for(i = 0;i < 10;i++){
set("array" add i,i);//array0=0;array1=1;array2=・・・のループ処理
}

for(i=0;i<20;i++){//とりあえず20回ループ。iの値そのものに意味は無い
a=random(10);b=random(10);//シャッフル用乱数を生成。シャッフルされないこともあるかも
c=set("array" add a);//変数cに配列a番目の数値を保持(コピー)
set("array" add a,eval("array" add b));//配列a番目にb番目の数値を上書き
set("array" add b,c);//配列a番目とb番目が重複するので、保持しておいたcを代入。
}

for(i = 0;i < 10;i++){
trace(eval("array" add i));//動作確認
}


初期段階ではarrayは[0,1,2,3,4,5,6,7,8,9]のようになっています。
20回の処理の中では以下のようなことが行われています。

下記数値は
array[a]
,array[b]
,c の順
1,2,   乱数a,bが1,2だったとして(array1,array2について処理)
1,2,1  cにarray1("array" add a)の値を保持
2,2,1  array1にはarray2の値が入り、array1とarray2は重複
2,1,1  元のarray1の値である、cをarray2に代入することで、重複を戻す→結果的にarray1とarray2が入れ替わる
続けて2回目のループ。arrayは、[0,2,1,3,4,5,6,7,8,9]から開始
2,3,   乱数が1,3だった場合(array1,array3について処理)
2,3,2
3,3,2
3,2,2  この時点でのarrayは、[0,3,2,1,4,5,6,7,8,9]
これが20回繰り返されるとある程度シャッフルされます。(たぶん十分)
    • good
    • 0
この回答へのお礼

お返事遅れて本当にすみませんでした。また丁寧なご説明本当にありがとう御座いました!15mmさんのご説明でスクリプトの意味を理解でき、無事実装することができました。今回は本当にありがとう御座いました。また何かご質問させて頂く事があるかとは思いますが、その時もよろしくお願いできればと思います。失礼致します。

お礼日時:2008/10/07 18:37

FlashCS3でFlashLite作ったことない者ですが




[0,1,2,3,4,5,6,7,8,9]のようにarray0~9に代入しておき、
他の変数を介してランダムに2つずつ入れ替えるというのは・・・原始的ですね^^;
文法うろ覚えですがサンプル
for(i=0;i<(シャッフル回数:20回くらいやればいいかな?);i++){
a=random(10);b=random(10);//シャッフルされないこともあるかも
c=set("array" add a);//交換のためにデータ保持
set("array" add a,eval("array" add b));
set("array" add b,c);
}


i=0,1,2,・・・をarray?に代入する際、array?が存在するか確かめられれば楽なのですが・・・
for(i = 0;i < num;i++){
a=random(10);
if(eval("array" add a)){
set("array" add a,i);
}}


ところでevalって使えましたかね?

この回答への補足

せっかくご返答を頂いていたのにお返事が遅くなって大変申し訳ありません。evalは使えます!ネットでいろいろ調べたところevalを使って擬似配列を作っている人もいました。スクリプトを記載して頂きまして本当にありががとう御座いました。しかしまだまだ勉強不足の私では、いろいろ解析してみたのですが、申し訳ない事にこれが何をしているのかがわからなく、もしお時間がありましたらもう少し細かい説明を頂けたら大変うれしいです。お手数お掛けしてしまって本当の申し訳ありません。

補足日時:2008/09/13 08:34
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!