- ベストアンサー
抽選機を作るためのアクションスクリプト教えてください。
現在FLASHMX2004で抽選機を作っています。 1等=1コ 2等=2コ 3等=3コ 4等=20コ 5等=100コ ハズレ=無限 上記のような設定で抽選機を作りたいのですが、どのようにスクリプトを記述すればよいでしょうか? 参考になるURLを教えて頂いても助かります。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
見やすくするために全角スペースが入っていますので コピーの際には半角に置き換えてください。 //--------------------------------------------------------- var rank = new Array(); rank[0] = 100; //はずれクジの個数 -----POINT(1) rank[1] = 1; //1等の個数 rank[2] = 2; //2等の個数 rank[3] = 3; //3等の個数 rank[4] = 20; //4等の個数 rank[5] = 100; //5等の個数 //クジ選択関数 //戻り値:引いたクジ function Choice():String { kuji = 0; for (var i = 0; i<rank.length; i++) { kuji += rank[i]; -----POINT(2) } if (kuji == 0) { -----POINT(3) ret = "END"; } else { cnt = Math.floor(Math.random()*kuji); ----POINT(4) if (cnt<=rank[1]-1) { ----POINT(5) ret = "1等"; rank[1]--; -----POINT(6) } else if (cnt<=rank[1]+rank[2]-1) { -----POINT(7) ret = "2等"; rank[2]--; } else if (cnt<=rank[1]+rank[2]+rank[3]-1) { ret = "3等"; rank[3]--; } else if (cnt<=rank[1]+rank[2]+rank[3]+rank[4]-1) { ret = "4等"; rank[4]--; } else if (cnt<=rank[1]+rank[2]+rank[3]+rank[4]+rank[5]-1) { ret = "5等"; rank[5]--; } else { ret = "はずれ"; rank[0]--; } } return ret; //値を返します } //--------------------------------------------------------- POINT(1)------------- >ハズレ=無限 ということですが、そういうわけにもいきません。 無限だと引いても引いてもほとんどがはずれクジです。 全体のクジの数を決めるということではずれクジの個数を決めます。 0にするとハズレクジなしです。 POINT(2)------------- クジ全体の数を求めています。今回の例では226個です。 POINT(3)------------- 引くクジがなくなったらここを通ります。 POINT(4)------------- クジを選びます。cntの値は0-225のいずれかの数字になります。 POINT(5)------------- rank[1]の値は1なので cnt<=rank[1]-1 つまり cnt<=0のとき1等です。 POINT(6)------------- 1等がでた場合1等のクジの個数を1つ引き算します。 コレによりrank[1]の値が0になります。 次回1等になるのは cnt<=rank[1]-1 つまり cnt<=-1のときです。 しかしPOINT(4)よりcntの値にマイナスはないのでもう1等はでません。 POINT(7)------------- rank[1]=1(まだ1等がでてないとき) rank[2]=2のとき、 cnt<=rank[1]+rank[2]-1 つまり cnt<=2のときは2位です。 0,1,2の3通りあるように勘違いされがちですが、 0のときはPOINT(5)で引っかかるのでここまできません。なので2通りです。 と、ちょっとわかりにくい説明ですが要するに 1等がでたら1等の個数をひとつ減らす、 2等がでたら2等の個数をひとつ減らす・・・というようにやっています。 rank配列の値を変えれば各順位の当選数も変えられます。 表示のさせ方としてはボタンを作って on(release){ trace(Choice()); } とやれば「何等」とか返って来ます。 抽選クジの個数をいれるのに配列を使ったのはなんとなくです。
その他の回答 (1)
- perse
- ベストアンサー率74% (113/152)
2フレーム目のMCのルーレットが回り終わったとき(再生終了したとき)に #1でかいたChoice関数を呼び出してその戻り値によって 次に再生するフレームを決めてあげればいいと思います。 ルーレットMCの最後のフレームに no = Choice(): if (no == 0 ){ this.gotoAndStop(6); //ハズレのフレームへ }else if (no == 1 ){ this.gotoAndStop(3); //一等のフレームへ } という感じで書きます。 #1では関数の戻り値が「はずれ」「1等」など文字列になっていますが、 上記の方法でやる場合は はずれのときは0、一等のときは1のように数字を返すように変えます。 その数字によって飛ばすフレームを分けてあげるということです。 またはフレーム番号を返すようにして this.gotoAndStop( Choice() ); と書いたり。(多分動く) この場合は1等のとき3、2等のとき4、はずれのとき6を返すようにします。 1等のときは3が返ってくるので、 this.gotoAndStop( 3 ); と同じ意味になるわけです。 今後の修正のことを考えてフレームラベルを使ったりしてもいいと思います。
お礼
ご丁寧にありがとうございます。 おかげさまで、希望のものができました。 詳細な説明がとてもわかりやすく、初心者の私でも完成することができました。 ありがとうございました。
補足
ご回答ありがとうございます。 上のスクリプトでできました。ありがとうございます。 少し欲張って、1等~ハズレまでの表示をムービークリップで表示したいと思っているのですが、 1フレーム目・・・待機中のムービー 2フレーム目・・・ルーレットが回るムービー 3フレーム目・・・1等のムービー 4フレーム目・・・2等のムービー 途中略 6フレーム目・・・ハズレ 7フレーム目・・・終了 ステージにあるのは ・上記抽選のムービークリップ ・抽選スタートのボタン ・抽選結果を待機中のムービー表示に変更するためのボタン の3種です。 上でご回答いただいたスクリプトを応用して作ってみたのですが、なぜかうまくいきません。 return 抽選のムービーククリップ名; にしているのが間違いなのかもしれません。 お手数ですが、修正方法ご教授願えればと思います。