• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ActionScript3で乱数を取得しなおかつ隣とかぶらない)

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

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

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

  • ベストアンサー
  • 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