- ベストアンサー
ランダム表示の重複回避方法について
- クイズ作成時に問題の背景を重複させないようにする方法を教えてください。
- クイズの背景に使う画像をランダムに表示させたいが、同じ画像が連続して表示されてしまう問題があります。
- 現在クイズのスクリプトについて勉強中で、背景画像の重複を回避する方法がわからない状況です。解決策を教えてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
注釈つけておきます。 なるべく理解した方がいいですよ。 numberList = [1, 2, 3]; //配列numberListを1,2,3を入れた状態で生成。 randomList = []; //配列numberListを空の状態で生成。 for (k=3; k>=1; k--) { //kの初期値が3で、 //繰り返しごとにkから1引いて、 //kが1以上の内は繰り返せ。 //という処理だけども...※後述 randNum = Math.floor(Math.random()*(k)); //kを元に生成した乱数を変数randNumに代入。 choiceNum = numberList[randNum]; //配列numberListのrandNum番目の要素を、 //変数choiceNumに抽出し代入。 randomList.push(choiceNum); //choiceNumを配列randomListに追加。 numberList.splice(randNum, 1); //配列numberListの抽出済み要素を取り除く。 } ※補足 for (k=3; k>=1; k--) { これはkにnumberListの配列の要素数を いちいち設定しないといけません。 配列の要素数はlengthで取り出せるので、 for (k = numberList.length; k>=1; k--) { としておけば、numberListの要素数をどう変えても 自動的に要素数分のシャッフル処理ができるのでお得(?) まとめると…(コピペタイム) /////////////////////////////////////////////// MOTO = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]; BARA = []; for (k = MOTO.length; k > 0; k--) { RAN = Math.floor(Math.random() * (k)); KAE = MOTO[RAN]; BARA.push(KAE); MOTO.splice(RAN, 1); } //以下、出力パネル確認用 trace("BARA= " + BARA); for (k = 0; k < BARA.length; k++) { trace("BARA[" + k + "]= " + BARA[k]); } /////////////////////////////////////////////// 「numberList」とか「choiceNum」とかだと 無駄に敷居が高く見えちゃうもんなので、 元の配列はMOTO シャッフル後の配列はBARA 乱数はRAN 順序を変更する要素はKAE に、それぞれして直してみました。 変数名や配列名は任意です。人に見せた時に分かるように、 意味のある英語にしておいた方がいいってだけの事で、 自分しか見ないなら、自分が分かれば何でもいいんです。(´~`)
その他の回答 (3)
- zari514
- ベストアンサー率48% (26/54)
> 現在ランダムに数字を出すスクリプトは分かったのですが なっ 単なるコピペじゃん ヽ(`⌒´)ノ=3 元はコレでしょーっ! http://hfm-kenchan.com/Lesson/log_qa/D0709023.htm これは「分かった」とは言いません。「知った」です。 って、まぁ別にいいんですけどね…(´~`;) ただ、何をやってるかは知っておくべきだと思いますよ… 例えば、 > このランダム数字を配列に入れ直すことが出来ず悩んでます。 悩む必要はありません。だってもう入ってますやん。 randomListってのがソレです。 最終行に trace(randomList); って入れてみて下さい。 出力パネルで確認できますから。 > 配列に入れ直してそれを順に取り出していけば > なんとかカタチになるかな~とも思っているのですが > どうでしょう? はい、そうです。それでカタチになるです。 シャッフルを実行した後の配列randomListに 仮に[2,3,1]と入ったとします。 randomList[0]と参照すれば2が取り出せます。 randomList[1]と参照すれば3が取り出せます。 randomList[2]と参照すれば1が取り出せます。 要素も数値だと分かりにくいかな? ↓ 例えば、仮にSHIMAPIYOという配列に ["ぱんだ","いたち","ひよこ","ごりら"]が入ってたとします。 SHIMAPIYO[0]と参照すれば "ぱんだ" が取り出せます。 SHIMAPIYO[1]と参照すれば "いたち" が取り出せます。 SHIMAPIYO[2]と参照すれば "ひよこ" が取り出せます。 SHIMAPIYO[3]と参照すれば "ごりら" が取り出せます。 という事です。 「ひよこ」ラベルにジャンプしたいなら、 gotoAndStop(randomList[2]); 「bg3.swf」をBGムービークリップに読み込みたいなら、 BG.loadMovie("bg"+randomList[1]+"swf"); 「ごりらはぱんだの2倍強い」と MSGテキストフィールドに表示させたいなら MSG.text=SHIMAPIYO[3]+"は"+SHIMAPIYO[0]+"の"+randomList[0]+"倍強い"; となります。(・_・) どうでしょ。 おそらく必要なのはswf読み込みのヤツだけでしょうけど。 配列理解の一助として。
- zari514
- ベストアンサー率48% (26/54)
> それをランダムに入れ替え > 現在ランダムに入れ替たところまでは分かったのですが どうランダムに入れ替えるのでしょうか。 「シャッフルせよ」なんてメソッドはありません。 ここはそんなサクッと流せるところではないのです。 > で、配列もそう使うんだ・・・ > くらいで正直よくわかりません。 じゃあ、配列をまず理解すべきだと思います。 変数は理解していますか。 > とおもってるのですが > これをどうひとつづつ処理していくのか現在悩んでる状況です。 了解です。でもこれは一旦おいときましょう。 シャッフルについて形になってからでもいいので。
お礼
ご回答ありがとうございます。 多分自分自身分かってなかったと思います。 現在変数も確認しながら理解しようとしてる最中です。 現在ランダムに数字を出すスクリプトは分かったのですが /*numberList = [1, 2, 3]; randomList = []; for (k=3; k>=1; k--) { randNum = Math.floor(Math.random()*(k)); choiceNum = numberList[randNum]; randomList.push(choiceNum); numberList.splice(randNum, 1); }*/ このランダム数字を配列に入れ直すことが出来ず悩んでます。 配列に入れ直してそれを順に取り出していけば なんとかカタチになるかな~とも思っているのですが どうでしょう? すいません、折角ご回答頂いたのに正直頭の中混乱してます。 もしお付き合いいただけるようであれば助言等いただければ助かります。 ご回答ありがとうございました。
- zari514
- ベストアンサー率48% (26/54)
最初に表示させる要素を用意します。 例えば、1,2,3,4,5,6 その順序をランダムに入れ替えます。 例えば、2,5,6,1,3,4 で、これを頭から順に表示させる、考え方としてはこんな感じです。 これをどうスクリプトにするかを考えてください。 実際のコードはともかくもフローは思い描けるでしょう。 まずはそこからだと思います。 配列は分かりますか?
お礼
ご回答ありがとうございます。 ご返信遅くなり申し訳ございませんでした。 いろいろ考えて大体のフローは思いえがけたと思います。 最初に表示させる要素を用意 それをランダムに入れ替え ランダム要素から(フレームはgotoで戻してるから) enterframeごとにランダム要素を順番に処理していく で、配列もそう使うんだ・・・ くらいで正直よくわかりません。 現在ランダムに入れ替たところまでは分かったのですが ランダムに入れ替えた後 たとえば vae movie_array=["2.swf","3.swf","1.swf"] をenterframeごとにひとつづつ処理していけばいいかな・・ とおもってるのですが これをどうひとつづつ処理していくのか現在悩んでる状況です。 また助言等いただけるものであれば ご回答いただければ幸いです。 ありがとうございました。
お礼
ご回答ありがとうございます。 おかげさまでなんとか先に進めそうです。 助かりました。 貴重なお時間を頂きましてほんとありがとうございます。