トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   迷える子羊の部屋【初心者専用】
     くじの確率について
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
ゲスト
Åê¹ÆNo.49539
投稿日時: 2012-12-4 12:47
くじの確率について
Flashにてくじを作ろうと思っています。

内容
1?5等まであり、1等の当たりが3個、2等の当たりが5個、3等の当たりが10個、4等の当たりが50個、5等がそれ以外(はずれ)といったくじです。
各等の当たりが出た時点で、当たり数を減らし、最終的に1?4等の当たりが全て出終わった場合、5等のはずれしかでない、という風にしたいのです。(1?4等の当たりが残っている場合でも、確率で5等がでる場合もある)

以前こちらで質問されている方の中に「抽選くじの作り方」という質問をされている方がいらっしゃったのですが、その方は「ムービーを1度再生したら抽選は最後まで行う、つまり抽選の経過を保存する必要がないという前提」で作られているのですが、私の場合は、「抽選の経過を保存する必要がある」くじを作りたいのです。

ASに関しては初心者ではありますが、上記の方の記事に書かれていることについては、理解しております。
しかし、「当たりが出たら、そのあたり数を減らす」「経過を保存する」の部分の方法が思いつかず、困っております。

どなたか方法をご存じの方がいらっしゃいましたら、お知恵を貸して頂けないかと思います。

よろしくお願いします。


抽選くじの作り方
矢口マサムネ
Åê¹ÆNo.49540
投稿日時: 2012-12-4 14:17
新米
居住地: 東京
投稿: 21
使用環境:
Windows 7 Professional SP1 / 64bit
Flash CC 2014
Flash CS6
オンライン
Re: くじの確率について
方法は割といくらでもあると思います。ありすぎてちょっと困るくらいです。
感覚的に理解し易いのは、まず全ての要素を持った配列を作ってしまってはどうでしょうか。

var kujiArray:Array = new Array();
var i:uint;
for (i = 1; i <= 3; i++) {
	kujiArray.push("一等");
}
for (i = 1; i <= 5; i++) {
	kujiArray.push("二等");
}
for (i = 1; i <= 10; i++) {
	kujiArray.push("三等");
}
for (i = 1; i <= 50; i++) {
	kujiArray.push("四等");
}
for (i = 1; i <= 100; i++) {
	kujiArray.push("ハズレ");
}

くじ引きのガラガラの中に玉を入れる感覚です。
さらに分かり易く書くとこう(面倒なので三等まで…)
var kujiArray:Array = [
			"一等","一等","一等",
			"二等","二等","二等","二等","二等",
			"三等","三等","三等","三等","三等","三等","三等","三等","三等","三等"
			];

あとはこれをシャッフルして順に切り取っていくなり、
spliceでランダムなとこを抜き取っていくなり、どうにでも。
もし切り取りだの抜き取りだの自体が分からない場合は、配列の操作で調べて下さい。初心者用の解説サイトも沢山ありますし、入門書などにも大抵載ってると思います。

もしくは、
var kujiCountArray:Array = new Array(3,5,10,50);

のように各等の残数を配列の要素にし、当たった分を減らしていって、0になったら要素自体抜いてしまえば良さそうです。

ほんとにいくらでもやりようがあります。
とりあえず配列というものを理解するのが手っ取り早いかと。
そもそもこの抽選部分だけならActionScriptというかプログラミング一般の質問という気がするので、Flashに絞らず検索なりしてみても良いのでは。多分ザクザク出ると思いますよ。


----------------
-MASAMUNE GAMES-
http://masamune-games.net/

野中文雄
Åê¹ÆNo.49541
投稿日時: 2012-12-4 15:45
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: くじの確率について
引用のトピックでは「一度出た賞品は再度出ないように」しています。それは「当たりが出たら、そのあたり数を減らす」ことではないのでしょうか。違うのでしたら、その内容をもっと具体的にご説明ください。

「経過を保存する」には、SharedObjectクラスを使うのが定石です。
引用:
roku011さんは書きました:
以前こちらで質問されている方の中に「抽選くじの作り方」という質問をされている方がいらっしゃったのですが、その方は「ムービーを1度再生したら抽選は最後まで行う、つまり抽選の経過を保存する必要がないという前提」で作られているのですが、私の場合は、「抽選の経過を保存する必要がある」くじを作りたいのです。

ASに関しては初心者ではありますが、上記の方の記事に書かれていることについては、理解しております。
しかし、「当たりが出たら、そのあたり数を減らす」「経過を保存する」の部分の方法が思いつかず、困っております。


----------------
 

ゲスト
Åê¹ÆNo.49543
投稿日時: 2012-12-4 21:36
Re: くじの確率について
ご意見ありがたいです…!

野中様がおっしゃる通り、引用のトピックで「当たりが出たら、そのあたり数を減らす」は出来ていました。


var kuji:Array = new Array();
for (i = 1; i <= 3; i++) {
    kuji.push("一等");
}
for (i = 1; i <= 5; i++) {
    kuji.push("二等");
}
for (i = 1; i <= 10; i++) {
    kuji.push("三等");
}
for (i = 1; i <= 50; i++) {
    kuji.push("四等");
}
for (i = 1; i <= 100; i++) {
    kuji.push("ハズレ");
}

function xShuffleArray(kuji:Array) {
    var i = kuji.length;
    while(i) {
        var nRandom = Math.floor(Math.random()*(i--));
        var temp:Object = kuji[i];
        kuji[i] = kuji[nRandom];
        kuji[nRandom] = temp;
    }
}

xShuffleArray(kuji);
trace(kuji);


と、ここまで、
引用していたトピックと、矢口様のご意見から、ランダムにかつ、「当たりが出たら、そのあたり数を減らす」はトレースしたところまでは出来ています。


実際のくじについてです。

5枚の柄の違うカードがあります。
それぞれ好きなカードを一つ選ぶと、カードが拡大し、くじであるスクラッチをけずり、1?5等のいずれかが表示される。というFlashです。

1?5等まで、ランダムに配列を並べ替えるまではできたのですが、そこからどうしていいのやら、さっぱりな状況です。

カードを選び、そこでランダムに配列された中から数値を取り出し、何等か表示する。
その後、また違う人がくじをひいた場合、先ほどの結果の「経過を保存」したあとのくじを、再びする。

「カードを選択する」から「何等か表示される」までのロジック、というか、ASの考え方とがわからず、頭をかかえていました。

わかりにく説明で大変申し訳無いのですが、ご教授願えませんでしょうか?

野中文雄
Åê¹ÆNo.49544
投稿日時: 2012-12-4 22:08
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: くじの確率について
なにがさっぱりなのか、「さっぱりです」。

「カードを選択する」のは、配列の頭からエレメントを取出すことです。エレメントには「何等か」が文字列で記されています。ですから、それをそのまま「表示」すればよいだけではないのでしょうか。
引用:
roku011さんは書きました:
1?5等まで、ランダムに配列を並べ替えるまではできたのですが、そこからどうしていいのやら、さっぱりな状況です。
...[中略]...
「カードを選択する」から「何等か表示される」までのロジック、というか、ASの考え方とがわからず、頭をかかえていました。


----------------
 

矢口マサムネ
Åê¹ÆNo.49545
投稿日時: 2012-12-5 7:54
新米
居住地: 東京
投稿: 21
使用環境:
Windows 7 Professional SP1 / 64bit
Flash CC 2014
Flash CS6
オンライン
Re: くじの確率について
ええと、結局のところ何がわからないのか私にもよくわからないのですが…。
ご自身で書かれている中で、
ASは初心者だと強調されていること、
過去記事に書かれていることについては、既に理解しているとのこと、
「当たりが出たら、そのあたり数を減らす」まで、出来ている(配列を直接traceして出来ているという意味がちょっとわかりませんが…)
とのことから、
配列に関しては既に理解しているものとの前提で話を進めます。
(例えば、過去記事から引用されているxShuffleArray関数の中でどういう処理がなされているかは理解しているという事ですよね?)

ならば話は簡単です。
既に、『くじ入りの箱』が用意出来ているのです。
そこから無作為にくじを引き抜いてゆくsplice(ランダム)、
もしくは箱自体を振り回して中身をバラバラにし、
上もしくは下から一枚ずつめくってゆくpop()またはshift()、
この時点で既にくじとしては成立している訳です。

つまり「カードを選択する」という行為をこのくじを引く行為と結び付けたいが、そのロジック、考え方がわからない、という事で良いですね。
それならまず上記の動作を前例のシャッフルと同じように『くじを引く関数』としてまとめ、
カードに対して行われる「選択する」という行為を監視し、それを引き金としてその関数が実行されるようにすれば良いわけです。
「選択する」という行為がどんなものなのかは書かれていないので知りませんが、クリックでもキー選択でも数値入力でも、全てFlashの「イベント」として用意されています。これを監視し、
先の関数を「リスナー関数」として登録する事で結びつける事が出来ます。
検索 ⇒ as3 イベントリスナー

カードの拡大だのスクラッチを削るだのは演出上の話でしょうし、ActionScriptを使わないでも可能なことだと思うので割愛します。

そして「経過の保存」ですが、そもそも保存とだけ言われましても どういう状況でどこにどう保存したいのかがやはり書かれていないので、さっぱりわかりません…。
ですがまあ今ちょうど怪我が治って調子が良いので予想される3パターンを列挙しておきます。
一度Flashを起動した状態で最後までくじを引ききるだけであれば、rootなど消えない場所に変数を用意し、くじを引く度に保存していけば良いだけです。
同じPCでFlashをたびたび再起動しつつ経過を保存していくのならば、野中様が既に挙げて下さっているようにSharedObjectクラスを使うのが最も簡単です。
ネットワーク上であちこちのPCから同じくじ箱を使いたいというのなら、別にデータ保存用のプログラムをサーバーサイドスクリプトで用意し、URLLoaderやURLRequestクラス、sendToURL関数を利用して連携すると良いでしょう。
検索 ⇒ as3 CGI連携

もっと高度かつスマートなやり方も色々とありそうですが、私も初心者の域を出てはおりませんもので、
『考え方』として私がアドバイス出来るのはこの辺までです。
では、解決を祈っております。


----------------
-MASAMUNE GAMES-
http://masamune-games.net/

ゲスト
Åê¹ÆNo.49546
投稿日時: 2012-12-5 19:18
Re: くじの確率について
あれから一日、いろいろと試し続けて、動き的には思うようなものができつつある状態です。
野中様、矢口様、度々ご迷惑をおかけしました。

現在のものは
1フレーム目

var rank = new Array();
rank[0] = 1000;    //はずれクジの個数
rank[1] = 1;      //1等の個数
rank[2] = 2;      //2等の個数
rank[3] = 3;      //3等の個数
rank[4] = 20;     //4等の個数

function Choice():String {
	kuji = 0;
	
	for (var i = 0; i<rank.length; i++) {
		
		kuji += rank[i];
		
		}
		
		if (kuji == 0) {
			
			ret = "END";
			
		} else {
				
			cnt = Math.floor(Math.random()*kuji);
				
		if (cnt<=rank[1]-1) {
					
			ret = "n_01";
			rank[1]--;
					
		} else if (cnt<=rank[1]+rank[2]-1) {
						
			ret = "n_02";
			rank[2]--;
						
		} else if (cnt<=rank[1]+rank[2]+rank[3]-1) {
							
			ret = "n_03";
			rank[3]--;
							
		} else if (cnt<=rank[1]+rank[2]+rank[3]+rank[4]-1) {
								
			ret = "n_04";
			rank[4]--;
									
		} else {
										
			ret = "n_05";
			rank[0]--;
										
		}
										
	}
	return ret;       //値を返します

}


で、各カードの画面に移動してから、retにはいったものを判断して、
指定のフレームに移動させ、「何等です」と表示させる、といった風です。
(ちまちまと、5つのカードのパターン×5(1?5等)でフレームにわけてます)
丸一日、かかったわりには、スマートさの欠片もありませんが・・・

現在の課題は矢口様がご意見くださいました
「経過の保存」について調べ、勉強中です。

(確率設定についても調べていますが、優先が経過保存のため)

3パターン中の、最後。「ネットワーク上であちこちのPCから同じくじ箱を使いたい」の「経過保存」のパターンを考えては頭を抱えています。

xmlでテキストファイルに、現在の「残った当たり数」を書き込み、読み込み、というのはできないでしょうか?
(いろいろネットの中で探してみると、読み込みはあっても、書き込みはできないと見ましたが、策はないかと模索中です)

というのも、phpやCGIに関して、全く知識がなく、
…勉強スべきですね、もう少し頑張ってみます。
ゲスト
Åê¹ÆNo.49554
投稿日時: 2012-12-10 19:56
Re: くじの確率について
度々すみません、下記のスクリプトに確立は設定できるのでしょうか?
ハズレが無限にある場合、総数がわからない状態ですが、各等の当たり数はあり、かつ、その各等にそれぞれの確率がふりたいのです。
何百分の1の確率で1等が1つだけ。
また何百分の1の確率で、2等が2つだけ。のような感じです。

どなたかアドバイスいただけませんでしょうか?

ただ、調べている中でだんだん思ってきたのは
そもそも確率は、総数分の当たり数で、1等が当たる確率は何だ、というもので
総数は無限にあるなかに、各等の当たり数が決まった数しかないのに、確率が設定できるのか?という疑問でいっぱいになってしまい、立ち止まってしまった状況です。
野中文雄
Åê¹ÆNo.49555
投稿日時: 2012-12-11 7:25
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: くじの確率について
「ハズレが無限にある場合」各等の確率が定められれば、当たりも無限になります。「総数は無限にあるなかに、各等の当たり数が決まった数しかない」のなら、当たりの確率は0に収束します。
引用:
roku011さんは書きました:
ハズレが無限にある場合、総数がわからない状態ですが、各等の当たり数はあり、かつ、その各等にそれぞれの確率がふりたいのです。
何百分の1の確率で1等が1つだけ。
また何百分の1の確率で、2等が2つだけ。のような感じです。
...[中略]...
そもそも確率は、総数分の当たり数で、1等が当たる確率は何だ、というもので
総数は無限にあるなかに、各等の当たり数が決まった数しかないのに、確率が設定できるのか?という疑問でいっぱいになってしまい、立ち止まってしまった状況です。


----------------
 

ゲスト
Åê¹ÆNo.49556
投稿日時: 2012-12-11 19:44
Re: くじの確率について
野中様、コメントありがとうございます。
なんとか形になりつつあります。

現在は別の問題に頭を抱えています。
何度も何度も申し訳ないのですが、教えていただけるとありがたいです。

あるムービークリップをクリックすると、指定したアドレスに飛ばす処理についてです。



on(release){ 	getURL("アドレス");  }


ここにパラメータを付加させたいのですが、
その時の年月日時分+何等かわかるようにわりあてた数値
を付加させる場合、どのようにかけばいいのでしょうか?

1等ならば01、2等ならば02…という数字を、クリックした時の年月日時分の後ろに付けたいのです。

どなたか方法を御存知の方、いらっしゃいますでしょうか?
(1) 2 »
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops