ActionScript3で乱数を取得しなおかつ隣とかぶらない

このQ&Aのポイント
  • ActionScript3で乱数を取得しなおかつ隣とかぶらないソースのコーディング方法を教えてください。
  • 2つのテキストエリアとボタンがあり、ボタン1を押すとテキスト1に1~10の数字がランダムに表示されます。同様にボタン2を押すとテキスト2に表示されますが、テキスト2の数字はテキスト1の数字と重複せず、かつ前回と同じ数字が出ないようにしたいです。
  • 良い方法があれば教えてください。制作環境はActionScript3とFlash CS4です。
回答を見る
  • ベストアンサー

ActionScript3で乱数を取得しなおかつ隣とかぶらない

ActionScript3で乱数を取得しなおかつ隣とかぶらない 質問ですActionScript3で乱数を取得しなおかつ隣とかぶらないソースをコーディングしているのですが、うまいやり方が見つからず困っています。 いまサンプルとして以下の画像のように2つのテキストエリアとボタンを置いてあります。 それぞれボタンを押すとボタン1ならテキスト1に1~10の数字がランダムにしかも前回と同じ数字がでないように表示されます。ここまでならできるのですが問題は例えばテキスト1に3がでていたらテキスト2には3以外でなおかつ前回と同じ数字がでないようにしたいのです。 何か良い方法はないでようか? ■制作環境:ActionScript3 Flash CS4

  • Flash
  • 回答数2
  • ありがとう数7

質問者が選んだベストアンサー

  • ベストアンサー
  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.2

回答字数制限にひっかかるため回答を2つに分けます。 ◎ 回答 【その2】 ---------------------------------- //---ダミーデータ準備--- //過去のデータ1&2を宣言 var past1:int; var past2:int; //今のデータ1を作成 var now1:int = Math.floor(Math.random() * 10) + 1; //臨時の配列を作成 var tmpArr:Array = new Array(); //臨時の配列の要素0~9に 1~10 の数を代入 for (var i:int=0; i<=9; i++) { tmpArr[i] = i + 1; } //臨時の配列のnow1要素を抜きとる tmpArr.splice(now1-1,1); //検証用 trace(now1); trace(tmpArr); //今のデータ2を作成 var rnd:int = Math.floor(Math.random() * tmpArr.length); var now2:int = tmpArr[rnd]; //検証用 trace(rnd); trace(now2); //---ボタンクリック時--- //ボタン1 クリック btn1.addEventListener(MouseEvent.CLICK, btn1Click); //ボタン1 クリック時の動作 function btn1Click(evt:MouseEvent):void { //今のデータ1を過去のデータ1に代入 past1 = now1; //臨時の配列を初期化 tmpArr = new Array(); //臨時の配列の要素0~9に 1~10 の数を代入 for (var i:int=0; i<=9; i++) { tmpArr[i] = i + 1; } //臨時の配列のpast1要素を抜きとる tmpArr.splice( past1-1,1); //臨時の配列のnow2要素を抜きとる for (i=0; i<=tmpArr.length-1; i++) { if (tmpArr[i] == now2) { tmpArr.splice( i,1); } } //今のデータ1を作成 rnd = Math.floor(Math.random() * tmpArr.length); now1 = tmpArr[rnd]; //今のデータ1を表示 txt1.text = String(now1); } //ボタン2 クリック btn2.addEventListener(MouseEvent.CLICK, btn2Click); //ボタン2 クリック時の動作 function btn2Click(evt:MouseEvent):void { //今のデータ2を過去のデータ2に代入 past2 = now2; //臨時の配列を初期化 tmpArr = new Array(); //臨時の配列の要素0~9に 1~10 の数を代入 for (var i:int=0; i<=9; i++) { tmpArr[i] = i + 1; } //臨時の配列のpast2要素を抜きとる tmpArr.splice( past2-1,1); //臨時の配列のnow1要素を抜きとる for (i=0; i<=tmpArr.length-1; i++) { if (tmpArr[i] == now1) { tmpArr.splice( i,1); } } //今のデータ2を作成 rnd = Math.floor(Math.random() * tmpArr.length); now2 = tmpArr[rnd]; //今のデータ2を表示 txt2.text = String(now2); } ---------------------------------- コードは長くてややこしいですが している内容は単純なことです↓。

yoyoyoiyoi
質問者

お礼

これ1週間近く悩んだんですよね... ありがとうございます、これで100%かぶらない乱数の取得の仕方がわかりました。 ↓この辺の処理の仕方がとても参考になりました。 //今のデータ2を過去のデータ2に代入 past2 = now2; //臨時の配列を初期化 tmpArr = new Array(); //臨時の配列の要素0~9に 1~10 の数を代入 for (var i:int=0; i<=9; i++) {  tmpArr[i] = i + 1; } //臨時の配列のpast2要素を抜きとる tmpArr.splice(past2-1,1); //臨時の配列のnow1要素を抜きとる for (i=0; i<=tmpArr.length-1; i++) {  if (tmpArr[i] == now1) {   tmpArr.splice(i,1);  } } でこの処理を一つの関数にすればソースすっきりできるのではないかと思い以下のようにしてみましたが変数の値が保存されません。やはり関数に変数の値を渡す場合値が保存されないのでようか? function btnClickAction(aaa:int,bbb:int,ccc:int,txt:TextField,ddd:int):void { var past:int=aaa; var now:int=bbb; var nowPartner:int=ccc; var txtArea:TextField=txt; var max:int=ddd; past=now; //臨時の配列を初期化 var tmpArr:Array=new Array ; //臨時の配列の要素0~9に数を代入 for (var i:int=0; i<=max-1; i++) { tmpArr[i]=i+1; } //臨時の配列のpast要素を抜きとる tmpArr.splice(past-1,1); //臨時の配列のpartPartner要素を抜きとる for (i=0; i<=tmpArr.length-1; i++) { if (tmpArr[i]==nowPartner) { tmpArr.splice(i,1); } } //今のデータを作成 var rnd:int=Math.floor(Math.random()*tmpArr.length); now=tmpArr[rnd]; //今のデータを表示 txtArea.text=String(now); } にして btn1.addEventListener(MouseEvent.CLICK, btn1Click); function btn1Click(evt:MouseEvent):void {  btnClickAction(past1,now1,now2,txt1,10); } とするとpast1,now1,now2の値が保存されないのです?なぜでしょうか?

その他の回答 (1)

  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.1

回答字数制限にひっかかるため回答を2つに分けます。 ◎ 回答 【その1】 良くわからない条件がいくつかあります。 場合場合によって 1つ1つは回答できないので まず条件を1つに固定しておきます。 ・ 条件1 「前回と同じ数字」の「前回」とは テキスト1ならテキスト1のみの前回を意味し テキスト2ならテキスト2のみの前回を意味するものとします。 つまり 次のようになることは有り得ないものとしますが,  1回目…テキスト1=1,テキスト2=2  2回目…テキスト1=3,テキスト2=2  1回目…テキスト1=1,テキスト2=2  2回目…テキスト1=3,テキスト2=3 次のようになることは有り得るものとします。  1回目…テキスト1=1,テキスト2=2  2回目…テキスト1=2,テキスト2=1 ・ 条件2 ボタンがクリックされる順は決まっていなくて さらに 同じボタンを連続でクリックされる場合もあるものとします。 つまり ボタンクリック順としては ボタン1クリック → ボタン2クリック も ボタン2クリック → ボタン1クリック も ボタン1クリック → ボタン1クリック → ボタン2クリック も有り得るものとします。 あと テキスト1 と テキスト2 にはそれぞれ 「txt1」と「txt2」というインスタンス名を付けたとし, ボタン1 と ボタン2 にはそれぞれ 「btn1」と「btn2」というインスタンス名を付けたとします。 以上のような場合であるものとして テキストやボタンが存在するフレームに書くスクリプト例を 回答 【その2】 に書きます。  

関連するQ&A

  • ActionScript3で乱数を取得しなおかつ隣とかぶらない続き

    ActionScript3で乱数を取得しなおかつ隣とかぶらない続き 以前この質問をさせてもらったのですが、http://okwave.jp/qa/q6030004.html 前回の答えを少しステップアップを目的に処理を一つの関数にすればソースがすっきりできるのではないかと思い以下のようにしてみましたが変数の値が保存されません。 (前回のページを参照:http://okwave.jp/qa/q6030004.html) function btnClickAction(aaa:int,bbb:int,ccc:int,txt:TextField,ddd:int):void { var past:int=aaa; var now:int=bbb; var nowPartner:int=ccc; var txtArea:TextField=txt; var max:int=ddd; past=now; //臨時の配列を初期化 var tmpArr:Array=new Array ; //臨時の配列の要素0~9に数を代入 for (var i:int=0; i<=max-1; i++) { tmpArr[i]=i+1; } //臨時の配列のpast要素を抜きとる tmpArr.splice(past-1,1); //臨時の配列のpartPartner要素を抜きとる for (i=0; i<=tmpArr.length-1; i++) { if (tmpArr[i]==nowPartner) { tmpArr.splice(i,1); } } //今のデータを作成 var rnd:int=Math.floor(Math.random()*tmpArr.length); now=tmpArr[rnd]; //今のデータを表示 txtArea.text=String(now); } にして btn1.addEventListener(MouseEvent.CLICK, btn1Click); function btn1Click(evt:MouseEvent):void {  btnClickAction(past1,now1,now2,txt1,10); } とするとpast1,now1,now2の値が保存されないのです、やはりこの処理は一つの関数にはできないのでしょか? ■制作環境 FlashCS4 ActionScript3

    • ベストアンサー
    • Flash
  • 乱数

    乱数を発生させる際に Sub Sample() Debug.Print Int((10 - 1 + 1) * Rnd + 1) End Sub で、1から10までの乱数を発生できますが、 1から10と言う連続した数字ではなく、 例えば10,13,18,43・・・ という規則性のない複数の数字からランダムに数字を発生させるにはどうすればいいでしょうか? 10,13,18,43の中から10を返したり、18を返したりする方法を教えてください。

  • ActionScriptが適用されません。。。

    使用環境 MacOS X 10.4.11 で FlashMX 2004 Pro と体験版のCS3をインストールしてあります。flashの勉強と思い参考書に従って制作しているのですが、MX2004、CS3どちらにしてもActionScriptの記述内容だけが反映されないんです。flaサンプルつきの参考書なので間違いなどはない状態です。ただサンプルをMX2004、CS3のどちらで開いてもそちらはちゃんとプレビューされるのです。新規に一から作成したもののみが全く反映されていない状態です。何が問題なのかわかる方助けて下さい。お願いします。

  • C#の乱数取得について

    C#の乱数取得について カテ違いですが、C#のカテゴリがないのでここで質問させていただきます。 C#の乱数取得について調べましたところ以下のプログラムサンプルを見つけました。 1| int seed = Environment.TickCount; 2| string s = ""; 3| 4| for (int i = 0; i < 10; i++){ 5| Random r = new Random(seed++); 6| for (int j = 0; j < 5; j++){ 7| s += r.Next(50).ToString("00") + " "; 8| } 9| s += Environment.NewLine; 10| } 11| this.textBox1.Text = s; C#は勉強し始めたばかりで、まだまだ知識不足なのでこのプログラムが理解できません。 今の自分の知識で考えたことは、 1行目、int型のseedに、C#の乱数を生成するときにデフォルトで設定されるseed値を格納。 2行目、stringクラスのsを定義。 5行目、Random型(?)rにseedを設定 7行目、わかりません。。乱数を取得してることはわかるのですが。 9行目、sに保持。 11行目、GUIに表示。 どなたか、詳しく解説していただけると助かります。 よろしくおねがいします。

  • FlashのActionScriptについて質問です。

    FlashのActionScriptについて質問です。 Flash CS4のAS2.0を使用 ActionScriptの書き方で (1)ボタンインスタンスに書く (2)対象のインスタンスのフレームに書く (3)ActionScript専用のフレームを作成しそこへ書く 参考書等を読んでいるとActionScriptを書くときに、上記3つの方法が あり混乱しています。 それぞれ、どのような違いがあるのでしょうか?また、どのように使い分けるのでしょうか? Flashに関しては、始めたばかりの超初心者です。どうぞ宜しくお願いします。

  • ActionScript3.0のスクリプトの書き方

    Flash CS5を使ってWebページへのリンクボタンをつくりました。on (press)状態でリンクさせたいのですが、ActionScript3.0でのスクリプトの書き出し方がわかりません。よろしくお願いします。

  • FlashのActionScriptについて

    FlashのActionScriptについて Flash CS4(AS2.0)を使用 Flashに関しては初心者で、色々な参考書を見ている中で、 AkutionScriptの書き方に色々なパターンがあって分からなくなりました。 アクションを書き込む際、 (1)専用のActionScriptのフレームを作成してそこに書く (2)ボタンインスタンスに書く (3)対象のシンボルのフレームに書く 上記3つの方法はそれぞれどのような違いがあるのでしょうか?又、どのようにして 使い分けするのでしょうか?

  • Flash ActionScriptで画像の読み込み

    Flashでトランプゲームを作ろうと思っているのですが、カード一つ一つシンボルに入れると容量が大きくなるので、画像を読み込もうと思いました。 が、読み込み方法が良くわかりません。 ActionScriptならこういうのがあると思ってネットで色々調べてみたのですが、しっくりとしたサンプルがなかったのでここに書き込みました。 使っているソフトはAdobe Flash CS3 Professionalです。

    • ベストアンサー
    • Flash
  • 乱数を使う

    お世話になっております。 乱数についての質問なんですが、 なんと説明して良いのかわからないので例を挙げます。 コマンドボタンを三つ用意する。 コマンドボタン1をクリックすると、1~3までのランダムな値を表示する。 続けてコマンドボタン2をクリックすると、 先ほど表示した数字以外の1~3までの値を返す。 同様にコマンドボタン3をクリックすると最後に残った数字を表示する。 ってなことがやりたいんですが、 アドバイスお願いします。 あ、あとコマンドボタンを1回クリックすると もう2度とクリックできないようにするなんて事は出来るんですか?

  • actionscript 3.0 勉強中のもです。

    flash cs5 を使ってます。asファイルを記述して、それをactionscriptに読み込ませる方法は知っているのですが、 例えば 複数のasファイルを読み込ませる場合はどのようにすればいいのでしょうか?最近参考にさせていただいたサンプルファイルには.flash x1のものと.as x3があり、しかしながら、actionscript3.0の記述画面ではプロパティーを見てみるとasを埋め込む場所(「クラス:」と書いてあるところ)には1つしかasファイルを記述できず、その他のasファイルをどのように関連付けさせるのか全くわかりません。これらはどのように記述すればよろしいのでしょうか。少しでもお心当たりございましたら是非よろしくお願いします。

    • ベストアンサー
    • Flash

専門家に質問してみよう