特にAS3.0というわけでもありません。ランダムに値を出すというよりも、カードをシャッフルして提示していくようなロジックを考えてみましょう。つまり、選んだ数が「重複しない」ことが重要です。
マスターを入れ替えてしまうとぐちゃぐちゃになってしまうので、シャッフル用の配列を用意したほうがスマートです。
こんなマスターがあったとします。マスターは読取り専用にして書き換えないというポリシーで進めます。式にするとこんな感じになります。
1 2 3 4 5 |
var masterArray:Array = new Array(); masterArray[0] = {id:0, str:"コブタ"}; masterArray[1] = {id:1, str:"タヌキ"}; masterArray[2] = {id:2, str:"キツネ"}; masterArray[3] = {id:3, str:"ネコ"}; |
シャッフルの方法は、一度添え字と同じ数字を配列の中に入れておいて、上から順番に何番目の要素と入れ替えるかをランダムに決めます。そして一時変数に一回退避させて要素を入れ替えます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
var allCard:int = 4; //カードの枚数 var suffleArray = new Array(); var maxCNum:int = allCard-1; //添え字の最高値 var minCNum:int = 0; //添え字の最低値 var rndCNum:int; //ランダム抽出添え字保管用 var temp:int; //一時退避用 var i:int; for(i=0;i<allCard;i++){ suffleArray[i] = i; } for(i=0;i<allCard;i++){ temp = suffleArray[i]; rndCNum = Math.floor(Math.random() * (maxCNum - minCNum + 1)) + minCNum; suffleArray[i] = suffleArray[rndCNum]; suffleArray[rndCNum] = temp; } |
実際はこんな感じで使います。