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

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     forを使った条件分岐
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
ニューライス
Åê¹ÆNo.34151
投稿日時: 2007-7-14 22:29
常連
居住地:
投稿: 81
使用環境:
MacOSX(10.4.2)
Flash8
forを使った条件分岐
こんにちわニューライスです。

for文を組み合わせて、下記のようなものを考えていますがうまく結果が返ってこず、思った結果にならず困り果てています。

まず、配列cateAllにはすべてのムービークリップが格納されています。
次に、配列cate1には配列cateAllの一部のムービークリップが格納されています。


var cate1:Array = [ _root._mc0 , _root._mc3];
var cateAll:Array = [ _root._mc0, _root._mc1, _root._mc2, _root._mc3];


function xTargetArray( aTarget:Array ){
	for ( var i = 0 ; i < cateAll.length ; i++ ){
		for(var j = 0 ; j < aTarget.length ; j++){
			if( cateAll[i] == aTarget[j] ){
				trace(  "OK"+ aTarget[j] );
			} else { 
			trace(  "NG"+ cateAll[i] );
			}
		}
	}
}

xTargetArray( cate1);


やりたい処理としては
cateAllにある値の中でcate1の値に該当するものはAの処理。
cate1の値に該当しないものはBの処理。といった条件分岐をしたいと考えております。

作っていたら訳がわからなくなり、困りはててこのフォーラムへアクセスしていました。

どなたかおわかりでしたらお知恵を貸してください!!




野中文雄
Åê¹ÆNo.34152
投稿日時: 2007-7-14 22:58
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: forを使った条件分岐
引用:
ニューライスさんは書きました:
まず、配列cateAllにはすべてのムービークリップが格納されています。
次に、配列cate1には配列cateAllの一部のムービークリップが格納されています。
var cate1:Array = [ _root._mc0 , _root._mc3];
var cateAll:Array = [ _root._mc0, _root._mc1, _root._mc2, _root._mc3];
/*
function xTargetArray( aTarget:Array ){
	for ( var i = 0 ; i < cateAll.length ; i++ ){
		for(var j = 0 ; j < aTarget.length ; j++){
			if( cateAll[i] == aTarget[j] ){
				trace(  "OK"+ aTarget[j] );
			} else { 
			trace(  "NG"+ cateAll[i] );
			}
		}
	}
}
*/
function xTargetArray(aTarget:Array):Void {
	var nLength:Number = cateAll.length;
	var oExisting:Object = xGetEvaluationObject(aTarget);
	for (var i:Number = 0; i<nLength; i++) {
		var _mc:MovieClip = cateAll[i];
		if (oExisting[_mc]) {
			trace("OK"+_mc);
		} else {
			trace("NG"+_mc);
		}
	}
}
xTargetArray(cate1);
function xGetEvaluationObject(_array:Array):Object {
	var returnObject:Object = new Object();
	var nLength:Number = _array.length;
	for (var i:Number = 0; i<nLength; i++) {
		returnObject[_array[i]] = true;
	}
	return returnObject;
}

やりたい処理としては
cateAllにある値の中でcate1の値に該当するものはAの処理。
cate1の値に該当しないものはBの処理。といった条件分岐をしたいと考えております。


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

ニューライス
Åê¹ÆNo.34158
投稿日時: 2007-7-16 0:58
常連
居住地:
投稿: 81
使用環境:
MacOSX(10.4.2)
Flash8
Re: forを使った条件分岐
野中さん、ありがとうございます。
自分では絶対に考えつかない考え方で「さすが」と驚かされるばかりです‥。

ただ、やはり考え方の部分で「なぜ?なぜ?」の疑問が出てきます。

処理の流れとしては

1.cate1に含まれるMovieClipをreturnObjectに配列として格納
2.oExistingにreturnObjectを代入
3.配列cateAllの値をoExistingと比較する
4.Booleanで条件分岐

で問題はないでしょうか?
分からない部分は2点あります。

1.oExistingオブジェクトの構造。どのようにMovieClipとtrueが格納されているか。
2.xTargetArrayメソッド内にある、if (oExisting[_mc]) {の部分の判定方法。
cateAllとcate1は「そうあたり」で判定をすることになると思うのですがそれがどのように判定されているのかが今ひとつ描けません。

手元にある参考書などでObjectを調べてみましたが、基本的な定義しか書かれておらず今ひとつ今回の処理とつながりません。

なにか参考になるリンクでもよいので、教えていただけるとありがたいです。
お手数をかけますが、もう一歩踏み込んで理解したいと思います。
野中文雄
Åê¹ÆNo.34159
投稿日時: 2007-7-16 2:04
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: forを使った条件分岐
以下のような問題が、たくさんあったとしましょう。

[問題]つぎのうち、野菜はどれか。すべて答えなさい。
(a)りんご、(b)トマト、(c)みかん、(d)スイカ、(e)大根

たとえば、解答者の選択は、つぎの配列solver_arrayに格納します。
var solver_array:Array = ["a", "b", "e"];

そして正解は、配列answer_arrayに設定しておきます。
var answer_array:Array = ["b", "d", "e"];

正誤判定は、つぎの処理で行うことができます。正解だったらtrue、不正解ならfalseが[出力]されます。
trace(xIsCorrectAnswer(solver_array, answer_array));  // 出力: false
function xIsCorrectAnswer(test_array:Array, correct_array:Array):Boolean {
	var nLength:Number = correct_array.length;
	if (test_array.length != nLength) {
		return false;
	}
	var oExisting:Object = xGetEvaluationObject(correct_array);
	for (var i:Number = 0; i<nLength; i++) {
		if (!oExisting[test_array[i]]) {
			return false;
		}
	}
	return true;
}

変数oExistingの内容は、以下のようになります。

[デバッグ] > [変数のリストアップ]より引用:
変数 _level0.oExisting = [オブジェクト #5, クラス 'Object'] {
  b:true,
  d:true,
  e:true
 }

引用:
ニューライスさんは書きました:
1.oExistingオブジェクトの構造。どのようにMovieClipとtrueが格納されているか。
2.xTargetArrayメソッド内にある、if (oExisting[_mc]) {の部分の判定方法。
cateAllとcate1は「そうあたり」で判定をすることになると思うのですがそれがどのように判定されているのかが今ひとつ描けません。


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

ニューライス
Åê¹ÆNo.34185
投稿日時: 2007-7-18 0:12
常連
居住地:
投稿: 81
使用環境:
MacOSX(10.4.2)
Flash8
Re: forを使った条件分岐
野中さんありがとうございます。
本当に勉強になります。

正誤判定を理解するためにはもう少し、時間が必要みたいですが、もう少し理解できるまでいろいろtraceして、処理を具体的にみさせてもらいたいと思います。

取り急ぎ、ありがとうございました!!

野中文雄
Åê¹ÆNo.34190
投稿日時: 2007-7-18 4:27
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: forを使った条件分岐
つぎの処理が理解できればよいのではないかと思われます。
var oRightAnswer:Object = {a:true};
var answer0_str:String = "a";
var answer1_str:String = "b";
var bResult:Boolean;
bResult = oRightAnswer[answer0_str];
trace(bResult);  // 出力: true
bResult = oRightAnswer[answer1_str];
trace(bResult);  // 出力: false

引用:
ニューライスさんは書きました:
正誤判定を理解するためにはもう少し、時間が必要みたいですが、もう少し理解できるまでいろいろtraceして、処理を具体的にみさせてもらいたいと思います。


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

ニューライス
Åê¹ÆNo.34281
投稿日時: 2007-7-21 17:47
常連
居住地:
投稿: 81
使用環境:
MacOSX(10.4.2)
Flash8
Re: forを使った条件分岐
野中さんありがとうございます。

教えていただいたサンプルは、oRightAnswerの値ひとつに
対して、ひとつの判定対象をいれているので理解ができました。

私が一番理解ができてない部分は、oRightAnswer[判定対象]を
実行したとき、、oRightAnswer内に複数値が入っていたときの
処理内容が理解できていないようです。

例えば、
oRightAnswerに3つの正解が入っていたとします。
そこにoRightAnswer[判定対象]を一回実行したときに行われる
処理は「そうあたり」で調べているということで
よいのでしょうか?

****************************************************

例:
var oRightAnswer:Object = {a:true, c:true ,d:true};
var answer0_str:String = "a";

var bResult:Boolean;
bResult = oRightAnswer[answer0_str];※

※bResult = oRightAnswer[answer0_str];を実行したときの
 処理の流れ

answer0_str → oRightAnswer[a:true] → true
answer0_str → oRightAnswer[c:true] → false
answer0_str → oRightAnswer[d:true] → false

⇒answer0_strとoRightAnswerの値を比較したときに
 trueのものがあるためbResultにtrueを返す


****************************************************

という解釈でよいのでしょうか?
なんだかその点がはっきり理解できていません。

何度も何度もすみません‥
野中文雄
Åê¹ÆNo.34283
投稿日時: 2007-7-21 18:37
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: forを使った条件分岐
ご質問の意味が理解しにくいのですが、おそらく「『そうあたり』で調べている」というご理解とは違っている感じがします。以下の、結果はおわかりになりますか?
var oRightAnswer:Object = {a:true, c:1 ,d:"string"};
trace(oRightAnswer["a"]);
trace(oRightAnswer["b"]);
trace(oRightAnswer["c"]);
trace(oRightAnswer["d"]);

引用:
ニューライスさんは書きました:
例えば、
oRightAnswerに3つの正解が入っていたとします。
そこにoRightAnswer[判定対象]を一回実行したときに行われる
処理は「そうあたり」で調べているということで
よいのでしょうか?

****************************************************

例:
var oRightAnswer:Object = {a:true, c:true ,d:true};
var answer0_str:String = "a";

var bResult:Boolean;
bResult = oRightAnswer[answer0_str];※

※bResult = oRightAnswer[answer0_str];を実行したときの
 処理の流れ

answer0_str → oRightAnswer[a:true] → true
answer0_str → oRightAnswer[c:true] → false
answer0_str → oRightAnswer[d:true] → false

⇒answer0_strとoRightAnswerの値を比較したときに
 trueのものがあるためbResultにtrueを返す


****************************************************


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

ニューライス
Åê¹ÆNo.34284
投稿日時: 2007-7-21 19:21
常連
居住地:
投稿: 81
使用環境:
MacOSX(10.4.2)
Flash8
Re: forを使った条件分岐
野中さん、ありがとうございます。
ようやく理解できてきました!

ひとつの解答を基準にして、「正解」の値全部と
一つづつ比較してtrue or falseを判定するものと
ずっと思い込んでいました。

**************************************

a:true       c:true   d:true
  |     |    |     |
 "a"   "b"   "c"   "d"
  |     |    |     |
true  undefind  true   true

**************************************

上記のように判定しているということですね。
ようやく理解できました。

この仕組みをつかって、trueかそれ以外かで
処理を分けるということですね。
理解するまで時間がかかってしまいました‥

野中さん何度もありがとうございました!

PS:「オブジェクト指向で考えるActionScript」購入して
  読み始めました。まだはじめの数ページですが、楽しませて
  もらっています。

スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

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